把助手变成有花名册和流水线的多员工团队
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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 27 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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 秒超时、卸载时取消,前次请求完成后再轮询。
- 制作阶段依然只生成制作计划,尚未实现媒体渲染器;审核时必须自行检查实际成片。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
syc67169-source/dsh-team-employees
把助手变成有花名册和流水线的多员工团队
相关插件 · 技能 / 提示词
人设统管ZiChuanLan/agent-purge
一份系统提示词,喂给多个 coding…
★ 931已汉化DSH
73.8
人物画像蒸馏titanwings/distilly
Distilly — 把他们的思考方式提炼成可复用的技能,供任何智能体或机器人使用。原名 Colleague Skill(原同事 Skill)。
★ 25,659已汉化DSH
71.3
推理工作空间套件Tiger3807861189/J-Space-Cognition-Suite
J-Space 是面向复杂推理、大型仓库工程、子代理协作与授权安全分析的推理时工作空间和控制套件。
★ 2,957已汉化DSH
70.5
两阶段工具锚定预设xiaobright/dsh-anchored-standard
实验性 DeepSeek Harness agent preset…
★ 3,742已汉化DSH
70.1
智能体工作流编排nrslib/takt
不再日夜盯着 AI 编码智能体。
★ 1,402已汉化DSH
70
Agent 运行时手册Electricitysheep/dsh-handbook
DeepSeek Harness dsh 从 0 到 1 深度手册:安装/插件开发/性能调优/实测案例/同模型多…
★ 827已汉化DSH
68.7