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

多员工协同团队 syc67169-source/dsh-team-employees

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

把助手变成有花名册和流水线的多员工团队

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · skill
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 27 天前
档位由哪些信号合成

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 43 处,展示前 43 条)
  • 读取本地文件
    lib/index.js:158
    const review = await Promise.all(reviewItems.map(async row => ({ ...row, script: await readFile(row.scriptPath, 'utf8').catch(error => { if (error.cod
  • 读取本地文件
    lib/index.js:444
    const report = await readFile(path.join(researchRoot(), 'runs', id, run, 'report.md'), 'utf8')
  • 发起网络请求
    lib/client.js:132
    const response = await fetch(url, { credentials: 'same-origin', ...options,
  • 读取本地文件
    lib/content.mjs:128
    return JSON.parse(await readFile(file, 'utf8'))
  • 读取本地文件
    lib/content.mjs:137
    return await readFile(file, 'utf8')
  • 写入本地文件
    lib/content.mjs:184
    await writeFile(temp, [...latest.values()].map(row => JSON.stringify(row)).join('\n') + '\n', { flag: 'wx' })
  • 写入本地文件
    lib/content.mjs:185
    await rename(temp, indexPath())
  • 删除本地文件
    lib/content.mjs:187
    await rm(temp, { force: true })
  • 写入本地文件
    lib/content.mjs:235
    await mkdir(itemDir(resolved), { recursive: true })
  • 写入本地文件
    lib/content.mjs:243
    await mkdir(itemDir(id), { recursive: true })
  • 写入本地文件
    lib/content.mjs:245
    await appendFile(eventsPath(id), line, 'utf8')
  • 读取本地文件
    lib/content.mjs:399
    names = await readdir(metricsRoot())
  • 读取本地文件
    lib/store.mjs:31
    const parsed = JSON.parse(await readFile(rosterPath(), 'utf8'))
  • 写入本地文件
    lib/store.mjs:46
    await mkdir(teamRoot(), { recursive: true })
  • 写入本地文件
    lib/store.mjs:47
    await withFileLock(journalPath(), () => appendFile(journalPath(), line, 'utf8'))
  • 读取本地文件
    lib/usage.mjs:19
    return JSON.parse(await readFile(usagePath(), 'utf8'))
  • 写入本地文件
    lib/storage.mjs:14
    await mkdir(path.dirname(key), { recursive: true })
  • 写入本地文件
    lib/storage.mjs:21
    mkdirSync(lock)
  • 写入本地文件
    lib/storage.mjs:22
    try { writeFileSync(path.join(lock, 'owner.json'), JSON.stringify({ pid: process.pid, token })) }
  • 删除本地文件递归
    lib/storage.mjs:23
    catch (error) { await rm(lock, { recursive: true, force: true }); throw error }
  • 删除本地文件递归
    lib/storage.mjs:37
    await rm(lock, { recursive: true, force: true })
  • 写入本地文件
    lib/storage.mjs:47
    await mkdir(path.dirname(file), { recursive: true })
  • 写入本地文件
    lib/storage.mjs:50
    await writeFile(temp, text, { encoding: 'utf8', flag: 'wx' })
  • 写入本地文件
    lib/storage.mjs:51
    await rename(temp, file)
  • 删除本地文件
    lib/storage.mjs:53
    await rm(temp, { force: true })
  • 读取本地文件
    lib/research-store.mjs:15
    try { return JSON.parse(await readFile(researchFile(), 'utf8')) }
  • 读取本地文件
    lib/research-supervisor.mjs:10
    if (process.env.DSH_TEAM_NODE) { await access(process.env.DSH_TEAM_NODE); return process.env.DSH_TEAM_NODE }
  • 读取本地文件
    lib/research-supervisor.mjs:14
    try { await access(file); return file } catch {}
  • 写入本地文件
    lib/research-supervisor.mjs:26
    await mkdir(researchRoot(), { recursive: true })
  • 执行外部命令来自配置/变量
    lib/research-supervisor.mjs:29
    const child = spawn(executable, [worker, '--root', teamRoot()], { detached: true, stdio: ['ignore', log.fd, log.fd], env: { ...process.env, ELECTRON_R
  • 读取本地文件
    bin/link-into-profile.mjs:43
    return JSON.parse(await readFile(manifestPath, 'utf8'))
  • 读取本地文件
    bin/link-into-profile.mjs:91
    await readFile(backupPath)
  • 写入本地文件
    bin/link-into-profile.mjs:93
    await copyFile(manifestPath, backupPath)
  • 写入本地文件
    bin/link-into-profile.mjs:96
    await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8')
  • 写入本地文件
    bin/link-into-profile.mjs:101
    await mkdir(path.dirname(modulePath), { recursive: true })
  • 删除本地文件递归
    bin/link-into-profile.mjs:102
    await rm(modulePath, { recursive: true, force: true })
  • 读取本地文件
    bin/link-into-profile.mjs:109
    await readFile(target)
  • 写入本地文件
    bin/link-into-profile.mjs:119
    await mkdir(teamDir, { recursive: true })
  • 写入本地文件
    bin/link-into-profile.mjs:120
    await copyFile(path.join(PACKAGE_ROOT, 'employees.json'), target)
  • 删除本地文件递归
    bin/link-into-profile.mjs:130
    await rm(modulePath, { recursive: true, force: true })
  • 读取本地文件
    lib/research-headless.mjs:9
    try { await access(cli); return { executable: process.execPath, args: [cli] } }
  • 执行外部命令来自配置/变量
    lib/research-headless.mjs:19
    const child = spawn(spec.executable, args, { cwd, stdio: ['pipe', 'pipe', 'pipe'], detached: process.platform !== 'win32', env: { ...process.env, DSH_
  • 写入本地文件
    lib/research-worker.mjs:23
    await mkdir(folder, { recursive: true })
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

功能亮点

  • 员工花名册
  • 内容流水线
  • 人工闸门

把 DeepSeek Harness 变成多员工协同团队:员工花名册、内容流水线、一道人工闸门,外加一个会动的办公室界面

README

由 DeepSeek 最新模型翻译生成
dsh-team-employees 把 DeepSeek Harness 从「一个助手」变成一个多员工协同团队:有工牌、有花名册、有一条内容流水线、有一道只有人能按的闸门,还有一个会动的办公室界面。 办公室 - 员工——五个 agent preset(模式)。给每个员工一张工牌:人设 + 工具集(模型由会话选择)。情报、选题、成稿、数据四个内容岗,外加一个代码审核岗。 - 花名册——$DSH_HOME/team/employees.json。谁在岗、什么岗位、模型备注,写在一个 JSON 里。 - 内容流水线——素材登记 → 打分 → 写稿 → 制作计划 → 人工裁决 → 发布包 → 真实发布确认 → 回采 → 重算权重。每个阶段只认特定的前置阶段,谁都不能跳。 - 办公室——侧边栏一个图标,整页看到六个部门在干嘛:上钟中、待命、空岗、等你。状态来自真实会话,不是装饰动画。 - 员工管理——「设置 → 员工」里增删改花名册,缺工牌时会给出可复制的配置片段。 - 长期研究职责(0.5.0)——本地独立后台定时检查公开网页,用真实 Harness headless 模型生成简报,保留上次记忆并提示变化。关闭桌面应用后继续运行;电脑关机或休眠时无法继续。 设置 它为什么不是又一个「AI 助手壳子」 三个设计上的取舍,决定了它跟同类东西不一样: 人工工具闸门。
展开完整文档(README 剩余 1 节)
dsh-team-employees

把 DeepSeek Harness 从「一个助手」变成一个多员工协同团队:有工牌、有花名册、有一条内容流水线、有一道只有人能按的闸门,还有一个会动的办公室界面。

办公室

- 员工——五个 agent preset(模式)。给每个员工一张工牌:人设 + 工具集(模型由会话选择)。情报、选题、成稿、数据四个内容岗,外加一个代码审核岗。
- 花名册——$DSH_HOME/team/employees.json。谁在岗、什么岗位、模型备注,写在一个 JSON 里。
- 内容流水线——素材登记 → 打分 → 写稿 → 制作计划 → 人工裁决 → 发布包 → 真实发布确认 → 回采 → 重算权重。每个阶段只认特定的前置阶段,谁都不能跳。
- 办公室——侧边栏一个图标,整页看到六个部门在干嘛:上钟中、待命、空岗、等你。状态来自真实会话,不是装饰动画。
- 员工管理——「设置 → 员工」里增删改花名册,缺工牌时会给出可复制的配置片段。
- 长期研究职责(0.5.0)——本地独立后台定时检查公开网页,用真实 Harness headless 模型生成简报,保留上次记忆并提示变化。关闭桌面应用后继续运行;电脑关机或休眠时无法继续。

设置

它为什么不是又一个「AI 助手壳子」

三个设计上的取舍,决定了它跟同类东西不一样:

人工工具闸门。 ctx.tools.guard() 拦截员工调用 content_gate;状态机拒绝自动离开 review,发布包要求署名审核记录。办公室提供人工审核入口。具有本机文件/终端权限的员工仍可能直接改数据,因此这不是系统级权限隔离。

能用代码做的,不外包给模型。 切片、转码、排期全是确定性任务,content_render 只登记参数,不调 ffmpeg、更不烧 token。模型只干「判断」和「写」。

状态诚实。 「上钟中」的判据是那个员工的会话当前真的开着 turn;账本读不到就说读不到,不编数字;平台收入是美元、账本是人民币,没设汇率就不算净额,两个原值都留着。

装上

需要 Node 20+ 和一个能跑的 DeepSeek Harness。

方式一:本地目录链接(改代码最方便)

git clone https://github.com/syc67169-source/dsh-team-employees.git
cd dsh-team-employees
node bin/link-into-profile.mjs --dry-run # 先看要改什么,不写盘
node bin/link-into-profile.mjs # 装进 desktop profile

脚本只做三件事,都会打印出来:给 ~/.dsh/profiles/<profile>/package.json 加一条 link: 依赖、把插件名追加进 dsh.profile.bundles、在 profile 的 node_modules 里建软链(原文件先备份成 package.json.team.bak)。完全退出 DSH 再打开后生效;卸载用 --remove。

方式二:手动改 profile(不想跑脚本)

在 ~/.dsh/profiles/<profile>/package.json 里加一条依赖和一条 bundle:

{
"dependencies": { "dsh-team-employees": "github:syc67169-source/dsh-team-employees" },
"dsh": { "profile": { "bundles": ["…原有的…", "dsh-team-employees"] } }
}

然后在那个 profile 目录里 pnpm install。桌面端注意:dsh plugin --profile desktop 会被 CLI 拒绝(官方设计如此),手动或走脚本。

装上之后

0. 完全退出 DSH 再打开(客户端界面模块在启动时组图)。
1. 侧边栏出现「办公室」图标 → 点进去是六个部门的工位。
2. 「设置 → 员工」能看到花名册,可以增删改。
3. 新建会话 → 模式下拉里出现五位员工。
4. 选「情报员工·阿研」,问她「团队里现在有谁」→ 她调 team_roster。再让她登记一条素材 → 回办公室页刷新,情报部那个工位会显示「上钟中」。

先验收长期研究第一版

进入 办公室 → 长期研究员工 → 新建长期职责,选择员工,填写目标和 1–5 个无需登录的公开网址,再设置间隔与每日模型唤醒上限。保存后默认暂停。

点击 立即执行一次 建立第一份简报;查看最近记忆、来源和完整报告。点击 启用定期检查 才开始持续运行:内容未变跳过模型,发生变化生成新简报与面板提示。点击 暂停 会取消正在执行的任务。

这是本地第一版,一次只运行一个职责;使用 headless 配置的模型,员工模型备注不负责路由。支持文本、HTML、JSON、RSS/Atom,暂不支持需要登录或浏览器渲染的网页。详情与验收步骤见 长期研究使用与验收。

员工与工具

| 工位 | 模式 id | 干什么 | 工具集 |
| 情报员工·阿研 | scout | 找素材、核授权、登记 | 检索 + 文件 + 内容工具 |
| 选题员工·阿筛 | select | 打分、排序、给先验 | 文件 + 内容工具 |
| 成稿员工·阿写 | write | 脚本与标题 | 文件 + 内容工具 |
| 数据员工·阿析 | measure | 回采、对账、重算权重 | 文件 + shell + 内容工具 |
| 审核员工·阿审 | reviewer | 代码审核(与内容线无关) | 文件 + shell |

团队通用工具(dsh-team-employees/tools):team_roster 看花名册、team_log 写一条工作记录、team_inbox 读别人做到哪了。
内容流水线工具(dsh-team-employees/content):content_new、content_score、content_script、content_render、content_queue、content_gate(仅人)、content_publish、metrics_pull、weights、cost_report。

设计与字段细节见 docs/内容流水线编排设计.md。

数据在哪

$DSH_HOME/team/
├── employees.json 花名册 ├── journal.jsonl 团队工作日志(成员之间靠它交接) ├── content/ │ ├── index.jsonl 摘要索引 │ └── <id>/ item.json / events.jsonl / script.md / render.json / publish.json └── metrics/ ├── <id>.json 单条回采结果 └── weights.json 权重表(中位数比值,全表能手算)

全部是纯文本,直接看、直接改、直接进版本控制都行。

自检

npm test # 112 项;自动测试使用隔离目录与模型夹具,不消耗真实模型额度

- test/smoke.mjs——团队工具的注册契约、Host 的 /team/api、办公室状态机(上钟/待命/空岗/人工岗怎么算出来的)、浏览器兜底页、客户端包的槽位注册与界面渲染。
- test/content.smoke.mjs——流水线状态机、闸门、记账、权重表。

本机装了 dsh 时,会用 dsh 自己的 schema 校验器验证工具契约(DSH_TOOLS_ENTRY 可指定位置);没装就自动跳过那几条并明确打印说明,其余断言照跑。客户端界面是在一个最小 React 运行时里真渲染过的,所以 CI 不需要浏览器。

看设计不用启动 DSH:

npm run preview # 三个界面渲染成静态 HTML 到 docs/preview.html
npm run shot # 有 Chrome 时顺便重截 docs/images/ 里的图

目录结构

dsh-team-employees/
├── cordis.patch.yml 挂载清单:1 个 Host 行 + 5 个员工 preset ├── employees.json 花名册样例(安装时复制到 $DSH_HOME/team/) ├── lib/ │ ├── index.js Host:/team 接口 + 办公室数据 + 浏览器兜底页 │ ├── client.js 客户端:侧边栏入口 + 办公室整页 + 设置里的员工管理 │ ├── store.mjs 团队数据读写(花名册 + 日志) │ ├── tools.js Agent 工具:team_roster / team_log / team_inbox │ ├── content.mjs 流水线数据层:状态机 + 队列 + 回采 + 权重 │ ├── content-tools.js 流水线工具 + 人工闸门 │ └── usage.mjs 读本地账本($DSH_HOME/.dshw-usage.json) ├── bin/link-into-profile.mjs ├── tools/ 预览与截图 └── test/ 两套自检 + 最小 React 运行时

加一个员工 / 加一个工位

加员工(改花名册,界面里就能做):$DSH_HOME/team/employees.json 加一条。

加工位(要改配置):cordis.patch.yml 里复制一个 preset-employee-* 块,改 id(小写字母数字连字符)、name、order、人设和工具集;如果要让他守一段流水线,再在 lib/index.js 的 DEPARTMENTS 里加一行。设置页在缺工牌时会给出可以复制的片段,但不会替你改配置文件。

员工花名册的 model 仅作备注,不会切换模型。实际模型请在对应会话的模型选择器中设置;当前插件没有员工级模型路由。

边界与风险

- 闸门只挡员工,不挡你。 它防的是「员工自我放行」,不是防你手滑。
- exec.agent 是宿主内部字段。 这是目前唯一能区分「人 vs 员工」的手段,闸门押在它上面。升级 DSH 后请重跑自检确认它还在拦。
- 账本是 best-effort。 .dshw-usage.json 由宿主写,不是公开契约;读不到就退回「读不到」,不编数字。
- 不代发、不批量多账号、不绕平台风控。 发布这一步刻意留给人:content_publish 只写本地发布包,不接触任何平台接口。
- bin/render.mjs 还没写。 content_render 只登记参数;真正的 ffmpeg 转码是下一步。
- 版本跟着 DSH 走。 针对 0.2.0-rc.2 的运行时写的,宿主接口变动时需要跟着改;自检会告诉你哪一条不对了。

许可

MIT,见 LICENSE。

联系与交流

用这个插件遇到问题、想提需求,或者只是想要一起交流一些AI有关的问题——扫码加我:

QQ:3657854368(EasonS)

稳定性修复(2026-10-04)

- JSON 写入使用唯一临时文件;条目、花名册、回采、权重以跨进程目录锁串行化。旧 revision 保存会被拒绝。
- 锁等待最长 15 秒,失败时不会覆盖数据。若进程崩溃留下 .lock,先关闭所有使用该数据目录的 Harness/脚本,再核对 owner.json 的 PID 已退出并移除相应锁目录。不会根据过期时间自动抢走锁。
- 索引保留每个 id 的最新摘要;队列先去重再筛选,统计包含全部条目。事件历史仍保留在条目内。
- content_publish 只准备发布包,条目保持待发布。办公室中署名审核、填写真实发布链接/记录并确认后,才进入 published;回采只接受已经确认发布的平台。可为同一条内容准备多个平台。
- 人工操作接口复用宿主认证并校验来源,防止跨站请求。它不是抵御具有本机文件/终端权限的代理的安全沙箱。
- 停止以全局账本前后差额自动归因内容成本。队列显示的是已关联记录,不是完整实际支出;旧成本记录未经重新审计,金额为 0 不代表免费。
- 办公室复用一次条目和账本读取;日志从尾部读取;请求 15 秒超时、卸载时取消,前次请求完成后再轮询。
- 制作阶段依然只生成制作计划,尚未实现媒体渲染器;审核时必须自行检查实际成片。
预览分享卡片长什么样 ↓syc67169-source/dsh-team-employees
分享 · DeepSeek Harness Hub
syc67169-source/dsh-team-employees

把助手变成有花名册和流水线的多员工团队

回到顶部