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

法律工作台 gaog88666-boop/dsh-legal-workbench

DeepSeek Harness
gaog88666-boop1 天前有提交已提供中文文档扫描:含敏感能力

在会话侧栏查 SOP、术语与邮件规则并插入草稿

32.9/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add gaog88666-boop/dsh-legal-workbench
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 110 处,展示前 69 条)
  • 读取本地文件
    index.js:61
    const parsed = JSON.parse(readFileSync(USER_CONFIG_FILE, 'utf8'))
  • 读取本地文件
    index.js:71
    const text = await readFile(USER_CONFIG_FILE, 'utf8')
  • 读取本地文件
    index.js:258
    info = await stat(filePath)
  • 读取本地文件
    index.js:287
    createReadStream(filePath, { start, end }).pipe(res)
  • 读取本地文件
    index.js:296
    createReadStream(filePath).pipe(res)
  • 读取本地文件
    index.js:303
    const info = await stat(path)
  • 写入本地文件
    index.js:759
    await mkdir(join(homedir(), '.dsh-workbench'), { recursive: true })
  • 写入本地文件
    index.js:763
    await mkdir(join(vaultRoot, dir), { recursive: true })
  • 写入本地文件
    index.js:768
    await writeFile(USER_CONFIG_FILE, JSON.stringify(next, null, 2) + '\n', 'utf8')
  • 执行外部命令来自配置/变量
    index.js:797
    execFile(settings.openCommand, [uri], { timeout: 5000 }, (error) => {
  • 执行外部命令来自配置/变量
    index.js:814
    execFile(settings.openCommand, [target], { timeout: 5000 }, (error) => {
  • 写入本地文件
    index.js:912
    await appendFile(join(settings.dataDir, 'client-errors.log'), line + '\n', 'utf8')
  • 写入本地文件
    index.js:951
    await mkdir(backupDir, { recursive: true })
  • 写入本地文件
    index.js:952
    await writeFile(join(backupDir, 'email-rules-' + new Date().toISOString().replace(/[:.]/g, '-') + '.md'), text, 'utf8')
  • 发起网络请求
    client.js:633
    const response = await fetch(API + path, request)
  • 写入剪贴板
    client.js:652
    await navigator.clipboard.writeText(text)
  • 发起网络请求
    client.js:966
    void fetch(API + '/client-log', {
  • 发起网络请求
    client.js:2286
    void fetch(API + urlPath, { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}', keepalive: true })
  • 发起网络请求
    client.js:2333
    await fetch(API + '/recordings/' + encodeURIComponent(session.recId) + '/chunk' + query, {
  • 读取本地文件
    lib/cards.js:49
    text = await readFile(cardsFile, 'utf8')
  • 读取本地文件
    lib/prompts.js:36
    text = await readFile(promptsFile, 'utf8')
  • 读取本地文件
    lib/vault.js:48
    const entries = await readdir(dir, { withFileTypes: true })
  • 执行外部命令固定命令
    lib/vault.js:61
    execFile(
  • 读取本地文件
    lib/vault.js:185
    const info = await stat(abs)
  • 读取本地文件
    lib/vault.js:187
    const text = await readFile(abs, 'utf8')
  • 写入本地文件
    lib/vault.js:224
    await copyFile(abs, abs + '.bak')
  • 写入本地文件
    lib/vault.js:227
    await mkdir(backups, { recursive: true })
  • 写入本地文件
    lib/vault.js:229
    await writeFile(join(backups, name), text, 'utf8')
  • 读取本地文件
    lib/vault.js:240
    entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    lib/vault.js:259
    preview = previewOf(await readFile(abs, 'utf8'))
  • 读取本地文件
    lib/vault.js:284
    info = await stat(abs)
  • 写入本地文件
    lib/vault.js:326
    await mkdir(dirname(abs), { recursive: true })
  • 写入本地文件
    lib/vault.js:336
    await writeFile(temp, text, 'utf8')
  • 写入本地文件
    lib/vault.js:337
    await rename(temp, abs)
  • 删除本地文件
    lib/vault.js:340
    await unlink(temp)
  • 读取本地文件
    lib/recordings.js:58
    for await (const chunk of createReadStream(filePath, { start: HEADER_BYTES, end: HEADER_BYTES + dataSize - 1 })) {
  • 读取本地文件
    lib/recordings.js:123
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    lib/recordings.js:135
    info = await stat(join(dir, 'audio.wav'))
  • 读取本地文件
    lib/recordings.js:141
    info = await stat(join(dir, 'audio.wav'))
  • 读取本地文件
    lib/recordings.js:145
    const md = await stat(join(dir, '转写.md'))
  • 写入本地文件
    lib/recordings.js:165
    await mkdir(root, { recursive: true })
  • 读取本地文件
    lib/recordings.js:172
    await stat(dir)
  • 写入本地文件
    lib/recordings.js:180
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/recordings.js:181
    await writeFile(join(dir, 'audio.wav'), wavHeader(0))
  • 写入本地文件
    lib/recordings.js:189
    await appendFile(audioPath, buffer)
  • 写入本地文件
    lib/recordings.js:203
    await writeFile(temp, fixed)
  • 写入本地文件
    lib/recordings.js:204
    await rename(temp, audioPath)
  • 删除本地文件
    lib/recordings.js:300
    await unlink(join(dir, name))
  • 读取本地文件
    lib/volc-asr.js:36
    parsed = JSON.parse(await readFile(configFile, 'utf8'))
  • 发起网络请求
    lib/iflyrec.js:57
    response = await fetch(endpoint, { headers, signal: controller.signal })
  • 发起网络请求
    lib/iflyrec.js:120
    const result = await fetch(target, {
  • 读取本地文件
    lib/usage.js:22
    const text = await readFile(join(homedir(), '.dsh', '.credentials.yaml'), 'utf8')
  • 读取密钥环境变量
    lib/usage.js:37
    if (typeof process.env.DEEPSEEK_API_KEY === 'string' && process.env.DEEPSEEK_API_KEY.startsWith('sk-')) {
  • 读取密钥环境变量
    lib/usage.js:38
    return process.env.DEEPSEEK_API_KEY
  • 请求外部主机api.deepseek.com
    lib/usage.js:47
    const response = await fetch('https://api.deepseek.com/user/balance', {
  • 发起网络请求
    lib/usage.js:47
    const response = await fetch('https://api.deepseek.com/user/balance', {
  • 发起网络请求
    lib/usage.js:112
    const response = await fetch('https://' + host + '/?' + query, {
  • 读取本地文件
    lib/usage.js:178
    return JSON.parse(await readFile(file, 'utf8'))
  • 读取本地文件
    lib/pkulaw.js:38
    for (const name of await readdir(root)) files.push(join(root, name, 'cordis.patch.yml'))
  • 读取本地文件
    lib/pkulaw.js:53
    const token = tokenFromPatch(await readFile(file, 'utf8'))
  • 发起网络请求
    lib/pkulaw.js:90
    const response = await fetch(url, {
  • 读取本地文件
    lib/email.js:68
    info = await stat(rulesPath)
  • 读取本地文件
    lib/email.js:69
    text = await readFile(rulesPath, 'utf8')
  • 读取本地文件
    lib/table.js:130
    text = await readFile(file, 'utf8')
  • 写入本地文件
    lib/table.js:143
    await mkdir(dirname(file), { recursive: true })
  • 写入本地文件
    lib/table.js:148
    await copyFile(file, file + '.bak')
  • 写入本地文件
    lib/table.js:157
    await writeFile(temp, next, 'utf8')
  • 写入本地文件
    lib/table.js:158
    await rename(temp, file)
  • 删除本地文件
    lib/table.js:160
    try { await unlink(temp) } catch { }
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.deepseek.com

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 右侧栏工作台:Obsidian 笔记、SOP 查询、术语表、带实时转写的录音、全局搜索。

README

由 DeepSeek 最新模型翻译生成
法律工作台(dsh-legal-workbench) 安装 前提:本机已经装了 DSH(0.2.0 或更新,dsh --version 可查);安装时需要联网(从 npm 下载)。 按你的 DSH 形态选一条: DSH 桌面 App dsh plugin --profile desktop add dsh-legal-workbench 自己部署的 DSH Web(服务器上) dsh plugin --profile web add dsh-legal-workbench 如果你用的是自定义 profile,把 desktop / web 换成你自己的 profile 名(在 ~/.dsh/profiles/ 下能看到)。 装完重启 DSH,然后点会话标题旁的工作台图标,或按 ⌥W。 不需要 Obsidian,不需要任何密钥,也不需要登录任何账号。 目前只在 macOS 上完整验证过。其它系统可以安装运行,但「打开 Obsidian」「打开控制台」这两个动作依赖系统命令,可能需要手动改配置。 第一次使用 点会话标题旁的工作台图标(或按 ⌥W)。第一次它会问一件事:你的 Obsidian 库路径。 填好保存即可,之后不用再管。转写、用量角标这些都需要你自己的密钥,不配就不显示。
展开完整文档(README 剩余 1 节)
法律工作台(dsh-legal-workbench)

安装

前提:本机已经装了 DSH(0.2.0 或更新,dsh --version 可查);安装时需要联网(从 npm 下载)。

按你的 DSH 形态选一条:

DSH 桌面 App

dsh plugin --profile desktop add dsh-legal-workbench

自己部署的 DSH Web(服务器上)

dsh plugin --profile web add dsh-legal-workbench

如果你用的是自定义 profile,把 desktop / web 换成你自己的 profile 名(在 ~/.dsh/profiles/ 下能看到)。

装完重启 DSH,然后点会话标题旁的工作台图标,或按 ⌥W。

不需要 Obsidian,不需要任何密钥,也不需要登录任何账号。

目前只在 macOS 上完整验证过。其它系统可以安装运行,但「打开 Obsidian」「打开控制台」这两个动作依赖系统命令,可能需要手动改配置。

第一次使用

点会话标题旁的工作台图标(或按 ⌥W)。第一次它会问一件事:你的 Obsidian 库路径。
填好保存即可,之后不用再管。转写、用量角标这些都需要你自己的密钥,不配就不显示。

会话右侧栏里的常驻面板:查 SOP、看法宝积分、起邮件草稿、维护术语表、走报销入口。
数据直接读写你的 Obsidian vault,两边改的是同一份文件。

打开

- 已有消息的会话:标题右侧那颗图标。
- 刚新建的空会话:输入框上方那一排的右端,「工作台」按钮。

打开后是右侧栏的一个标签页,可以拖宽、全屏、关闭,不影响左边的对话。

五个卡片

| 卡片 | 做什么 |
| SOP | 左栏是 vault 里的目录树(除 PDF 外默认全展开),点一篇右栏直接读正文;可「编辑」写回、「插入」进输入框、「打开」跳 Obsidian、「复制」 |
| 法宝积分 | 一行状态条:可用积分、即将过期、最近过期日、今日是否已领(推断)。低于 100 会标红提醒去领 |
| 邮件起草 | 规则库统计(硬/软/待观察)+ 一键插入起草 prompt + 查看规则库全文 |
| 术语表 | 中英术语增删改查,落盘即生效;整表可插入当前对话 |
| 报销填表 | 模板存在性检查 + 插入填表 prompt |

顶部还有一个全局搜索:一次搜笔记正文、术语、邮件规则,结果标注来源。

插入 prompt 的规矩

只写输入框、不发送。输入框里已有草稿时会先弹一条确认:追加 / 覆盖 / 取消,默认不动你的字。

SOP 与 Obsidian 的关系

- vault 里 SOP 目录(可改)下的笔记就是 SOP 的全部内容,工作台只是它的另一个视图。
- 在 Obsidian 改完保存,工作台切回来就是新的(打开、搜索、切窗口都会重读)。
- 在工作台里改也一样:写回原文件,Obsidian 立刻看到。
- 为防止互相覆盖:保存前会比对你读到的那一版,如果文件在别处被改过,会拒绝写入并让你选择「重新载入」或「仍要覆盖」。每次保存前留一份备份。

文件都在哪

~/.dsh-workbench/cards.json 卡片清单(增删卡片、改标题、改顺序只改这里;首次运行自动创建) ~/.dsh-workbench/prompts.json prompt 模板 ~/.dsh-workbench/asr.json 可选的语音转写凭据(600 权限,不进仓库) <vault>/Workbench/术语表.md 术语表(Obsidian 里也能直接编辑) <vault>/Workbench/.backups/ 自动备份

改 cards.json / prompts.json / 术语表 / 笔记:刷新页面即可。
改插件代码:客户端刷新、Host 部分需重启 App。

卸载

插件可以从 设置 → 插件 里停用或移除;cards.json、prompts.json、术语表与笔记都保留,不会被删。

打不开 / 空白怎么办

- 面板打开了但一片空白:点一下面板右上角的刷新按钮即可。这是 1.1.0 已知的首次加载问题,刷新一次后正常。
- 点了图标没反应:有些会话的右侧栏还没挂载,工作台会自动改用浮层打开(快捷键 ⌥W)。
- 提示"先配置一下":说明还没告诉它笔记文件夹在哪,按提示填一次即可。

已知限制

- 笔记里的图片不显示,会显示成文件名标签(如「图片 photo.png」)。文字内容(标题、列表、加粗、代码、双链)正常。
- Markdown 支持是刻意精简的:不渲染 HTML、内嵌 PDF、mermaid。
- 批注锚定到多行选择的第一行。
- 高亮颜色固定为黄色(存储支持多色,界面暂未开放选色)。
- 报销卡只检查模板是否存在,不做填表解析。
- 导入的音频转写时没有进度条。
- 工作台直接读写笔记文件夹:Obsidian 里的改动刷新后可见,这里的改动在 Obsidian 里立刻可见(同一份文件)。
- DSH 的右侧栏是每个会话独立的;放不进侧栏时工作台会以浮层打开,不会静默失败。
预览分享卡片长什么样 ↓gaog88666-boop/dsh-legal-workbench
分享 · DeepSeek Harness Hub
gaog88666-boop/dsh-legal-workbench

在会话侧栏查 SOP、术语与邮件规则并插入草稿

这是你的仓库?认领条目

回到顶部