deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:sikadi233-hub/minecraft-dev
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
Minecraft 开发插件 for DeepSeek Harness (dsh):让 agent 更擅长写 Minecraft 服务端插件与模组,覆盖 MC 1.7.10 ~ 26.3 全时代。适配 dsh ≥ 0.1.5-rc.1(profile/bundle 插件体系;低于此版本请用 0.7.0 及更早版本),覆盖三条线:0.1.5-rc.x(目录形态 preset)、0.1.7-rc.x(agentPresets 声明形态)、0.2.0-rc.x。实测:0.1.5-rc.2 / 0.1.7-rc.1 / 0.2.0-rc.2。
已被 awesome-dsh-plugin 收录(Skills 分类)。
⚠️ dsh 0.2.0 起有插件兼容性门禁(
dsh-app-boot的evaluatePluginCompatibility):导入插件前拿它的@deepseek-ai/dsh/@deepseek-ai/dsh-*peer 声明与运行版本比对,任一条不匹配就拒绝导入整包 —— 不是警告,是拒绝安装/整包被跳过(工具、技能、preset 全部消失,且 App 里可能只表现为"插件装了但没反应")。而 node-semver 无法用单条范围表达"这些线的任意预发布版"(^0.1.5-rc.1即使带includePrerelease也不匹配0.2.0-rc.2),所以 peer 必须逐条枚举;新增 dsh 线时同步加一条,否则插件会静默失效。详见test/peers.test.js。 万一 dsh 又先发了新线而本插件还没跟上,可以用门禁自带的精确版本豁免兜底(自担风险,仅对那一个版本生效):dsh plugin --profile <name> allow-version minecraft-dev@<版本> --dsh-version <运行版本> --accept-risk。
dsh 0.1.7 起 preset 的声明方式变了,本插件两种都支持并在运行时自动选择:0.1.5–0.1.6 的 preset 是
$DSH_HOME/.agent-presets/<id>/目录(插件启动时拷贝,已存在则不覆盖本地修改);0.1.7 起 preset 改为 Cordis 声明行(@deepseek-ai/dsh-agent-preset)交给agentPresets服务,插件随之改用agentPresets.register()提交同一批行(preset/*/rows.js)。两种形态由同一个源生成,并由测试锁死一致。
已发布 npm:minecraft-dev(MIT)| 源码:GitHub
| 技能 | 内容 |
|---|---|
minecraft-java-build |
全时代 Java/Gradle 构建知识:JDK 配对表、wrapper、foojay toolchain、依赖仓库、常见坑 |
minecraft-paper-plugin |
Paper/Spigot 现代线插件(1.20.x / 1.21.x / 26.x)+ 5 份 API 参考 |
minecraft-fabric-mod |
Fabric 模组(loom/loader/fabric-api/yarn 配合)+ 4 份 API 参考 |
minecraft-forge-mod |
传统 Forge 四时代(1.7.10 FG2 / 1.12.2 FG3 / 1.16.5 FG5 / 1.20.1 FG6)+ 3 份时代 API 参考 |
minecraft-neoforge-mod |
NeoForge(1.20.1 legacyforge / 1.21.1 / 1.21.x / 26.2 stable + 26.3 beta-only)+ 3 份 API 参考 |
minecraft-spigot-legacy |
1.7.10 / 1.12.2 老线 Bukkit 插件 + Cauldron/Thermos/Mohist 混合服说明 + 2 份老线 API 参考 |
minecraft-major-mods |
大型模组附属开发:28 个模组条目(1.7.10×10 / 1.12.2×8 / 现代×10,含拔刀剑、神秘时代、匠魂、植物魔法、Create、Botania、AE2、Mekanism、Curios、JEI/REI 等),每条含核实过的 curse.maven 坐标与扩展点 |
minecraft-intake |
任务信息核对(v0.7):用户请求写插件/mod/附属但信息不足时,按场景批量提问(版本/平台/加载器/核心/混合端/兼容性/部署),一次问全、不重复问、授权默认 |
| 工具 | 用途 |
|---|---|
mc_scaffold |
一句话创建完整可构建项目:paper / fabric / forge / neoforge / spigot 五平台,自动配好构建脚本、主类、元数据、时代对应的 Gradle wrapper |
mc_gradle |
在项目里跑 gradlew <task>:终端卡片显示、超时自动杀进程树、输出头尾截断、非零退出码不报错而是可读呈现 |
mc_codex |
只在「Minecraft 架构师」预设里可用:把架构 brief 写到 <项目>/.dsh/codex-architect.md,再用你自己的 Codex CLI 跑一次完全可见的架构会话——默认走官方 codex app-server --stdio 协议(会话会出现在 Codex 桌面版列表里、可续聊),也可 mode: "exec" 退回 codex exec;命令、完整输出、退出码、用时、改动文件、会话 id/线程 id、rollout 路径、token 用量全部回到会话里 |
| 子代理(toolName) | 环节与产出 |
|---|---|
subagent_mc_plan |
A 方案:勘察项目 + web_search 联网查证 → 写 <项目>/PLAN.md + 5 行摘要 |
subagent_mc_skeleton |
B 框架:按 PLAN.md 用 mc_scaffold 搭骨架 + 资源模板 + 测试桩 → 变更清单 |
subagent_mc_content |
C 内容:按 PLAN.md 与骨架填充功能代码 → 变更清单 + 不确定点 |
subagent_mc_verify |
D 编译审查:mc_gradle 编译/测试、修小错 → 验证报告 |
(注:4 个子代理为宿主层工具,任何 preset 会话可见;使用说明见 Minecraft 专家 preset persona。)
| 预设 | 内容 |
|---|---|
minecraft(Minecraft 专家) |
一键切换的专精 agent:standard 全工具集(shell / 文件 / 检索 / 技能 / 计划 / 目标 / 子代理 / 工作流)+ 中文专家人设 + 全局可见的 8 个技能与 4 个内置子代理 subagent_mc_plan/skeleton/content/verify(v0.6.0 起装完插件重启 dsh 后自动安装到 $DSH_HOME/.agent-presets/minecraft/,见下方「Minecraft 专家 agent 的安装」) |
minecraft-architect(Minecraft 架构师(Astra神的瞥视),v0.8.0) |
专家预设逐字节复制后只多两处:一段人设 + 一行 minecraft-dev/codex 模块(注册 mc_codex 工具与 minecraft-codex-architect 技能)。因此专家预设的工具/技能目录完全不变,只有本预设能看到 mc_codex |
分工照搬 Cherry Studio 里的 Architect / Coder 两个智能体(// [TODO: Agent B] 描述 标记就是交接协议):
minecraft-intake 把版本/平台/加载器核对清楚,整理成一段 goal;mc_codex:它把架构 brief 写到 <项目>/.dsh/codex-architect.md(可读可改),然后用你自己的 Codex在项目目录里跑一次架构会话。默认 mode: "app-server",实际执行的是
"…codex.exe" app-server --stdio
协议(thread/start + turn/start,prompt 就是那个文件的内容)——这条命令原样回显在会话里;mode: "exec" 时则是
"…codex.exe" exec - -C "<项目>" -s workspace-write --skip-git-repo-check -o "<项目>/.dsh/codex-last-message.md" < "<项目>/.dsh/codex-architect.md"// [TODO: Agent B] 描述,并额外产出 FILL-SPEC.md(标记位置 × 方法契约 × 构建命令 × UNVERIFIED 清单 × 完成判据);mc_gradle 跑到 build exitCode 0,并确认标记计数为 0。透明度(本预设的硬要求):执行前先声明这一步会消耗你自己的 Codex(订阅账号计入 Codex 用量窗口;API key 计入余额),而且 DSH 侧不会显示这笔消耗;返回完整输出、退出码、用时、改动文件清单、会话/线程 id、rollout 文件路径与 token 用量(从 rollout 的 token_count 事件读,源码写的是 turn/completed 不带 usage);失败不静默重试,委派次数上限为「架构 1 次 + 修复 ≤1 次」。
关于"这次会话在 Codex 桌面版里看得见吗"(实测结论):默认的 mode: "app-server" 看得见——app-server 建的线程是 source = vscode、originator = DeepSeek Harness,实测跑完立刻能被桌面版用的 thread/list {} 查到(同一条 App 侧边栏查询只会返回 vscode/appServer 一类,不返回 exec/cli),所以你可以直接在 App 里点开续聊,或在命令行 codex resume <threadId>。两种模式都会把内容持久化在 ~/.codex/sessions/<年>/<月>/<日>/rollout-…-<id>.jsonl(mc_codex 直接回报这条路径,打开就是 Codex 的完整过程):
mode: "app-server"(默认):桌面版列表可见、可续聊;续接用 codex resume <threadId>。mode: "exec":source = exec、originator = codex_exec,桌面版列表不会显示(App 里没有"显示 CLI 会话"的开关);此时用 codex exec resume <sessionId> "…" 续接。.dsh/codex-architect.md 写好(可只生成不执行),在桌面版新建线程、工作目录选该项目、把内容粘进去跑完,再回来说"架构做完了",DSH 就从磁盘上的 FILL-SPEC.md 与 [TODO: Agent B] 标记接手。state_5.sqlite 的 source/originator:rollout 的 session_meta 写死了 codex_exec,桌面版的 rollout 回填(rollout_migration_state/backfill_state)可能把它改回去,且 App 运行时持有该库。前提:只需要本机装着 Codex(桌面版会顺带提供 CLI;mc_codex 会自己探测 PATH、~/.codex/plugins/.plugin-appserver/、%LOCALAPPDATA%\OpenAI\Codex\bin\<hash>\ 三处)。不用打开 Codex 桌面版——每次都 spawn 一个非交互会话;app-server 模式下的会话结束后会出现在桌面版列表里(想看就开,不想看也不用开)。Codex 探不到/跑失败时,本预设会退回普通做法(自己写或走 A–D 链),并且绝不留下 [TODO: Agent B] 标记。
dsh plugin --profile web add minecraft-dev
国内用户注意:npm 默认源 npmmirror 会在发布后几分钟内同步;若报
ERR_PNPM_FETCH_404说明镜像还没同步,加官方源即可:dsh plugin --profile web add minecraft-dev --registry=https://registry.npmjs.org
cd minecraft-dev && pnpm pack # 产出 minecraft-dev-x.y.z.tgz
dsh plugin --profile web add ./minecraft-dev-0.5.0.tgz
dsh plugin --profile web add /path/to/minecraft-dev
pnpm dsh 不是 dsh只有通过 npm 安装的 dsh(npx @deepseek-ai/dsh 或 npm i -g)才有 dsh 命令。
如果你是从仓库源码跑的(比如 C:\Users\...\deepseek-harness-master),必须:
cd 到 dsh 仓库根目录pnpm dsh 代替 dsh:cd C:\Users\YX-ASUS\Desktop\deepseek-harness-master
pnpm dsh plugin --profile web add minecraft-dev --registry=https://registry.npmjs.org
正在运行的 dsh 不会自动加载新装的插件。装完后:
pnpm dsh web 的窗口按 Ctrl+C 停掉pnpm dsh webpnpm dsh --profile web --dump-config # 应出现 "# == minecraft-dev" 层与七行插件(skills/tools/preset + 4 个 subagent 实例)
dsh plugin --profile web remove minecraft-dev
装完插件重启 dsh 后自动安装,无需手动复制:插件每次启动(挂载)时把自带的 preset/minecraft/ 与 preset/minecraft-architect/(v0.8.0 起)分别复制到 preset 扫描根:
$DSH_HOME/.agent-presets/minecraft/ 与 $DSH_HOME/.agent-presets/minecraft-architect/(默认 C:\Users\<用户>\.dsh\.agent-presets\;设了 DSH_HOME 时以 $DSH_HOME 为准)。agent.cordis.yml 就跳过,绝不覆盖本地修改;目录存在但缺 composition 文件时视为损坏并自动修复。两个预设各自独立跳过,互不影响。$DSH_HOME/.agent-presets/minecraft-architect/ → 重启 dsh → 自动重装(专家预设目录不用动,它本来就不变)。$DSH_HOME/cordis.patch.yml(或 profile 的 cordis.patch.yml)追加:- id: minecraft-preset
config:
autoInstallPreset: false
# 1. 建用户 preset 根(dsh 自动把 ~/.dsh/.agent-presets 追加为 user 根,
# 但目录不存在时发现为空,需先创建)
mkdir -p ~/.dsh/.agent-presets
# 2. 复制 preset 目录(含 preset.yml + agent.cordis.yml)
cp -r <minecraft-dev 仓库>/preset/minecraft ~/.dsh/.agent-presets/
~/.dsh/.agent-presets/minecraft/preset.yml 与 agent.cordis.yml(本机默认 C:\Users\YX-ASUS\.dsh\.agent-presets\minecraft\;设了 DSH_HOME 时以 $DSH_HOME 为准)。packages/preset/agent-presets/presets/):升级会被覆盖;卸载 = 删 ~/.dsh/.agent-presets/minecraft/。Copy-Item -Recurse 等价命令。{{model}} / {{cwd}} 解析)。skill 工具加载对应技能(会话中可见加载卡片)/minecraft-paper-plugin(或其它技能名)创建一个 Paper 插件 my-plugin,包名 com.example.myplugin,MC 1.21.8
创建一个 Forge 1.12.2 模组 mymod,包名 com.example.mymod
写一个植物魔法 1.12.2 附属,注册一种新的花
用 mc_gradle 跑一下当前项目的 build
帮我做个插件 # 信息不足 → agent 会批量提问(版本/平台/核心/兼容/部署),不会直接开工
完整流程:模型加载技能 → 调 mc_scaffold 生成项目(含 wrapper)→ mc_gradle build(或 cmd /c "gradlew.bat build")→ 产出 build/libs/*.jar。
3+ 工作项的新插件/模组任务可用内置四子代理团队(A→B→C→D 委派链);小改动建议 agent 内联完成。示例对话:
用四子代理团队帮我做一个 Paper 插件 my-plugin,包名 com.example.myplugin,MC 1.21.8
<项目>/PLAN.md + 5 行摘要;B(框架)按 PLAN.md 用 mc_scaffold 搭骨架;C(内容)填充功能代码;D(编译审查)用 mc_gradle 构建/测试并出验证报告。前一环未返回不得调下一环。<项目>/PLAN.md 是唯一共享工件:B/C/D 每次重读;宿主改需求 = 先改 PLAN.md 再继续。| 平台 | 支持版本 | Java |
|---|---|---|
| paper | 1.20.x / 1.21.x / 26.2 / 26.3(Paper 侧目前只有 -alpha 构建) |
17 / 21 / 25 |
| fabric | 1.20.1 / 1.21.x / 26.2 / 26.3 | 17 / 21 / 25 |
| forge | 1.7.10 / 1.12.2 / 1.16.5 / 1.20.1 | 8 / 8 / 8 / 17 |
| neoforge | 1.20.1 / 1.21.1 / 1.21.x(1.21.11)/ 26.2 / 26.3(上游只有 -beta) |
17 / 21 / 21 / 25 |
| spigot | 1.7.10 / 1.12.2 | 8 |
26.x 的坐标按版本钉死(26.2 与 26.3 各一套):mod 平台请求一个未钉的版本(如 26.4)会显式报错并列出已钉版本,不会静默给你另一版的项目。26.2 的坐标:fabric loom 1.17.19 / loader 0.19.3 / api 0.157.0+26.2、neoforge moddev 2.0.144 / 26.2.0.59;26.3:fabric loom 1.17.21 / loader 0.19.5 / api 0.161.0+26.3、neoforge moddev 2.0.147 / 26.3.0.12-beta。26.3 的 Java 仍是 25。四组真机构建已跑通(2026-09):paper 26.2(对照)/ paper 26.3 / fabric 26.3 / neoforge 26.3 全部 BUILD SUCCESSFUL。fabric 的 loom 刻意留在 1.17 线:1.18.2 要求 Gradle 自身跑在 Java 25 上(requires at least JVM runtime version 25),会把「用旧 JDK 启动 Gradle」的用户全部挡掉。
JAVA_HOMElibs/README.txt 放置 spigot-api jar(该版本无公共 maven)npm run test # node --test 单测(纯函数,无 dsh 依赖)
npm run check-links # 核对文档链接与 curse.maven projectId(联网;BROKEN=0 为通过)
发布流程由 agent 自动执行(用户 2026-08-31 确认"以后都这样发"):
npm whoami --registry=https://registry.npmjs.org 确认登录;401/404 时先 npm login --auth-type=web --registry=https://registry.npmjs.org(浏览器授权,TTY 下会打印完整 https://www.npmjs.com/auth/cli/... 链接)。npm publish --registry=https://registry.npmjs.org(prepublishOnly 自动跑测试)。npm view <name> version 验证(npm 提示"processing may take a few minutes",验证需稍等)。已知坑(2026-08-31 实测):
npm publish 报 404 PUT /package - Not found(npm 对未授权发布统一回 404 掩码;不是网络问题)。解法:重新 web 登录。409 Cannot publish over previously staged version "X.Y.Z"(上次发布中断残留)。解法:等 staged 过期,或 bump 到下一个版本发布。*** 打码)——需要用户终端操作时明确交给用户。npm run check-links 校验 http(s) 链接与 curse.maven projectId(经 api.cfwidget.com;403 限流等归 UNVERIFIABLE),fileId 仍须以 CurseForge 文件页「Curse Maven 代码」为准。API 更新流程:改 references → npm run check-links → 人工复核 UNVERIFIABLE 项。mc_gradle 依赖目标机存在 taskkill(win32);输出截断为头尾内联标记,不做 spill 文件。~/.dsh/skills/ 等,rank 低于 600)会覆盖本包 bundled 技能——预期行为,冲突时删本地同名目录。-alpha 构建、NeoForge 26.3 只有 -beta,26.2 两边都已 stable)。26.3.build.+ 命中上游 -alpha 构建)、fabric 26.3(23s)、neoforge 26.3(6m43s,NeoForge 26.3.0.12-beta + moddev 2.0.147)。但 Paper 26.3 目前只有 -alpha 构建、NeoForge 26.3 只有 -beta,生产使用前请自行评估;26.2 两边都已 stable。java.toolchain,只写 options.release + source/targetCompatibility —— 环境 JDK 低于目标时(本机默认 Java 22、26.x 线目标 25)直接报「不支持发行版本 25」且无法自举。现在与 paper/neoforge 一致:settings.gradle 带 org.gradle.toolchains.foojay-resolver-convention:1.0.0,build.gradle 用 java { toolchain { languageVersion = JavaLanguageVersion.of(N) } },由 foojay 自动 provision。这是 fabric(含 1.20/1.21 线)长期存在的缺陷,本次因真机构建才暴露。preset.yml + agent.cordis.yml)必须放在仓库的 preset/minecraft/ 子目录——放仓库根目录会把市场类型从 cordis-plugin 误判为 agent-preset。agent.cordis.yml 是 0.1.5/0.1.6 的目录安装源,rows.js 由它生成、供 0.1.7+ 的 agentPresets.register() 使用;test/preset-rows-parity.test.js 锁死两者一致(行 id/name 顺序、标量配置、所有块标量的逐字节文本)。只有两处刻意不同:!!js 平台表达式在 JS 里是真实布尔值,dsh-workflow-worker-thread 在 0.1.7 里换成 dsh-workflow-ptc。web_search + web_fetch(preset 的 tool-web 已设 fetch: true,宿主注册 web_fetch);若部署自定义关闭 fetch,需把 web_fetch 从 A 的 allow 名单移除,否则 restrict() 启动校验会报未知工具。tools.restrict()),未知工具名直接报错——部署裁剪工具集(如禁用 tool-fs/tool-web)时需同步改 cordis.patch.yml 的 allow 名单(报错信息会列出已知全局工具名,可据此调整)。agent.cordis.yml 存在即跳过);关闭开关 autoInstallPreset: false(只影响文件拷贝,不影响 0.1.7 的服务注册);preset 内容更新不会自动传播——需删掉 $DSH_HOME/.agent-presets/minecraft/ 让下次启动重新安装。0.1.7+ 是服务注册,没有文件、没有这个陈旧问题:每次启动都按 rows.js 重新声明。$DSH_HOME/.agent-presets/minecraft/ → 重启 dsh → 自动重装(人设含"信息不足先批量提问"行为规则;不重装则只有技能层生效,行为规则缺失)。重装会覆盖手改——更新前先备份该目录。JAVA_HOME 等):老线(1.7.10/1.12.2/1.16.5)构建失败多为 JDK 8 环境问题而非代码问题,D 环会优先报环境。minecraft-dev/codex 是从 profile 目录解析的,而运行中的 dsh 进程已缓存了旧版 package.json(无 ./codex 导出)与旧 lib/present.js,于是会报 Package subpath './codex' is not defined by "exports" 或 does not provide an export named 'codexCallView'。重装插件后重启 dsh 即可(新进程读的是磁盘上的新清单);重启前的挂载失败不代表文件有问题。preset.yml 用严格 YAML 解析(js-yaml):name/description 里出现 [、]、: 等必须加引号,否则整个元数据块被丢弃,预设会显示成无名且没有 roster 顺序(v0.8.0 开发中踩过:未加引号的 [TODO: Agent B])。mc_codex 的 filesChanged 是按 mtime 扫描项目目录得出的(已跳过 .dsh/.git/node_modules/build/...),因此可能包含子进程自己产生的临时文件(例如 PowerShell 的 ModuleAnalysisCache)——这是如实报告,不是项目文件清单。mc_codex 用的是你自己账号的 Codex,DSH 不会显示这笔消耗(订阅计入用量窗口 / API key 计入余额);技能因此把委派上限写死为「架构 1 次 + 修复 ≤1 次」,且失败不自动重试。mc_codex 的 mode: "app-server" 走官方 codex app-server --stdio(NDJSON JSON-RPC:initialize → initialized → thread/start → turn/start → turn/completed),不经过 shell,所以卡片上的命令是 "…codex.exe" app-server --stdio,实际交互是协议而非命令行;prompt 仍然原样放进 turn/start 的一个 text input,内容就是 .dsh/codex-architect.md。mode: "exec" 则走 cmd.exe /d /s /c + stdin 重定向(POSIX 走 /bin/sh -c):卡片显示的命令就是实际执行的命令。两种模式下 Codex 自身报错(鉴权/额度/网络)都会原样回显,不做归类改写。turn/completed 不带 usage,token 总量只能从 rollout 的 event_msg/token_count/info.total_token_usage.total_tokens 读,所以 mc_codex 会自己去读那个文件的尾部;② 线程的 source 由 app-server 协议决定(实测为 vscode,originator = 客户端名 DeepSeek Harness),不能用参数指定(sessionStartSource 只接受 startup/clear,codex exec resume --thread-source vscode 也不会改已有线程的 source)。codex exec 线程在 state_5.sqlite 里是 source='exec'、has_user_event=0,而桌面版侧边栏的 thread/list 带固定 sourceKinds 白名单(只含 vscode/appServer 一类),所以 App 里找不到;这也是 mc_codex 默认改用 app-server 模式的原因——该模式下线程是 source='vscode',实测跑完立刻出现在默认 thread/list 结果里。mode: "exec" 时仍额外回报 rolloutPath,续接用 codex exec resume <id> "…"。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。