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

后厨调度台 songmingjun3/dsh-kitchen-plugin

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

把仓库变成厨房,分派岗位与票并唤醒长任务会话

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 50 处,展示前 49 条)
  • 执行外部命令固定命令
    lib/config.js:236
    const out = execFileSync('git', ['rev-parse', '--show-toplevel'], {
  • 读取本地文件
    lib/config.js:254
    if (!existsSync(path)) {
  • 读取本地文件
    lib/config.js:257
    const text = readFileSync(path, 'utf8')
  • 执行外部命令固定命令
    lib/config.js:352
    out = execFileSync('gh', ['repo', 'view', '--json', 'nameWithOwner', '--jq', '.nameWithOwner'], {
  • 读取本地文件
    lib/watch-tools.js:130
    if (!existsSync(path)) return null
  • 读取本地文件
    lib/watch-tools.js:132
    return JSON.parse(readFileSync(path, 'utf8'))
  • 写入本地文件
    lib/watch-tools.js:139
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    lib/watch-tools.js:141
    writeFileSync(temporary, JSON.stringify(value), 'utf8')
  • 写入本地文件
    lib/watch-tools.js:142
    renameSync(temporary, path)
  • 读取本地文件
    lib/config-tools.js:208
    draft = readFileSync(draftPath, 'utf8')
  • 读取本地文件
    lib/config-tools.js:229
    const text = existsSync(path) ? readFileSync(path, 'utf8') : ''
  • 读取本地文件
    lib/config-tools.js:229
    const text = existsSync(path) ? readFileSync(path, 'utf8') : ''
  • 写入本地文件
    lib/config-tools.js:230
    writeText(path, writeSetting(text, key, value), 'utf8')
  • 读取本地文件
    lib/skill.js:53
    const manifest = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'))
  • 读取本地文件
    lib/skill.js:74
    const info = statSync(source)
  • 写入本地文件
    lib/skill.js:77
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    lib/skill.js:78
    copyFileSync(source, target)
  • 写入本地文件
    lib/skill.js:82
    mkdirSync(target, { recursive: true })
  • 读取本地文件
    lib/skill.js:83
    for (const entry of readdirSync(source)) {
  • 读取本地文件
    lib/skill.js:97
    if (!existsSync(join(source, 'SKILL.md'))) {
  • 读取本地文件
    lib/skill.js:104
    previous = readFileSync(markerPath(), 'utf8').trim()
  • 读取本地文件
    lib/skill.js:108
    if (!force && previous === version && existsSync(join(target, 'SKILL.md'))) {
  • 删除本地文件递归
    lib/skill.js:113
    rmSync(target, { recursive: true, force: true })
  • 写入本地文件
    lib/skill.js:126
    writeFileSync(markerPath(), `${version}\n`, 'utf8')
  • 删除本地文件递归
    lib/skill.js:137
    rmSync(installedSkill(), { recursive: true, force: true })
  • 读取本地文件
    lib/agents.js:193
    if (!existsSync(join(cwd, '.git'))) return undefined
  • 读取本地文件
    lib/registry.js:24
    if (!existsSync(target)) return new Map()
  • 读取本地文件
    lib/registry.js:27
    raw = JSON.parse(readFileSync(target, 'utf8'))
  • 写入本地文件
    lib/registry.js:67
    writeFileSync(temporary, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/registry.js:68
    renameSync(temporary, target)
  • 写入本地文件
    lib/registry.js:112
    mkdirSync(path, { recursive: true })
  • 执行外部命令固定命令
    lib/target.js:25
    out = execFileSync('gh', args, {
  • 写入本地文件
    lib/jobs.js:40
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    lib/jobs.js:42
    appendFileSync(target, `${JSON.stringify(record)}\n`, 'utf8')
  • 执行外部命令固定命令
    lib/github.js:24
    execFileSync('gh', ['--version'], { stdio: 'ignore', timeout: 30_000 })
  • 执行外部命令固定命令
    lib/github.js:33
    return execFileSync('gh', args, {
  • 读取本地文件
    lib/watch.js:34
    text = readFileSync(paths.state('runs.jsonl'), 'utf8')
  • 读取本地文件
    lib/locks.js:27
    return statSync(path).mtimeMs
  • 写入本地文件
    lib/locks.js:43
    mkdirSync(path)
  • 删除本地文件递归
    lib/locks.js:52
    rmSync(path, { recursive: true, force: true })
  • 写入本地文件
    lib/locks.js:65
    writeFileSync(join(path, 'owner'), `${process.pid}\n${Date.now()}\n`, 'utf8')
  • 删除本地文件递归
    lib/locks.js:74
    rmSync(path, { recursive: true, force: true })
  • 读取本地文件
    lib/locks.js:94
    statSync(path)
  • 写入本地文件
    lib/locks.js:103
    mkdirSync(path, { recursive: true })
  • 执行外部命令固定命令
    lib/refs.js:39
    this.names = execFileSync('git', command, { encoding: 'utf8' }).split('\n').filter((line) => line !== '')
  • 读取本地文件
    lib/refs.js:49
    if (existsSync(candidate) && statSync(candidate).isFile()) return name
  • 读取本地文件
    lib/refs.js:49
    if (existsSync(candidate) && statSync(candidate).isFile()) return name
  • 读取本地文件
    lib/refs.js:57
    if (this.root) return readFileSync(join(String(this.root), path))
  • 执行外部命令固定命令
    lib/refs.js:58
    return execFileSync('git', ['show', `${this.ref}:${path}`], { maxBuffer: 64 * 1024 * 1024 })
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-session@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 会话的后厨:工位、订单、长任务,还有唤醒它们的铃声。

README

由 DeepSeek 最新模型翻译生成
dsh-dkitchen 一个 DeepSeek Harness 插件,把一个仓库变成一间厨房:岗位、票、长任务,以及任务结束时唤醒会话的那只铃。 装上这个 bundle 就等于装完了全部。工具通过 ctx.tools 注册在 harness 进程内部,所以没有包要安装,没有单独的 profile 要启动,没有 broker 要运行,也没有 MCP server 要拉起。不需要在旁边维持任何进程。 本项目基于 917Dhj/dkitchen。 厨房本身——岗位划分、票的流转、后厨规矩,以及唤醒会话的那只铃——是 917Dhj/dkitchen 的设计,本插件是它到 DeepSeek Harness 插件运行时的移植。见致谢。 安装 从 Discover 安装。 在 harness 中打开 Plugins → Discover,添加这个索引 https://raw.githubusercontent.com/songmingjun3/dsh-kitchen-plugin/main/docs/market/index.json 然后安装 dkitchen。索引里钉死的是本仓库的一个确切 commit,所以你装到的就是某个 release 指明的那一份。 从 release 安装。
展开完整文档(README 剩余 1 节)
dsh-dkitchen

一个 DeepSeek Harness 插件,把一个仓库变成一间厨房:岗位、票、长任务,以及任务结束时唤醒会话的那只铃。

装上这个 bundle 就等于装完了全部。工具通过 ctx.tools 注册在 harness 进程内部,所以没有包要安装,没有单独的 profile 要启动,没有 broker 要运行,也没有 MCP server 要拉起。不需要在旁边维持任何进程。

本项目基于 917Dhj/dkitchen。 厨房本身——岗位划分、票的流转、后厨规矩,以及唤醒会话的那只铃——是 917Dhj/dkitchen 的设计,本插件是它到 DeepSeek Harness 插件运行时的移植。见致谢。

安装

从 Discover 安装。 在 harness 中打开 Plugins → Discover,添加这个索引

https://raw.githubusercontent.com/songmingjun3/dsh-kitchen-plugin/main/docs/market/index.json

然后安装 dkitchen。索引里钉死的是本仓库的一个确切 commit,所以你装到的就是某个 release 指明的那一份。

从 release 安装。 在 Releases 下载某个 tag 的源码包,解压后把 Plugins → install bundle 指向这个目录。

两种方式最终都一样:harness 会把 cordis.patch.yml 组合进 profile 并加载 index.js。如果 harness 没有自动加载,重启一次。首次启动时,bundle 还会把初始化 skill 装进机器级的 skill 目录,所以每个项目里都能用 /setup-dkitchen。

如果 bundle 注册某个工具失败,它是静默的——进程照常运行,只是那个工具不见了。在 cordis.patch.yml 里把 debug 设为 true,就能让每次注册都输出到 stderr。

它给会话带来什么

| 分组 | 工具 |
| 会话 | dkitchen_new_session、dkitchen_send、dkitchen_read、dkitchen_info、dkitchen_rename、dkitchen_list_sessions、dkitchen_board、dkitchen_session_status |
| 长任务 | dkitchen_launch、dkitchen_logs、dkitchen_stop、dkitchen_run_status |
| 票 | dkitchen_relay、dkitchen_merge、dkitchen_log、dkitchen_executor_status |
| 监视 | dkitchen_watch、dkitchen_watch_state |
| 配置 | dkitchen_config、dkitchen_check_refs、dkitchen_status |

票相关的工具需要 gh CLI。没有安装时它们会直接说明,其余工具照常工作。

仓库如何配置自己的厨房

每次调用都从会话所在仓库解析 .dkitchen.toml,而不是从 harness 碰巧启动的那个目录——一个 harness 进程服务多个仓库。

repo = "owner/name"

[kitchen]
stations = ["orchestrator", "designer", "verifier", "executor"]

[harness]
default_provider = "trae"
default_model = "deepseek-v4.1-flash"

[models.executor]
model = "deepseek-v4.1-flash"

[approval]
allow = ["dkitchen_"]

dkitchen_status 报告某个仓库解析出了什么,其中 rootSource 说明仓库是怎么确定的:argument、session 或 process。process 意味着仓库是猜出来的,而不是已知的。

两个刻意的行为

[approval] 按规则作答,默认一律交回。 harness 本来就会用自己的面板询问用户,插件如果抢在前面作答,就把这个决定权拿掉了。在 allow 里列出的工具会被直接放行,这正是无人值守的厨房能跑它被配置去跑的事情的原因;其余的一律调用 next() 交回面板。没有 [approval] 段时,插件完全不改变任何权限行为。

后台任务的结束以会话通知的形式送达。 由 ctx.jobs 宣告,所以发起任务的会话不需要轮询。

这个 bundle 增加的页面

client.js 会在 Plugins 中本 bundle 的页面上加一段内容,报告 bundle 是否已安装、是否启用,以及仓库的配置文件在哪里。没有按钮,因为这里没有任何东西需要运行。

目录结构

| 路径 | 作用 |
| index.js | 挂载插件:注入的服务、按每次调用解析配置、注册工具 |
| lib/ | 工具,以及工具背后的规则 |
| kitchen/ | 初始化 skill 渲染进目标仓库的岗位规则 |
| skills/setup-dkitchen/ | 初始化 skill,附一个只依赖 Node 的渲染器 |
| scripts/market.mjs | 生成并校验 docs/market/index.json |
| docs/plugin.md | 用户指南:安装、每个工具、每个 .dkitchen.toml 配置项 |
| tests/ | 测试套件:node --test "tests/.test.mjs" |

本仓库就是这个 bundle:package.json、index.js、lib/ 都在根目录,这也是 market 索引里不写 path 的原因。

开发

node --test "tests/.test.mjs" # 测试套件,无需先安装任何依赖
node scripts/market.mjs index --check

在受限 shell 下的 Windows 上,node --test 无法为每个测试文件派生子进程;这种情况下改用 node --test --experimental-test-isolation=none "tests/.test.mjs"。

发布流程:把 package.json 里的 version 改好,然后推一个与之匹配的 tag(例如 v1.0.0)。release workflow 会校验两者一致、跑测试、为该 tag 的 commit 重新生成 market 索引,并发布 GitHub release。

致谢

这个插件是移植,不是原创设计。它实现的这间厨房——职责固定的岗位、用 GitHub issue 当票来交接工作、每条留言开头固定的状态块、什么时候必须停下发问的规矩,以及长任务退出时唤醒会话的那只铃——都来自 917Dhj/dkitchen。本仓库刻意紧贴它的功能设计:术语、拒绝的条件、以及总编排执行动作的顺序,都力求与之一致。感谢 917Dhj/dkitchen 把这件事想清楚并写了下来。

不同的地方在运行时,不在厨房。那个项目在进程外部驱动 DeepSeek Harness 会话——一个命令行工具、一个 broker、一个 MCP server、一个独立的 profile。本项目把同一批工具通过 ctx.tools 注册在 harness 内部,所以装上 bundle 就装完了。行为上力求保持一致;凡是移植时不得不做选择的地方,选择都记录在做出该选择的那次提交和对应的测试里。

再往前追溯,这个比喻和这套工作流的很多部分还有更早的来源:米其林后厨这个比喻来自 Lauren Tan(Poteto),用 GitHub issue 管票的做法最初改自 Matt Pocock 的 skills 里的 issue tracker 配置。

许可证

MIT
预览分享卡片长什么样 ↓songmingjun3/dsh-kitchen-plugin
分享 · DeepSeek Harness Hub
songmingjun3/dsh-kitchen-plugin

把仓库变成厨房,分派岗位与票并唤醒长任务会话

这是你的仓库?认领条目

回到顶部