dsh-plugin-deploy
Ship a project to Cloudflare and publish your plugin to npm — the first deploy needs no cloud account, and credentials never reach the model.
Install
dsh plugin --profile web add dsh-plugin-deploy
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
<h1 align="center">dsh-plugin-deploy</h1>
<p align="center">
<b>一句话把项目发到 Cloudflare,一句话把插件发到 npm。</b><br>
DeepSeek Harness 插件 · 没有云账号也能拿到线上地址 · 凭据模型看不到
</p>
<p align="center">
<a href="https://www.npmjs.com/package/dsh-plugin-deploy"><img alt="npm" src="https://img.shields.io/npm/v/dsh-plugin-deploy?color=cb3837&logo=npm" /></a>
<a href="LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-blue.svg" /></a>
<a href="https://deepseek-harness.github.io/deepseek-harness/"><img alt="harness" src="https://img.shields.io/badge/harness-0.2.1--rc.2-4c1?logo=deepseek" /></a>
<img alt="tests" src="https://img.shields.io/badge/tests-118%20passed-brightgreen" />
<img alt="tracks" src="https://img.shields.io/badge/track-Host%20%2B%20Web%20UI-8957e5" />
<a href="https://dsh.pub/en/plugins/?q=Octo-o-o-o%2Fdsh-plugin-deploy"><img alt="dsh.pub" src="https://dsh.pub/api/badges/Octo-o-o-o/dsh-plugin-deploy.svg" /></a>
</p>
<p align="center">
<b>简体中文</b> · <a href="README.en.md">English</a>
</p>
你:帮我把这个网站发出去
Agent:调用 deploy 工具 …
┌─────────────────────────────────────────┐
│ 临时预览地址 │
│ https://my-site.breezy-broom.workers.dev │
│ ⏱ 必须认领,否则会被删除 · 剩余 60 minutes │
│ [打开认领链接] │
└─────────────────────────────────────────┘
没有 Cloudflare 账号也能拿到能打开的线上地址。 这不是模拟——用的是 Cloudflare 官方为 AI agent 设计的临时预览账号。
目录
- [它解决什么问题](#它解决什么问题)
- [30 秒开始](#30-秒开始)
- [能力一:把项目部署到 Cloudflare](#能力一把项目部署到-cloudflare)
- [能力二:把你做的 dsh 插件发布出去](#能力二把你做的-dsh-插件发布出去)
- [不想打字?会话标题旁有个按钮](#不想打字会话标题旁有个按钮)
- [配置凭据](#配置凭据)
- [它为什么会打断你](#它为什么会打断你)
- [安全设计](#安全设计)
- [已知限制](#已知限制)
- [常见问题](#常见问题)
- [从源码开发](#从源码开发)
- [致谢与相关项目](#致谢与相关项目)
- [License](#license)
它解决什么问题
AI 帮你写完了一个网站、一个 Worker、一个插件——然后卡在最后一公里:
你想做的事 · 没有这个插件时 · 有了之后
把刚做好的页面发出去看看 · 注册 Cloudflare → 建项目 → 装 wrangler → 写配置 → 调试认证 · 说一句「发出去」,拿到 URL
部署到自己的账号 · 每次都要处理认证状态、写 wrangler.jsonc · 存一次 token 引用名,之后一句话
把做好的 dsh 插件发布 · 手动检查 9 处易错点 → npm pack 看清单 → npm publish 撞 2FA · 一条命令,校验不过就不让发
而且它不会为了省事牺牲安全:token 永远不进对话、不进日志;对外发布一定要你点确认。
30 秒开始
# 装进你的 dsh profile(需要 pnpm 在 PATH 上) npx @deepseek-ai/dsh@0.2.1-rc.2 plugin --profile web add dsh-plugin-deploy@0.2.2 # 启动 npx @deepseek-ai/dsh@0.2.1-rc.2 web
桌面版可在插件市场更新,或使用桌面版附带的 CLI:dsh plugin --profile desktop add dsh-plugin-deploy@0.2.2。先确认 dsh --version;PATH 中的旧 CLI 可能与桌面版不同。
然后在对话里说:
帮我把 ./my-site 这个目录发出去
就这样。首次不需要任何账号——插件会走 Cloudflare 的临时预览账号,几十秒后给你一个能打开的地址。
[!NOTE]
需要本机装了 Wrangler ≥ 4.102.0(临时预览要求)。没装的话插件会告诉你怎么装,不会闷头失败。
[!TIP]
刚发布的新版本装不到? pnpm 有minimumReleaseAge供应链保护,新版本在冷却期内不会被自动选中——add dsh-plugin-deploy可能装到上一个版本。想立刻用最新版就显式指定:add dsh-plugin-deploy@0.2.2。
能力一:把项目部署到 Cloudflare
插件提供工具 deploy 与斜杠命令 /deploy。
两种模式,自动选,也可以指定
模式 · 适合谁 · 拿到什么 · 需要账号吗
temporary 临时预览 · 想立刻看效果、还没有 Cloudflare 账号 · *.workers.dev 地址 + 60 分钟认领窗口 · ❌ 不需要
account 自有账号 · 要长期在线的正式地址 · 你账号下的持久 URL · ✅ 需要(token 或已 wrangler login)
默认 auto:本机已认证就走 account,没认证就走 temporary。想强制某一种,直接说「用临时预览」或「发到我的账号」。
关于临时预览,你必须知道的
这是 Cloudflare 官方能力(Claim deployments),文档里明写是为 AI agent 场景设计的。但有个硬约束:
[!WARNING]
60 分钟内不认领,Cloudflare 会删除该临时账号及其全部资源。
插件会在结果卡片里显示倒计时和认领链接,并在下次部署时提醒你还有未认领的记录。
认领链接本身是一种凭据,它会出现在会话记录里——别把这个会话分享出去。
插件在文案上严格区分:临时预览叫「临时预览地址」,绝不说成「已上线」。
支持的项目形态
- 纯静态目录(
index.html等) - Vite 类构建产物(
dist/) - 已有
wrangler.jsonc/wrangler.toml/wrangler.json的 Worker 项目
检测不出来时会问你,不会瞎猜。没有 wrangler 配置的项目,插件会临时生成一份——写在系统临时目录,不往你的仓库里塞文件。
能力二:把你做的 dsh 插件发布出去
插件提供工具 publish_plugin 与斜杠命令 /publish-plugin。
这部分是给插件作者用的:你用 dsh 写了个插件,想让别人装得上。
三种模式
check # 只校验,不执行包脚本、不改项目文件(默认) pack # 校验通过 → 打出 .tgz npm # 校验通过 + 你点确认 → 发布到 npm
校验才是重点
生态里大量插件「装上了但不激活」「npm 发布漏文件」「GitHub 装下来缺 lib/」。发布前这 9 条会逐项检查:
检查 · 拦住什么
dsh-compat · 使用当前宿主的兼容性规则检查 engines.dsh(优先)或 DSH peer 范围,拦住新版安装拒绝
dsh-plugin · 没有 dsh.bundle.patch → 装了不激活,只有一行 stderr 警告
patch-in-pack · patch 文件没进 npm 包 → 同上,但更隐蔽
client-bundle · lib/client.js 不是 factory 形态或 id 不匹配 → 浏览器报 loaded without registering
main-entry · 主入口没进包
deps · 残留 workspace: 协议 → 用户装不上;@deepseek-ai/dsh* 写成 0.0.x → 装到旧 train
pack-clean · .env / .npmrc / 私钥 / node_modules 混进发布包
version-available · 版本号已被占用
scan · 如果你的仓里装了 dsh-plugin-assistant,顺带跑一遍它的规则扫描
任何一条不过,pack 和 npm 都不执行(fail closed)。
检查、打包和发布均不会执行目标包的生命周期脚本;请先构建 lib/ 等发布产物,再调用本工具。
发布到 npm
你:把这个插件发布到 npm Agent:[9 条校验全过] → [审批:即将发布 xxx@0.1.0 到公共仓库] → 你点「允许一次」→ 发布
npm 的 token 处理和别的工具不同——它不读环境变量。插件的做法是:临时 .npmrc 里只写 ${DSH_NPM_TOKEN} 这个引用,真值经进程环境传给 npm,用完删除。不碰你的 ~/.npmrc,token 不落盘。
[!TIP]
本插件非交互式直接发布需要具有发布权限且开启 Bypass 2FA 的 granular token,并须符合账号、组织和包的策略。设置较短有效期,用完撤销;策略禁止绕过二次验证时,改用终端交互式发布或 npm 官方 staging 流程,当前插件不支持 staging。参见 npm 直接发布要求。
不想打字?会话标题旁有个按钮
装好后,会话标题旁边的动作栏会多出一个 发布 按钮(点开是两个选项):
选项 · 等价于你手打
部署到 Cloudflare · 「把当前工作区部署到 Cloudflare」
检查插件发布 · 「检查当前工作区能否作为 dsh 插件发布」
[!IMPORTANT]
按钮不会绕过 agent 直接执行。它做的是把这句话写进输入框并提交——之后一切照常:模型调工具、条款确认、审批、结果卡片、会话记录,一个不少。
这是刻意的。dsh 的approval.request()强制要求在开启的 agent turn 内调用(源码原文:the approval/asked + approval/decided audit pair must be turn-enclosed)。UI 直接触发的动作既拿不到审批,也不会留下会话记录——对不可逆的对外动作,那是不能接受的。
它对哪个目录生效? 按钮不硬编码路径,用的是当前会话的工作区。所以:
- 想让它直接可用 → 把会话工作区选成你的项目 / 插件仓
- 工作区是个容器目录(比如
~/WorkSpace)→
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::7,最后更新 2026-10-22