🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

个人工作台 Dely0/dsh-personal-workbench

DeepSeek Harnessv1.17.2
Dely05 天前有提交已提供中文文档扫描:含敏感能力

DSH 个人工作台:日历 + 任务列表 + AI 澄清/拆解/执行/复盘 | Personal workbench…

52.2/100
综合分
45
GitHub 星标
1,095
npm 周下载
—/5
用户评分

数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @dely0/dsh-personal-workbench
npm 源 · @dely0/dsh-personal-workbench 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功(非静态推断);本次验证针对插件 v1.17.1,当前版本为 v1.17.2
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@dely0/dsh-personal-workbench @ 1.17.2
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 09:04:33

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 91 处,展示前 87 条)
  • 写入本地文件
    lib/index.js:175
    mkdirSync(folderPath, { recursive: true });
  • 请求外部主机www.w3.org
    lib/client.js:1282
    `+e.stack}return{value:e,source:t,stack:i,digest:null}}function Ss(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Cs(e,t){tr
  • 请求外部主机www.w3.org
    lib/client.js:1282
    `+e.stack}return{value:e,source:t,stack:i,digest:null}}function Ss(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Cs(e,t){tr
  • 发起网络请求
    lib/client.js:1282
    `+e.stack}return{value:e,source:t,stack:i,digest:null}}function Ss(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Cs(e,t){tr
  • 写入剪贴板
    lib/client.js:1288
    `);n.push((0,a.jsxs)(`div`,{className:`wb-code-block`,children:[(0,a.jsx)(`button`,{type:`button`,className:`wb-btn wb-code-copy`,onClick:()=>{navigat
  • 读取本地文件
    lib/api/localDirRoute.js:43
    const info = await stat(path);
  • 读取本地文件
    lib/api/localDirRoute.js:79
    const info = await stat(dir);
  • 读取本地文件
    lib/api/localDirRoute.js:82
    const dirents = await readdir(dir, { withFileTypes: true });
  • 执行外部命令来自配置/变量
    lib/api/openFileRoute.js:53
    execFile(command, args, { windowsVerbatimArguments: process.platform === 'win32' }, (error) => {
  • 读取本地文件
    lib/api/openFileRoute.js:103
    const info = await stat(filePath);
  • 读取本地文件
    lib/api/routes.js:38
    const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
  • 读取本地文件
    lib/api/routes.js:57
    const info = JSON.parse(readFileSync(new URL('../../lib/build-info.json', import.meta.url), 'utf8'));
  • 写入本地文件
    lib/api/routes.js:194
    mkdirSync(path, { recursive: true });
  • 写入本地文件
    lib/db/database.js:58
    mkdirSync(dirname(dbPath), { recursive: true });
  • 发起网络请求
    lib/reminder/weixin-status.js:15
    const response = await route.fetch(new Request(`http://127.0.0.1${WEIXIN_RPC_PATH}`, {
  • 读取本地文件
    lib/experts/catalog.js:183
    entries = readdirSync(pendingDir);
  • 读取本地文件
    lib/experts/catalog.js:191
    raw = readFileSync(join(pendingDir, name, EXPERT_INSTALL_JOURNAL_FILE_NAME), 'utf8');
  • 读取本地文件
    lib/experts/service.js:277
    raw = readFileSync(methodologyAssetPath(), 'utf8');
  • 删除本地文件递归
    lib/experts/service.js:445
    rmSync(target, { recursive: true, force: true });
  • 写入本地文件
    lib/experts/service.js:462
    mkdirSync(root, { recursive: true });
  • 读取本地文件
    lib/experts/skill-provider.js:113
    return { entries: readdirSync(deps.skillsDir, { withFileTypes: true }), complete: true };
  • 读取本地文件
    lib/experts/skill-provider.js:136
    return lstatSync(join(dir, entry.name)).isSymbolicLink();
  • 读取本地文件
    lib/experts/skill-provider.js:157
    entries = readdirSync(absolute, { withFileTypes: true });
  • 读取本地文件
    lib/experts/skill-provider.js:192
    const stats = statSync(filePath);
  • 读取本地文件
    lib/experts/skill-provider.js:197
    const buffer = readFileSync(filePath);
  • 读取本地文件
    lib/api/routes/knowledge.js:28
    const info = await stat(filePath);
  • 读取本地文件
    lib/api/routes/knowledge.js:31
    const content = await readFile(filePath, 'utf8');
  • 读取本地文件
    lib/review-memory.js:84
    return existsSync(options.home ?? memoryHome(env));
  • 写入本地文件
    lib/review-memory.js:147
    writeFileSync(tmp, text, 'utf8');
  • 写入本地文件
    lib/review-memory.js:148
    renameSync(tmp, file);
  • 写入本地文件
    lib/review-memory.js:153
    mkdirSync(notesDir, { recursive: true });
  • 读取本地文件
    lib/review-memory.js:160
    readFileSync(file);
  • 写入本地文件
    lib/review-memory.js:194
    mkdirSync(queueDir, { recursive: true });
  • 读取本地文件
    lib/review-memory.js:210
    return JSON.parse(readFileSync(join(queueDir, name), 'utf8'));
  • 读取本地文件
    lib/review-memory.js:240
    return readdirSync(dir);
  • 写入本地文件
    lib/review-memory.js:328
    mkdirSync(join(home, 'notes'), { recursive: true });
  • 读取本地文件
    lib/workspace-check.js:65
    if (existsSync(candidate)) {
  • 读取本地文件
    lib/workspace-check.js:76
    if (!statSync(existing).isDirectory()) {
  • 读取本地文件
    lib/workspace-check.js:84
    accessSync(existing, constants.W_OK);
  • 读取本地文件
    lib/personas/library.js:94
    if (lstatSync(realRoot).isSymbolicLink()) {
  • 读取本地文件
    lib/personas/library.js:98
    if (lstatSync(realRoot).isDirectory() === false) {
  • 读取本地文件
    lib/personas/library.js:124
    entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    lib/personas/library.js:146
    isLink = lstatSync(full).isSymbolicLink();
  • 读取本地文件
    lib/personas/library.js:255
    size = lstatSync(path).size;
  • 读取本地文件
    lib/personas/library.js:272
    raw = readFileSync(path, 'utf8');
  • 读取本地文件
    lib/experts/paths.js:252
    chain.push({ path: current, stats: lstatSync(current) });
  • 读取本地文件
    lib/experts/paths.js:260
    chain.push({ path: current, stats: lstatSync(current) });
  • 读取本地文件
    lib/experts/paths.js:298
    rootIsLink = lstatSync(resolvedRoot).isSymbolicLink();
  • 写入本地文件
    lib/experts/paths.js:418
    mkdirSync(path);
  • 读取本地文件
    lib/experts/paths.js:426
    stats = lstatSync(path);
  • 写入本地文件
    lib/experts/paths.js:481
    mkdirSync(dirname(target), { recursive: true });
  • 读取本地文件
    lib/experts/paths.js:499
    if (lstatSync(target).isSymbolicLink()) {
  • 删除本地文件
    lib/experts/paths.js:500
    unlinkSync(temporary);
  • 删除本地文件
    lib/experts/paths.js:504
    unlinkSync(temporary);
  • 写入本地文件
    lib/experts/paths.js:513
    renameSync(temporary, target);
  • 删除本地文件
    lib/experts/paths.js:524
    unlinkSync(temporary);
  • 读取本地文件
    lib/experts/paths.js:556
    raw = readFileSync(lockPath, 'utf8');
  • 写入本地文件
    lib/experts/paths.js:617
    mkdirSync(dirname(lockPath), { recursive: true });
  • 写入本地文件
    lib/experts/paths.js:618
    writeFileSync(lockPath, JSON.stringify(owner), { encoding: 'utf8', flag: 'wx' });
  • 删除本地文件
    lib/experts/paths.js:640
    unlinkSync(lockPath);
  • 删除本地文件
    lib/experts/paths.js:687
    rmSync(lockPath, { force: true });
  • 读取本地文件
    lib/experts/drafts.js:513
    stats = lstatSync(join(root, relativePath));
  • 读取本地文件
    lib/experts/drafts.js:527
    const bytes = readFileSync(join(root, relativePath));
  • 读取本地文件
    lib/experts/drafts.js:614
    if (lstatSync(target).isFile() === false)
  • 读取本地文件
    lib/experts/drafts.js:616
    current = readFileSync(target);
  • 删除本地文件
    lib/experts/drafts.js:625
    unlinkSync(target);
  • 删除本地文件
    lib/experts/drafts.js:736
    unlinkSync(target);
  • 读取本地文件
    lib/experts/drafts.js:840
    stats = lstatSync(join(root, relative));
  • 读取本地文件
    lib/experts/install.js:233
    entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    lib/experts/install.js:537
    stats = lstatSync(absoluteJoin(root, name));
  • 读取本地文件
    lib/experts/install.js:576
    const stats = lstatSync(absoluteJoin(personaRoot, personaDirectory));
  • 删除本地文件递归
    lib/experts/install.js:752
    rmSync(assertScratchInsideRoot(root, scratchRelative), { recursive: true, force: true });
  • 写入本地文件
    lib/experts/install.js:776
    mkdirSync(scratchAbsolute, { recursive: true });
  • 写入本地文件
    lib/experts/install.js:792
    mkdirSync(dirname(target), { recursive: true });
  • 读取本地文件
    lib/experts/install.js:796
    lstatSync(target);
  • 写入本地文件
    lib/experts/install.js:807
    renameSync(scratchAbsolute, target);
  • 读取本地文件
    lib/experts/install.js:888
    lstatSync(target);
  • 删除本地文件
    lib/experts/install.js:902
    unlinkSync(target);
  • 读取本地文件
    lib/experts/install.js:912
    isDirectory = lstatSync(target).isDirectory();
  • 删除本地文件递归
    lib/experts/install.js:957
    rmSync(target, { recursive: true, force: true });
  • 读取本地文件
    lib/personas/resources.js:91
    if (lstatSync(current).isSymbolicLink())
  • 读取本地文件
    lib/personas/resources.js:155
    const stat = statSync(realFile);
  • 读取本地文件
    lib/personas/resources.js:168
    bytes = readFileSync(realFile);
  • 读取本地文件
    lib/personas/resources.js:201
    if (lstatSync(rootPath).isSymbolicLink()) {
  • 读取本地文件
    lib/personas/resources.js:219
    entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    lib/personas/resources.js:232
    isLink = lstatSync(full).isSymbolicLink();
  • 发起网络请求
    lib/client/api.js:44
    return await fetch(path, init);
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
涉及外部主机:www.w3.org

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-commands@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/cordis-plugin-timer@deepseek-ai/dsh-llm@deepseek-ai/dsh-scope
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

4 张 · 点击查看大图

功能亮点

  • 日历与任务列表
  • AI澄清任务
  • AI拆解执行复盘

DSH 个人工作台:日历 + 任务列表 + AI 澄清、拆解、执行、复盘 | 给 DeepSeek Harness Web 用的个人工作台:日历 + 任务列表 + AI 助手

v1.17.22026-10-29内容较长已截断
· v1.17.2 Release Notes 主题:两处「点开就废」的可用性缺陷 —— 面板里的模型选择器一个模型都列不出来(issue #19)、 「AI 执行」弹窗拿不到「开始」(issue #17) 上一个稳定点:v1.17.1 版本号 1.17.2(package.json / tag / npm / GitHub Release 四者一致)。 发布日期:2026-10-29 · 0. 范围表(动版本号之前先填) | 列 | 内容 | |---|---| | 本版主题 | 两处「进了弹窗/打开菜单就废」的可用性缺陷:① 工作台面板里的模型选择器一个模型都列不出来(DSH 0.2.1-rc.3 上先报 ui-model-selection: session "…" resolved no scope,补掉之后首次建目录再报 cannot get property "remote.session" without inject);② 「AI 执行 → 补充 AI 提示词」弹窗在 1080p / 150% 缩放下高于视口,底部「取消 / 开始」被推到屏幕外,整页滚动也救不回来 —— 执行会话从未真正创建(task_sessions 0 行)。两处都是宿主契约漂移踩在插件侧,不改业务语义。 | | 主线变更(2 件) | ① #20(PR):取模型目录前按宿主契约 retain 会话(sessionRef.ts 新增 createSessionHold(),按使用者引用计数持有、卸载/切会话释放),挑选口径收敛到纯模块 modelDirectorySession.ts 的 pickDirectorySessionId();调用宿主服务改走 ctx.inject(['remote.session']) 拿到的子 ctx(serviceScope.ts),修掉 cordis traceable 服务把服务实例 ctx 影射成调用方 ctx 引发的 inject 报错。modelCapability.ts 的重试判据只认 resolved no scope / resolved no binding,inactive context 不重试(retain 救不了,重试只会掩盖成因)。② #21(PR):.wb-modal 加 max-height:min(88vh,900px) / overflow-y:auto / overscroll-behavior:contain,.wb-modal-actions 改为 position:sticky; bottom:-18px 并补图层底色 —— 弹窗不再高于视口,底部按钮常驻;同版新增 test/panelCss.test.mjs 正视判据(缺一条就红)与实机双相位探针 scripts/repro/repro-issue17-modal-overflow.mjs。 | | 夹带项(1 件) | #18 i18n 深度翻译二轮(entryLocale.ts 新增、shared/i18n.ts +328 行、草稿横幅 / 设置 / 容量规则 / 任务详情 / 点子 Tab 的文案抽取,附 entryLocale 与 ideasI18n 两个测试套件)。为什么必须同版:它已经是 main 上的独立提交(c2fa148),本版 tag 必然覆盖它;纯文案层、无 schema、无 API、无依赖变化,拆到下一版只会让「v1.17.2 = 两个修复」的说明与实际交付的代码不一致。 | | 被推迟 | ① #13(弹窗与浮层改挂宿主 overlay 层)判重复:main 在 v1.17.0 已有等价实现 src/client/overlayMount.ts + test/overlayMount.test.mjs,该 PR 不碰高度与溢出、修不动 #17,按重复关闭;② #11(Web 功能分支,2026-10-05,CONFLICTING)属陈旧分支,需 rebase 拆分后再谈;③ .wb-modal 的 box-sizing:border-box 微调(本版判据按 content-box 实测口径写死,不顺手改盒模型);④ i18n 深层(通知 / 提醒 / 微信 / 字典管理)。 | · 1. 来源与致谢 · Issue #19 / PR #20:由 @SnowNight777 报告(2026-10-27)并亲自修复(2026-10-29)。报告自带两条根因与机制(retain 之后 scope 才物化;cordis traceable 服务把服务实例 ctx 影射成调用方 ctx,于是宿主里那句 new ModelDirectory(this.ctx.remote.sessio
v1.17.12026-10-23
· v1.17.1 Release Notes 主题:修复 issue #15 —— 点子页「新建 / 重命名文件夹」点了没反应(v1.16.3 客户端拆分的残留) 上一个稳定点:v1.17.0 版本号 1.17.1(package.json / tag / npm / GitHub Release 四者一致)。 发布日期:2026-10-22 · 0. 范围表(动版本号之前先填) | 列 | 内容 | |---|---| | 本版主题 | 补回 v1.16.3 客户端拆分丢掉的文件夹表单渲染层:点子页的五个「新建文件夹」入口与卡片上的 ✎(重命名)从 v1.16.3 起点了没反应、不发请求、不报错;本版恢复弹窗,并把"状态只写不读"这类静默丢失变成会失败的测试。 | | 主线变更 | ① 恢复「新建 / 重命名文件夹」弹窗(模态、新建与重命名两模式、Enter 提交、Esc / 遮罩取消、标题为空禁用主按钮、创建后选中新文件夹);② Modal 支持 data-autofocus:打开弹窗即聚焦名称输入框(否则焦点落在标题栏关闭按钮上,打字没反应);③ 新增 test/ideasFolderForm.test.mjs:扫描 useIdeas 暴露的每个状态 / 动作是否真有渲染层读者,并锁定弹窗接线与聚焦政策。 | | 夹带项(1 件) | 验收链自身的两处修复:① 英文界面下「返回对话」按钮渲染成 Back,两个遗留套件却各自硬编码中文文案 —— 定位改走共享表达式 _harness.backButtonExpr();② expert 套件的 AX-E61 / AX-E62 是"真实模型调用预算"决定的跳过,按链的既有机制显式登记。为什么必须同版:隔离实例的 verify 库 uiLocale=en-US 时,链会把"找不到按钮"报成业务回归 —— 不修它,本版的回归判据在英文界面下不成立。 | | 被推迟 | ① 孤儿扫描推广到全部 hook(本版只覆盖 useIdeas);② D17 migration-matrix.md 的负向判据改正向 owner 断言;③ 死导出清理(useKnowledge 的 reload / currentKind / refreshKey / openEntry,useWorkbenchExperts 的 draftActions);④ 补「一个点子可属于多个文件夹」那半句提示文案;⑤ 知识 / 点子白名单套件。 | · 1. 来源与致谢 · Issue #15:由 @Chewbacca96 报告(2026-10-19),报告本身就给出了根因——五个入口只 setFolderForm、src/client 里没有任何组件读 folderForm,服务端 API 完好;并明确"是 stock 1.17.0 的问题,不是本地改动产物"。 · 本版按报告的证据复现(git log -S'patchFolderForm' 只有一个提交、至今 0 调用),确认是拆分时漏搬渲染层,不是服务端缺陷;没有另起一套方案。 · 内置角色库与第三方许可链未变动。 · 2. 需求对照 | 诉求(issue #15) | 本版状态 | |---|---| | 工具栏「新建文件夹」、文件夹格「+ 新建空文件夹」、空态「新建文件夹」、卡片菜单「新建文件夹…」四处入口都能打开表单 | ✅ 四处入口共用同一个 folderForm 状态,弹窗由提示层统一渲染(与 v1.16.2 的 DOM 一致) | | 卡片 hover 的 ✎(重命名)能改名且预填原名 | ✅ 标题为「重命名文件夹」、名称已预填;保存后网格与服务端同名 | | 键盘可用:Enter 提交、Esc 关闭 | ✅ Enter 与主按钮同一准入(空标题不发请求);Esc / 遮罩取消由 Modal 负责 | | 失败不能"静默" | ✅ 标题为空时主按钮禁用(不发请求、也不留一条看不见的错误);服务端错误走既有 toast | | 服务端不需要改 | ✅ 只改客户端渲染层;POST/PATCH /api/workbench/idea-clusters 未动 | · 3. 根因 · 拆分提交 b9182b8(2026-10-04,「D17 WorkbenchApp 拆分——index.tsx 5725 → 1972」)按区域切文件。文件夹弹窗在拆分前位于 src/client/index.tsx:2942-2975(wb-modal + 输入框 autoFocus + Enter 提交 + 遮罩取消 + 创建/保存按钮),不在提示层的搬迁区间(index.tsx:845-1001),也不属于点子详情区的三分支之一 ⇒ 没有任何新文件接手它。
v1.17.02026-10-19内容较长已截断
· v1.17.0 Release Notes 主题:角色库/专家 UI 可用性修复 + 英文界面(i18n)+ 宿主浮层挂载 上一个稳定点:v1.16.5 版本号 1.17.0(package.json / tag / npm / GitHub Release 四者一致)。 发布日期:2026-10-19 · 0. 范围表(动版本号之前先填) | 列 | 内容 | |---|---| | 本版主题 | 可用性与本地化:修掉角色库/专家生成与设置页的可见 UI 缺陷,给顶层界面加英文语言支持,并把插件浮层挂到宿主真正的 overlay 层上——三者共同构成"看得见、点得到、读得懂"的同一主题。 | | 主线变更 | ① 专家草稿预览排版(根因是误用 .wb-draft-field / .wb-row-meta);② 设置页「继续修改」「查看草稿」的弹窗/浮卡交互与 z-index;③ 角色来源标签去重、清理界面里露出的 Markdown 标记;④ 新增 uiLocale(自动/中文/English)与 t() 文案表,覆盖顶栏、设置、角色库/专家、快速录入、任务表单、知识库与选择器;⑤ 知识库工具栏/分页/标签/空态/详情编辑表单英文。 | | 夹带项(1 件) | Issue #14 宿主浮层修复:所有 portal 改走 overlayMountContainer(),优先挂 [data-shell-overlay] 并补 pointer-events:auto。为什么必须同版:语言设置、专家草稿检查、模型选择都发生在设置弹窗/浮层里,不修这些浮层在桌面端仍被面板盖住,本版的可用性目标不成立。 | | 随本版送达的非编译内容 | README 语言/版本历史刷新、docs/releases/v1.17.0.md、docs/tasks/51189a57-…/P12-handover.md(任务资料夹内的完整取证);发布前 PII 扫描把历史任务资料夹/测试夹具里的真实账号名与公司路径替换为 / 占位符(内容语义不变,见 §3)。 | | 被推迟 | ① 深层 i18n(点子页、任务详情长文、通知/提醒/微信/字典管理);② 字典条目名称的本地化(仍由用户字典维护);③ 列表排序仍固定 zh-Hans-CN collation;④ 桌面端 issue #14 的人工点验(Web 隔离实例已验,桌面需用户安装后确认);⑤ 英文界面不是 4,100 条全量翻译,只覆盖本版声明的顶层范围。 | · 1. 来源与致谢 · Issue #14:由 @SnowNight777 报告,并附了宿主 overlay 层的真实测量、elementFromPoint 证据和可直接落地的修复建议;本版按"换挂载层,不跟宿主抢 z-index"的方向实现。 · Issue #12:由 @Chewbacca96 提出,给出了 locale map、语言设置、aria-label/title、数字格式化与"先做顶层 chrome"的清晰边界。 · 两位报告中的根因判断与验证方法都被直接采用;本版没有另起一套私有修复。 · 内置角色库与第三方许可链未变动。 · 2. 需求对照 · Issue #14(浮层被宿主 overlay 盖住) | 诉求 | 本版状态 | |---|---| | 设置弹窗、模型列表、知识库标签菜单、点子文件夹菜单在面板打开时可见且可点 | ✅ 六个 portal 统一走 overlayMountContainer();Web 真机确认父节点为 [data-shell-overlay]、pointer-events:auto、elementFromPoint 命中菜单自身 | | 不要靠抬 z-index 跟宿主抢数字 | ✅ 不改 300/330 等既有值;挂到宿主 overlay 层后 300 > 55 自然成立 | | 宿主层不适合挂载时不能更糟 | ✅ 决策表:未连接/不在 body/display:none/transform/filter/perspective/contain/will-change 时退回 document.body | | 回归防线 | ✅ test/overlayMount.test.mjs 覆盖决策表 + 六处 portal 源码扫描;workspace-picker 套件 8/8 | · Issue #12(UI localization) | 诉求 | 本版状态 | |---|---| | 可切换中文/英文的 UI 语言 | ✅ 设置 → 通用 → 语言:自动 / 中文 / English;保存到 DB(meta ui_locale),重启后保留;用 UI 切回中文已实测 |
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-personal-workbench DSH(DeepSeek Harness)个人工作台插件:把 DSH 变成「日历 + 层级任务 + AI 助手」的工作台。 用自然语言录入任务,AI 澄清 / 拆解 / 执行 / 复盘,数据全部留在本机。 English · 简体中文 今日 | 日历 | 快速录入 | 知识库 | | 日历 | 快速录入 | 知识库 | 亮点 - 📅 日历(周/月)+ 树状任务列表;「今日」「日历」「任务」三视图,筛选排序可组合、保留父子层级 - ✨ 自然语言快速录入 → AI 澄清后生成任务;支持贴图与 PDF/DOCX 附件,不收的文件逐条给原因 - 🧠 每个任务关联多个 AI 会话:澄清 / 咨询 / 拆解 / 执行 / 复盘 - 🎭 专家人格(角色库):三级来源(用户库 > 外部目录 > 内置 15 篇);会话前选定,正文按需加载、不进提示词 - ✅ 「AI 申请完成 → 用户验收」闭环;进度是显式值,AI 不能靠进度把任务标完成(ADR 0003/0004) - 🗓️ 每日计划 + 容量账本:AI 排序提案 → 确认才生效;「今日投入结束」≠ 任务完成(ADR 0007) - 🎯 会话前选 Skill / 模型 / 角色,提示词自动注入「加载这些技能」
展开完整文档(README 剩余 1 节)
dsh-personal-workbench

DSH(DeepSeek Harness)个人工作台插件:把 DSH 变成「日历 + 层级任务 + AI 助手」的工作台。
用自然语言录入任务,AI 澄清 / 拆解 / 执行 / 复盘,数据全部留在本机。

English · 简体中文

今日

| 日历 | 快速录入 | 知识库 |
| 日历 | 快速录入 | 知识库 |

亮点

- 📅 日历(周/月)+ 树状任务列表;「今日」「日历」「任务」三视图,筛选排序可组合、保留父子层级
- ✨ 自然语言快速录入 → AI 澄清后生成任务;支持贴图与 PDF/DOCX 附件,不收的文件逐条给原因
- 🧠 每个任务关联多个 AI 会话:澄清 / 咨询 / 拆解 / 执行 / 复盘
- 🎭 专家人格(角色库):三级来源(用户库 > 外部目录 > 内置 15 篇);会话前选定,正文按需加载、不进提示词
- ✅ 「AI 申请完成 → 用户验收」闭环;进度是显式值,AI 不能靠进度把任务标完成(ADR 0003/0004)
- 🗓️ 每日计划 + 容量账本:AI 排序提案 → 确认才生效;「今日投入结束」≠ 任务完成(ADR 0007)
- 🎯 会话前选 Skill / 模型 / 角色,提示词自动注入「加载这些技能」
- ⏰ 到期提醒:页内横幅 + 系统通知;可选微信通道(需 @xmanrui/dsh-im)
- 🌐 界面语言:自动 / 中文 / English(设置 → 语言);顶栏、设置、角色库/专家、快速录入、任务表单、知识库与选择器已支持英文,深层说明文案增量迁移
- 🔒 数据只在本机 ~/.dsh/workbench,不上传任何服务器

安装

前置:DSH ≥ 0.1.5-rc.1(Web 版)、Node ^22.19.0 或 >=24.0.0、pnpm >=11.7.0 <12。

dsh plugin --profile web add @dely0/dsh-personal-workbench

⚠️ 装完必须重启 dsh web,只刷新浏览器不够:客户端 bundle 由宿主在启动时读进内存,刷新拿到的是旧代码。升级/回退同理。

其它装法:

GitHub 源码
dsh plugin --profile web add git+https://github.com/Dely0/dsh-personal-workbench.git
Release tarball
dsh plugin --profile web add file:/path/to/dsh-personal-workbench-<version>.tgz

快速上手

1. 侧栏点「工作台」打开面板;
2. 「快速录入」说一句话 → AI 澄清 → 确认建任务;
3. 任务详情点「AI 执行」→ 在会话里干活 → 完成后回面板验收;
4. 「今日」看待办与容量,需要时点「AI 智能排序」排今天的顺序;「日历」按天回看与排期。

兼容性

| 项 | 要求 | 拿不到时 |
| 面板本体(官方槽位 + layout.selectPanel) | DSH 0.1.5-rc.1+ | 面板整块不启动并打一条可读日志(刻意不降级) |
| 服务端能力:任务/日历/知识库/点子、提醒、日报周报、workbench_ 工具 | 0.1.0-rc.6+ | — |
| 会话绑定 sessions.retain() | 0.1.7-rc.2+ | 旧宿主自动回落 sessions.binding() |
| Skill 选择器 | 宿主 skills 注册表 | 选择器隐藏 |
| 微信提醒 | 可选插件 @xmanrui/dsh-im | 静默降级为页内提醒 + 系统通知 |

最低支持版本是 0.1.5-rc.1,这是硬边界。 为什么低于它选择"明确不启动"而不是降级、以及 0.2.0 引入的插件兼容性预检(peer 区间为什么写成并列区间):见 docs/releases/v1.15.8.md 与 docs/design/2026-09-13-client-architecture-official-only.md。

开发

git clone https://github.com/Dely0/dsh-personal-workbench.git
cd dsh-personal-workbench
pnpm install
pnpm check # 类型检查 + 构建
pnpm test # 全量回归(跑构建产物)
pnpm build && pnpm dev:install # 装盘到本机 profile(装完重启 dsh web)

| 文档 | 用途 |
| .dsh/skills/dsh-plugin-change/ | 改代码前先读:架构硬约束、本项目的编码规范与回归防线 |
| .dsh/skills/dsh-release/ | 发版前先读:公开发布的硬门禁与命令序列(范围表、变异探针、PII 两面、tag/npm/Release、发布成功判据) |
| docs/release-checklist.md | 发版前自检清单(可勾选版) |
| scripts/release-preflight.mjs | 发布门禁一键跑:typecheck → 单测 → 全探针(每步 build)→ PII 两面 → 版本/文档;--phase post 做 tarball 与 sha1 对账、用户视角安装、Release 复核 |
| scripts/dev-verify.mjs | 研发版本验收链:构建 → 装盘 → 隔离实例重启 → 浏览器套件 → 证据包 |
| docs/issues/ | 滚动维护的已知问题与待办 |
| docs/adr/ | 已冻结的口径决策(容量、进度、角色、验收链、每日投入) |

版本历史

| 版本 | 要点 |
| 1.17.2 | 两处「点开就废」的可用性修复:① 模型选择器一个模型都列不出来(issue #19 / PR #20,@SnowNight777)—— DSH 0.2.1-rc.3 上宿主 directoryFor(sessionId) 先查 sessions.scope(),scope 只在有人 retain() 之后才物化,而 ModelPicker 自己挑会话却从不 retain ⇒ 先报 ui-model-selection: session "…" resolved no scope,补掉后首次建目录再报 cannot get property "remote.session" without inject(cordis traceable 服务把服务实例 ctx 影射成调用方 ctx)。本版取目录前按契约 retain(引用计数、卸载/切会话释放)、挑会话口径收敛到 pickDirectorySessionId()、调用宿主服务改走 ctx.inject(['remote.session']) 的子 ctx(可选依赖,不把没装该 provider 的机器整块面板 pending),重试判据只认 resolved no scope / resolved no binding。② 「AI 执行」弹窗拿不到「开始」(issue #17 / PR #21,@WUWAN01 报告)—— .wb-modal 无高度上限、操作栏走普通文档流,1080p/150% 下弹窗高于视口、底部「取消/开始」被推到屏幕外且整页滚动救不回来(task_sessions 0 行);本版加 max-height:min(88vh,900px)、overflow-y:auto、overscroll-behavior:contain,底栏改 position:sticky 并补图层底色,附「缺一条规则就红」的 CSS 判据与实机双相位探针 scripts/repro/repro-issue17-modal-overflow.mjs。同版合入 i18n 深度翻译二轮(PR #18,@Chewbacca96)。详见 docs/releases/v1.17.2.md |
| 1.17.1 | 修复 issue #15:点子页「新建 / 重命名文件夹」点了没反应(v1.16.3 客户端拆分的残留)—— 五个「新建文件夹」入口与卡片 hover 的 ✎ 从 1.16.3 起只改 folderForm 状态、没有任何组件读它,于是没弹窗、没请求、没报错;本版按拆分前的 DOM 恢复文件夹弹窗(新建/重命名两模式、Enter 提交、Esc/遮罩取消、空标题禁用),并让 Modal 优先聚焦 [data-autofocus] 主字段(否则焦点落在关闭按钮上,打字没反应)。同版新增 test/ideasFolderForm.test.mjs(hook 暴露的状态/动作必须有渲染层读者,防"只写不读"静默丢失回归),并修掉验收链在英文界面下的两处假红(「返回对话」定位改共享表达式、expert 真实模型跳过显式登记)。详见 docs/releases/v1.17.1.md |
| 1.17.0 | 角色库/专家 UI 可用性 + 英文界面(i18n)+ 宿主浮层挂载:修掉专家草稿预览一字一行/横向溢出、设置页「继续修改」后弹窗不关、「查看草稿」被设置弹窗遮挡、界面露出 与角色来源标签重复;设置新增语言(自动/中文/English),顶栏、设置、角色库/专家、快速录入、任务表单与知识库等顶层界面支持英文,语言保存后重启仍保留;浮层改为优先挂宿主 [data-shell-overlay] 层并补 pointer-events,修复桌面端设置弹窗与模型列表被面板盖住(issue #14)。英文界面见 issue #12。详见 docs/releases/v1.17.0.md |
| 1.16.5 | 合入外部贡献:工作台样式节点丢失后的自愈(issue #9 / PR #10,@SnowNight777)—— 插件活动期间 style[data-dsh-personal-workbench-style] 被删掉后约 600ms 内自动重建,关闭态面板不再「无样式弹出并覆盖界面」;观察者挂在插件实例上(不是模块级),cleanup() 先 disposed = true 再 disconnect()。同版修掉 main 连续 33 次红的 CI:test/db.test.mjs 那条「同链计划项」断言的场景从 2026-10-01 起就写错了、且 finally 里的清理异常会顶替断言失败(正是它被长期读成「Windows EPERM 假失败」的原因),CI run #84 双绿。详见 docs/releases/v1.16.5.md |
| 1.16.4 | 「排入今日」的父子口径定案:计划项必须是可执行叶子,在父任务上点一次 = 按树序展开它下面所有未完成叶子(各自带自己的投入),父任务自己不是计划项、在「计划」页签作分组行(「已排 N / 共 M 个子任务 · 合计 X 分钟」);候选池只收叶子、AI 侧口径同步「只排可执行叶子」(含父任务的提案整份被拒)。同版修掉「清除今日计划不刷新」与两处验收链套件假红。口径见 docs/adr/0010-plan-items-are-executable-leaves.md,详见 docs/releases/v1.16.4.md |
| 1.16.3 | 客户端入口拆分:src/client/index.tsx 5725 → 1972 行、WorkbenchApp 4197 → 631 行;117 个 state 按域收进 16 个 hook,五个视图与任务详情区各自成组件(hooks/ + views/ + app/ 装配四段);ADR-0008 结构硬门(体内 useState/api/fetch/定时器 = 0、单个顶层块 ≤80 行)落成扫描判据。纯结构重构、零行为变化。详见 docs/releases/v1.16.3.md |
| 1.16.2 | 日期面板补「逾期」/「未排期」两个任务页签(无截止、没排期、非进行中的任务终于有归宿,「未排期」= 补集:三页签并集恰好是全部未完成)+ 这两个页签的行内「排入今日」;统计卡「逾期」口径统一到当日 00:00(与页签同一把尺子)。详见 docs/releases/v1.16.2.md |
| 1.16.1 | AI 会话工作区双模式(已有工作区下拉 + 文件夹弹框);「今日」与「日历」收敛为同一个日期面板(计划/已完成/报告三页签,树口径=当日到期 ∪ 当日计划项 ∪ 进行中,逐条标来源);构建期类型源对齐 DSH 0.2.0-rc.2。详见 docs/releases/v1.16.1.md |
| 1.16.0 | 任务进度(显式值、AI 不能靠进度完成)+ 专家人格角色库(三级来源 / 15 篇内置)+ 研发版本验收链。⚠️ schema 18 → 19。详见 docs/releases/v1.16.0.md |
| 1.15.8 | 适配 DSH 0.2.0-rc.1 的插件兼容性预检(peer 改并列区间,下界不动) |
| 1.15.7 | 快速录入模型选择死锁 + rc.2 系统通知失败被吞(两处 P0) |
| 1.15.6 | 补齐 0.1.7-rc.2 上「当前会话」读取的三处静默 undefined |
| 1.15.5 | 适配 0.1.7-rc.2:会话绑定/打开、标题栏让位、侧栏量宽、工作区静默丢件 |
| 1.15.3 | 合入社区三项修复(提醒漏建 / 投递目标缓存 / 复用会话陈旧引用) |
| 1.15.2 | 模型浮层遮挡、默认工作区被任务污染、容量账本透明化、知识库 Tab 化、知识自动召回 |
| 1.15.1 | 任务资料夹改 <任务ID>-<标题片段>、快录附件(图片/PDF/DOCX)、模型选择器、/workbench 命令 |
| 1.14.57 | 架构重构:面板可见性唯一权威源、删除 DOM 降级腿、能力门槛「明确不启动」 |
| 更早 | 完整发行说明见 docs/releases/ |

路线图

- [ ] 客户端 WorkbenchApp 拆分(施工图待重写)
- [ ] 任务拖拽排序、数据导入导出
- [ ] 定时自动化、多端同步(各自单独立项)

致谢

- @Guojing6 —— v1.15.1 的多项能力源自其 fork Guojing6/dsh-workbench:任务资料夹改用任务 ID、快录附件、模型选择器、/workbench 斜杠命令、请求围栏加固;并定位了两个我们一直带着的真 bug。
- @SnowNight777 —— v1.15.3 的三项修复全部来自其报告(issue #4 / #5 / #7 与 PR #6 / #8);v1.16.5 的工作台样式自愈同样来自其 issue #9(含故障注入最小复现与只读状态采集脚本)与 PR #10(样式节点丢失后的自动恢复 + 生命周期清理 + 7 例回归)。
- @Chewbacca96 —— v1.17.0 的 UI 本地化(issue #12)需求与边界定义。
- @SnowNight777 —— v1.17.0 的宿主浮层挂载修复(issue #14)提供了真实测量、elementFromPoint 证据与可直接落地的方案;此前 v1.15.3 / v1.16.5 的贡献见下。
- @tujunwenjie、@lhmhz —— issue 诊断报告。
- @SnowNight777 —— v1.17.2 的模型选择器修复(issue #19 / PR
#20):报告自带两条根因(retain() 之后 scope 才物化;
cordis traceable 服务把服务实例 ctx 影射成调用方 ctx,于是宿主里那句 this.ctx.remote.session 要求调用方 inject),并先划清「不能把可选 provider 写进 inject」的边界;PR 在 DSH 0.2.1-rc.3 桌面端实测通过。
此前 v1.15.3 / v1.16.5 / v1.17.0 的贡献见下。
- @WUWAN01 —— v1.17.2 的「AI 执行」弹窗视口缺陷(issue #17):报告含完整 DOM 结构、lib/client.js:155 的 .wb-modal-mask 规则位置、task_sessions 0 行证据与可直接落地的修补建议(高度上限 / 内部滚动 / sticky 底栏),并指出 lib/client/styles.js 运行时并未被加载。
- @Chewbacca96 —— v1.17.2 的 i18n 深度翻译二轮(PR #18):面板入口、草稿横幅、设置、容量规则、任务详情与点子 Tab。
- 内置角色库含两个 MIT 上游(novotnyllc/dotnet-artisan、K-Dense-AI/scientific-agents)的领域角色,完整署名与「我们改了什么」见 THIRD_PARTY_NOTICES.md。

逐项来源与许可证见 THIRD_PARTY_NOTICES.md。

免责声明

社区项目,与 DeepSeek 官方无关,不提供任何担保。安装即表示你信任该代码会以你的 DSH 用户权限在本机运行;执行类 AI 操作可能修改工作区文件、消耗 API 额度,请先阅读代码并谨慎使用。

License

MIT。部分 DOM 挂载模式与客户端构建包装参考了 dsh-task-board(BSD-3-Clause)与 dsh-genui(MIT),详见 THIRD_PARTY_NOTICES.md。

A personal workbench plugin for DeepSeek Harness (DSH) — turn DSH into a calendar + hierarchical task list + AI assistant workbench. All data stays on your machine.

Highlights

- 📅 Calendar (week/month) + tree task list; Today / Calendar / Tasks views with combinable filters that keep parent-child structure
- ✨ Natural-language quick capture → AI clarification → task created; images and PDF/DOCX attachments supported
- 🧠 Multiple AI sessions per task: clarify / consult / breakdown / execute / review
- 🎭 Personas: three-tier library (user > external dir > 15 built-ins), picked per session, loaded on demand (never inlined into the prompt)
- ✅ 「AI 请求完成 → 你确认」闭环;进度是显式值,AI 不能拿它把任务标记为完成
- 🗓️ 每日计划 + 容量账本:AI 提出排序,只有你确认后才生效;「今天到此为止」≠ 任务完成
- 🎯 每次 AI 会话前选技能 / 模型 / 人格;提示词里会带上「加载这些技能」的指令
- ⏰ 到期提醒(面板内横幅 + 系统通知),可选微信通道,走 @xmanrui/dsh-im
- 🌐 界面语言:自动 / 中文 / English(设置 → 语言);顶层框架、设置、人格/专家、快速记录、任务表单、知识视图和选择器均已翻译,更深的文案会逐步迁移
- 🔒 只存本地,路径 ~/.dsh/workbench

安装

要求 DSH ≥ 0.1.5-rc.1(web),Node ^22.19.0 或 >=24.0.0,pnpm >=11.7.0 <12。

dsh plugin --profile web add @dely0/dsh-personal-workbench
or: dsh plugin --profile web add git+https://github.com/Dely0/dsh-personal-workbench.git

⚠️ 安装后必须重启 dsh web —— 客户端 bundle 在宿主启动时读入内存,只刷新浏览器仍会跑旧代码。

兼容性

| | 要求 | 缺失时 |
| 面板(官方插槽 + layout.selectPanel) | DSH 0.1.5-rc.1+ | 面板拒绝启动,并记录可读的原因(刻意不做降级) |
| 服务端功能(任务、提醒、报告、workbench_ 工具) | 0.1.0-rc.6+ | — |
| 通过 sessions.retain() 绑定会话 | 0.1.7-rc.2+ | 旧宿主上回退到 sessions.binding() |
| 微信提醒 | 可选 @xmanrui/dsh-im | 回退到面板内 + 系统通知 |

开发

pnpm install && pnpm check && pnpm test

改代码前先读 .dsh/skills/dsh-plugin-change/,发布前先读 .dsh/skills/dsh-release/;勾选版发布清单在 docs/release-checklist.md,自动化验证链在 scripts/dev-verify.mjs。

致谢与许可

社区项目,与 DeepSeek 无隶属关系;按现状提供。v1.17.2 包含来自 @SnowNight777(模型选择器,#19/#20)、 @WUWAN01(AI 运行弹窗视口,#17)和 @Chewbacca96(更深入的 i18n 改造,#18)的修复与翻译。外部贡献和随包分发的 MIT 许可人格来源列在 THIRD_PARTY_NOTICES.md。
基于 MIT 许可。
预览分享卡片长什么样 ↓Dely0/dsh-personal-workbench
分享 · DeepSeek Harness Hub
Dely0/dsh-personal-workbench

DSH 个人工作台:日历 + 任务列表 + AI 澄清/拆解/执行/复盘 | Personal workbench…

回到顶部