# Changelog 本项目的所有重要改动都记录在此文件。 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 ## [Unreleased] ## [0.3.10] - 2026-10-17 适配 DeepSeek Harness 0.2.1:设置页入口在 0.2.1 的类型环境下报 TS7006,并补上 `useWorkspaces` 缺失时的兜底。 ### 修复 - `SettingsCard.tsx`:`useWorkspaces` 的 selector 参数改为显式结构类型 `WorkspacesSnapshotLike`(与同文件 `useSessions` 的既有写法一致)。变更是**纯类型**的,产物逻辑不变。 - `SettingsCard.tsx`:`useWorkspaces` 不再直接调用——宿主没注入这个标准 prop 时回退为空字符串,避免整页抛错。 ### 说明 - 根因不在内核 API:`@deepseek-ai/dsh-client-runtime@0.1.1` 的 `.d.ts` 引用了未随包发布的 `../workspaces/service.ts`,`skipLibCheck` 把它降级成 `any`,到调用点就是隐式 any。 - 仍兼容 0.1.x / 0.2.0 / 0.2.1 三个运行时;`devDependencies` 未改(CI 用 pnpm 10 + `--frozen-lockfile`)。 ### 验证 - `tsc --noEmit`(按 0.2.1-rc.2 的内核类型):通过 - `pnpm build`(tsc → tsdown → wrap-client):通过,`lib/client.js` 已重建 - `pnpm test`:12/12 通过 ## [0.3.9] - 2026-10-12 前端改版:卡片行(方案 A)。功能、接口与路由一律不变,只动视觉与少量 DOM。 ### 变更 - **行即卡片**:每行独立卡片(淡边框 + hover 微抬升),左侧 34px 类别色图标槽(技能靛蓝 / MCP 蓝 / 指令琥珀); 分组头由 `用户级 (9)` 改为「组名 + 计数徽标 + 延伸线」。 - **真开关**:技能与 MCP 的启停从「复选框 + 启用二字」换成 `button[role=switch]` 开关控件(保留 `aria-checked`)。 - **删除降级**:默认红字弱化、hover 才给红底,让一行里只留一个视觉重点。 - **状态 pill**:来源 / 会被读取 / 缺失 统一为 pill,附 `badgeOk / badgeDim / badgeWarn` 三态。 - **主题无关**:强调色用 `light-dark()` 跟随深浅色、卡片填充走半透明叠加、文字统一 `currentColor` —— 宿主用哪套主题都不需要额外分支。 - 输入框补 focus 环;详情块与等宽正文重新排版。 ### 说明 - `slotText()` 生成图标槽文字:带点/短横的名字取前两段首字母(`AGENTS.local.md` → `AL`),普通名取前 2 字符(`k8s-fta-skill` → `K8`),中文名取首字。 - 列表是平铺渲染(没有包裹元素),行间距用邻接选择器 `.row + .row` 给,不动 DOM 结构。 - 宿主半 `lib/index.js` 无改动,改动全部落在客户端产物 `lib/client.js`(样式内联进 bundle)。 - 顺手修正 README 里 0.3.7 之后的过时描述(指令文件那节仍写着「编辑」)。 ### 验证 - `pnpm typecheck` 通过;`node --test` 12/12;产物含 `iconSlot` / `slotText` / `light-dark` / `role="switch"`。 - 真实宿主界面已人工确认。 ## [0.3.8] - 2026-10-12 宿主依赖守护清单收窄到真实运行时导入。 ### 变更 - `scripts/fix-host-deps.mjs` 的 `HOST_DEPS` 由 `['dsh-mcp-client', 'dsh-settings']` 收成 `['dsh-mcp-client']`。 依据是**构建产物**而不是 manifest:`lib/index.js` 里唯一的值导入就是它;`dsh-settings` 的导入在内核改为 「设置从插件自身 Config schema 派生」(0.10.0)时就被删掉了,清单里那条属于遗留。口径写进脚本注释: `import type` 一律不算(构建期擦除),只认打包后的真实 import。 - README / AGENTS.md 同步,不再表述为「这两个条目」。 ### 说明 - 安装目录里已存在的那条 `@deepseek-ai/dsh-settings` 内核链接不删也不动:脚本不再校验它,它仍指向内核,留着无害。 ### 验证 - 安装副本裸跑 `--check` → 只校验 `dsh-mcp-client`,exit 0; - 全新目录裸跑 → 只建立 1 条 junction,再 `--check` 通过; - 开发树(`node_modules` 是 pnpm 副本)→ 报 1 条遮蔽、exit 1。 ## [0.3.7] - 2026-10-12 指令文件页签的「编辑」改成「详情」。 ### 修复 - **「编辑」点了没反应**:该按钮把 textarea 追加在整页**最底部**,而指令文件列表一长(用户级 + 项目根 + 逐级目录), 点击后视口里没有任何变化,看起来像坏了。实测接口 `POST /api/dsh-skills-mcp/instructions/read` 一直返回 200, 问题只在反馈位置,不在读写。 ### 变更 - 指令文件与技能页签统一:存在的文件给 **「详情」**(行内展开、按钮切「收起」,等宽字体显示全文, 带路径 / 字节数与截断提示),就地编辑与「保存」一并删除。 - 「新建」保留(缺失席位仍可创建,动作按钮文案改为「创建」),「删除」不变。 - 服务端两条路由都保留:`instructions/read` 服务详情,`instructions/save` 服务新建。 ## [0.3.6] - 2026-10-12 `scripts/fix-host-deps.mjs` 的内核定位不再依赖环境变量。 ### 变更 - **内核定位分四层**:`DSH_DESKTOP_KERNEL` → `DSH_DESKTOP_ROOT` → **已有宿主依赖链接指向的内核** → **常见安装位置**(Windows `D:\DeepSeek Harness`、`D:\DSH Desktop`、`%LOCALAPPDATA%\Programs\…`、 `C:\Program Files\…`;macOS `/Applications/…`;Linux `~/.local/share/…`)。此前只认前两层, 没设环境变量时脚本直接报 `kernel location unknown` 什么都不做。 - **包管理器存储不会被误当内核**:`link:` 依赖解析出的 `…/node_modules/.pnpm/+/…` 被显式排除; "沿用已有链接"只在该 scope 里**整套宿主依赖都在**时才采用。 - **多内核有提示**:一台机器装了多个壳时(官方 Harness + 社区 Desktop),探测到多个内核会打印一行 note 说明用了哪个、如何用 `DSH_DESKTOP_ROOT` 改选。 ### 验证(本机) - 裸跑(无环境变量、已有链接)→ `--check` 通过、exit 0; - 裸跑(无环境变量、全新目录)→ 自动定位官方壳内核并建立两条 junction,再 `--check` 通过; - 开发树场景(`node_modules` 是 pnpm 副本)→ 正确报 `resolves to …\.pnpm\…, expected …`、exit 1, 不再把 `.pnpm` 目录误报成内核。 ## [0.3.5] - 2026-10-12 适配 **DeepSeek Harness 0.2.0-rc.2(官方壳)**,并入此前只留在本地分支出的一轮改动。 ### 变更 - **peer 范围补 0.2.x**:`peerDependencies` / `devDependencies` 里 11 个 `@deepseek-ai/dsh-*` 依赖由 `^0.1.1-rc.2` 扩为 `^0.1.1-rc.2 || ^0.2.0-rc.1`。此前范围上界不含 0.2.x, 官方壳升到 0.2.0-rc.2 后会被插件管理器的 `incompatible-version` 门禁拦下 (面板显示「异常」,要求对精确版本逐条豁免才肯加载)。修正后无需任何豁免。 - **`scripts/fix-host-deps.mjs` 支持官方壳布局**:内核位置探测新增 `resources/app/dsh/node_modules`(官方壳把内核封在 `app.asar` 的 `dsh/node_modules` 下, dsh-purge 解开 `resources/app` 后存在),旧布局判断不变。 ### 说明 0.3.4 那侧只有技能列表分组顺序,官方壳适配当时停在本地分支未发布; 只装 0.3.4 的话,在 0.2.x 官方壳上会被 `incompatible-version` 拦下。0.3.5 起两者都在。 ### 验证(本机官方壳 0.2.0-rc.2) - 插件管理器 `listBundles` 不再报 `incompatible-version`,条目正常组合; - 宿主半加载后 `/api/dsh-skills-mcp/skills`、`/api/dsh-skills-mcp/mcp` 返回 200, `obsidian` MCP 服务器自动恢复 `status: running`; - `node scripts/fix-host-deps.mjs --check` 通过(两条 junction 指向官方内核 0.2.0-rc.2)。 ## [0.3.4] - 2026-10-11 ### 变更 - **技能列表分组顺序**:技能面板把「用户级」固定在「项目级」之前(此前项目级置顶)。 显示顺序由 `src/client/manager.tsx` 的分组表决定;`src/skills.ts` 的 `listSkills` 排序同步改为 user 优先,使接口返回顺序与界面一致。 ## [0.3.3] - 2026-09-28 适配 **DSH Desktop 0.10.0(内核 0.1.7-rc.2)**。本次发布合并了 0.3.1 → 0.3.3 三轮修复(均未单独发布)。 不配套 0.10.0 的旧版本会在启动阶段直接失败,建议升级到本版本。 ### 修复 - **设置 API 迁移(0.3.1)**:内核不再导出 `installSettingsSection` / `settingsNamespace` (设置改为从插件自身的 Config schema 派生)。原样加载会在 import 阶段抛 `does not provide an export named 'installSettingsSection'`,而启动审计对**任何**未激活条目都会 判定启动失败 → 整个 Harness 起不来、退回插件恢复页。已移除该调用与 `SKILLS_MCP_NAMESPACE`, 两个配置项(`enabled` / `announceToAgent`)改由 `Config` schema 承载,在 「设置 → 插件 → 插件配置」里编辑。 - **项目级作用域(0.3.2)**:两处 `findProjectRoot` 在向上找不到 `.git` 时返回**盘根**, 而内核的规则是回落 **cwd**(`dsh-agent-instructions`:the discovered project root, or `cwd` when no marker exists;`dsh-skill-filesystem` 同)。后果:指令文件把从盘根到 cwd 的每一级目录 都列出来(实测会话在非 git 目录时 28 席 / 7 个目录),项目级技能的根被算成 `<盘>\.dsh\skills` 而永远扫不到项目里的技能。现在与内核一致;显示路径改用 `path.relative()` (旧写法 `slice(root.length + 1)` 在盘根下会把 `Users` 截成 `sers`)。 - **项目目录来源(0.3.3)**:客户端读的是 `useSessions` 快照里**不存在**的 `current` 字段, 选择器恒为空 → 每次都退化成「第一个工作区」,切换会话不跟随。改为内核同款三级来源: 主视图会话(`retainedBy.mainView > 0`)→ 内核持久化的当前会话(`dsh.sessions.current`)→ 首个工作区;并新增顶部「项目目录 / 来源」一行与 **「选择目录…」/「恢复自动」** 手动指定 (存 `localStorage`,切会话即时刷新)。 ### 变更 - `GET /api/dsh-skills-mcp/skills` 与 `…/instructions` 新增 `projectRoot`、`markerFound` 字段 (面板据此显示内核实际解析出的项目根及其依据)。 - `scripts/fix-host-deps.mjs`:内核 `node_modules` 位置改为**按布局探测** (0.10.0 起在 `resources/app.asar.unpacked/node_modules`,旧版在 `resources/app/node_modules`, 并覆盖 macOS 的两种前缀),不再写死旧布局;内核位置仍可用 `DSH_DESKTOP_KERNEL` / `DSH_DESKTOP_ROOT` 指定。 ### 测试 - `node --test` 12 条通过;新增「无 `.git` 标记时项目根 = cwd(内核规则,绝不退化成盘根)」。 ### 文档 - 移除旧版本截图(`docs/screenshot*.webp`),README 不再引用图片。 ## [0.3.0] - 2026-09-20 本项目独立维护后的第一个版本。起点:[zebbkira/dsh-skills-mcp-manager](https://github.com/zebbkira/dsh-skills-mcp-manager) v0.2.0。 ### 新增 - **指令文件维度**:设置页新增「指令文件」页签,管理 DSH 每轮读进上下文的规则文件 —— 用户级 `$DSH_HOME/AGENTS.md`;项目级为 `.git` 项目根到会话 cwd **每一级目录**下的 `AGENTS.md` / `CLAUDE.md` / `AGENTS.local.md` / `CLAUDE.local.md`。 支持查看 / 编辑 / 新建 / 删除;越界路径、非白名单文件名一律拒绝。详见 [docs/instructions.md](docs/instructions.md)。 - `scripts/fix-host-deps.mjs`:**宿主依赖链接守卫**。插件以 link 方式安装时,宿主解析 `@deepseek-ai/dsh-mcp-client`、`@deepseek-ai/dsh-settings` 会先命中插件目录自己的 `node_modules`; 若那里是与内核不同版本的副本,可能导致**应用启动失败**。该脚本把这两个条目指回内核副本 (原条目改名为 `*.before-desktop-repair-<日期>` 留底,**从不删除**);`--check` 只读体检。 - `LICENSE`(MIT,保留起点作者署名)。 - `docs/`:三张 README 截图(Skills / MCP / 指令文件;WebP q90 · 1240px,合计 ~244 KB)与「指令文件」维度说明。 - `.gitattributes`:统一换行与二进制标记。 - `test/instructions.test.mjs` + `pnpm test`:指令文件维度的 11 条测试(纯 Node,不依赖 `@deepseek-ai/*` 包),覆盖席位枚举、读写删往返、越界与非白名单拒绝、超大正文拒绝、以及"发布形态自检"(`@deepseek-ai/*` 必须留在 peerDependencies)。 - `.github/workflows/ci.yml`:CI —— Node 22 与 24 上跑 `install → typecheck → build → test`。 - `AGENTS.md`:贡献者 / AI agent 说明(结构、常用命令、发布纪律、两个必须知道的坑)。 - `package.json`:补 `keywords`、`test` 脚本与 `"./instructions"` 子路径导出;`tsdown` 增加宿主子入口,产出 `lib/instructions.js`(只依赖 Node 内置模块,便于测试与外部引用)。 ### 修复 - **按钮样式退化**:`.btnDanger` / `.btnActive` / `.btnPrimary` 单独使用时缺少基类 `.btn` 的内边距、圆角与 `white-space:nowrap`,按钮退化成浏览器默认样式(窄行里「删除」二字被压成上下两行)。已修 6 处: 删除 ×2、表单 / JSON 活动态 ×2、保存 ×2。 - **项目级技能扫不到当前项目**:`SettingsCard` 通过 `recentWorkspaceId` 定位工作区,而目标内核的工作区快照 没有该字段 → `find` 永远落空 → 退化成"第一个注册的工作区",项目级技能列表恒为空、界面只剩用户级。 改为优先取**当前会话的 `cwd`**,其次工作区列表首项。 - 技能列表下新增 `项目工作区:` 自查行,让"项目级为空"这类问题可自行定位。 ### 变更 - 包名 `@zebbkira/dsh-skills-mcp-manager` → **`@sunlitcrack/dsh-skills-mcp-manager`**; `repository` / `homepage` / `bugs` / `author` 指向本仓库。 - `package.json` 移除 `"./src/*": "./src/*"` 通配符导出 —— `dsh-plugin-standard` 红线 2.1.2 不认通配符导出, 安装 / 注入时会被 MUST 拦截(运行时不使用该入口,`src/` 目录保留)。 - 版本号 `0.2.0` → `0.3.0`。 - `.gitignore` 不再忽略 `lib/`:构建产物随源码提交,`github:` 安装才能拿到入口文件。 - `package.json` 去掉 `postinstall`(对最终用户无意义);`fix:host-deps` / `check:host-deps` 保留给 link 安装的开发者。 ### 说明 - 仓库**同时包含源码与构建产物**(`lib/`,约 125 KB):因此 `dsh plugin --profile web add github:SunlitCrack/dsh-skills-mcp-manager` 可直接安装。 改源码后请跑 `pnpm build`(或只重建产物 `npm run bundle`)并把 `lib/` 一起提交。 - 以 `link:` 方式装进 profile 时,任何依赖安装(`pnpm install` 等)之后请跑一次 `node scripts/fix-host-deps.mjs`,再重启应用。 ## [0.2.0] - 2026-08-23(起点基线) 起点版本,由 [zebbkira](https://github.com/zebbkira) 发布,包含本插件的技能与 MCP 管理能力: - Skills:按项目级 / 用户级分组列表、启停(改写 `SKILL.md` 前言)、详情、从目录导入、搜索过滤。 - MCP:表单 / JSON 新建服务器、测试连接、启停(真实连接与断开)、编辑删除,配置存 `~/.dsh/mcp.json`。 - 通过 `@deepseek-ai/dsh-mcp-client` 挂载真实连接,工具注册为 `mcp____`。 [Unreleased]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/compare/v0.3.9...HEAD [0.3.9]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/releases/tag/v0.3.9 [0.3.8]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/releases/tag/v0.3.8 [0.3.7]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/releases/tag/v0.3.7 [0.3.6]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/releases/tag/v0.3.6 [0.3.5]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/releases/tag/v0.3.5 [0.3.4]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/releases/tag/v0.3.4 [0.3.0]: https://github.com/SunlitCrack/dsh-skills-mcp-manager/releases/tag/v0.3.0