把仓库变成厨房,分派岗位与票并唤醒长任务会话
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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
songmingjun3/dsh-kitchen-plugin
把仓库变成厨房,分派岗位与票并唤醒长任务会话
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,792已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,170已汉化DeepSeek 客户端
71
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,041已汉化DSH
70.7
这是你的仓库?认领条目