保存并后台运行 JavaScript 工作流,随时查看记录
27.7/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/11 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add zaalipro/dsh-workflows该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · security
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 43 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/11) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 118 处,展示前 81 条)
- 读取本地文件lib/types/index.js:54
const value = JSON.parse(readFileSync(path, 'utf8')); - 读取本地文件lib/types/registry/index.js:95
const info = await localLstat(path); - 读取本地文件lib/types/registry/index.js:124
const info = await localLstat(path, { bigint: true }); - 读取本地文件lib/types/registry/index.js:366
const entries = (await localReaddir(root.path, { withFileTypes: true })) - 写入本地文件lib/types/registry/index.js:712
await localMkdir(root.path, { recursive: true, mode: 0o700 }); - 写入本地文件lib/types/registry/index.js:713
await localChmod(root.path, 0o700).catch(() => undefined); - 删除本地文件lib/types/registry/index.js:759
await localUnlink(temp); - 删除本地文件lib/types/registry/index.js:840
await localUnlink(temp); - 删除本地文件lib/types/registry/index.js:862
await localUnlink(temp).catch(() => undefined); - 删除本地文件lib/types/registry/index.js:870
await localUnlink(temp).catch(() => undefined); - 读取本地文件lib/types/commands/index.js:141
const text = readFileSync(candidate, 'utf8'); - 读取本地文件lib/types/tool/index.js:546
const canonical = await localLstat(processPath, { bigint: true }); - 读取本地文件lib/types/tool/index.js:566
const finalPath = await localLstat(target.displayPath, { bigint: true }); - 读取本地文件lib/types/registry/roots.js:45
const info = await nodeLstat(path); - 写入本地文件lib/types/supervisor/storage/run-files.js:112
await mkdir(this.path, { recursive: true, mode: 0o700 }); - 读取本地文件lib/types/supervisor/storage/run-files.js:121
: (await readdir(this.path)).sort().map(name => ({ name, type: 'file' })); - 读取本地文件lib/types/supervisor/storage/run-files.js:140
const size = identity?.size ?? (await lstat(join(this.path, name))).size; - 发起网络请求lib/client-types/controller.js:319
const request = this.request(state); - 发起网络请求lib/client-types/controller.js:395
const request = this.request(state, supplied); - 发起网络请求lib/client-types/controller.js:460
const request = this.request(state, supplied); - 写入剪贴板lib/client-types/WorkflowMemberInspector.js:100
async function writeClipboard(text) { - 写入剪贴板lib/client-types/WorkflowMemberInspector.js:104
await navigator.clipboard.writeText(text); - 写入剪贴板lib/client-types/WorkflowMemberInspector.js:114
void writeClipboard(text).then(ok => { setState(ok ? 'copied' : 'failed'); }); - 读取本地文件lib/types/supervisor/storage/lease.js:56
const entry = await lstat(lexical); - 读取本地文件lib/types/supervisor/storage/lease.js:70
const info = await lstat(current); - 读取本地文件lib/types/supervisor/storage/lease.js:75
const resolved = await realpath(current); - 读取本地文件lib/types/supervisor/storage/lease.js:101
rootInfo = await lstat(root); - 写入本地文件lib/types/supervisor/storage/lease.js:113
await mkdir(root, { mode: 0o700 }); - 读取本地文件lib/types/supervisor/storage/lease.js:119
rootInfo = await lstat(root); - 读取本地文件lib/types/supervisor/storage/lease.js:132
const currentAnchor = await lstat(anchorPath); - 读取本地文件lib/types/supervisor/storage/private-root.js:136
const current = await lstat(this.path); - 读取本地文件lib/types/supervisor/storage/private-root.js:161
const existing = await lstat(childPath); - 写入本地文件lib/types/supervisor/storage/private-root.js:170
await mkdir(childPath, { mode: 0o700 }); - 写入本地文件lib/types/supervisor/storage/private-root.js:174
await chmod(childPath, 0o700); - 读取本地文件lib/types/supervisor/storage/private-root.js:178
const pathInfo = await lstat(childPath); - 读取本地文件lib/types/supervisor/storage/private-root.js:196
const entries = await readdir(this.path, { withFileTypes: true }); - 读取本地文件lib/types/supervisor/storage/private-root.js:201
const info = await lstat(join(this.path, entry.name)); - 读取本地文件lib/types/supervisor/storage/private-root.js:213
const info = await lstat(join(this.path, name)); - 删除本地文件lib/types/supervisor/storage/private-root.js:242
await unlink(target); - 删除本地文件lib/types/supervisor/storage/private-root.js:256
await rmdir(target); - 写入本地文件lib/types/supervisor/storage/private-root.js:282
await rename(sourcePath, destinationPath); - 删除本地文件lib/types/supervisor/storage/private-root.js:391
await unlink(temp); - 写入本地文件lib/types/supervisor/storage/private-root.js:394
await rename(temp, target); - 删除本地文件lib/types/supervisor/storage/private-root.js:410
await unlink(temp).catch(() => undefined); - 写入本地文件lib/types/supervisor/storage/private-root.js:747
await mkdir(childPath, { mode: 0o700 }); - 写入本地文件lib/types/supervisor/storage/private-root.js:748
await chmod(childPath, 0o700); - 读取本地文件lib/types/supervisor/storage/manifest-store.js:98
const info = await lstat(path); - 写入本地文件lib/types/supervisor/storage/manifest-store.js:105
await mkdir(path, { recursive: true, mode: 0o700 }); - 读取本地文件lib/types/supervisor/storage/manifest-store.js:106
const info = await lstat(path); - 读取本地文件lib/types/supervisor/storage/manifest-store.js:128
const info = await lstat(path); - 读取本地文件lib/types/supervisor/storage/manifest-store.js:133
for (const name of (await readdir(path)).sort()) { - 读取本地文件lib/types/supervisor/storage/manifest-store.js:135
const before = await lstat(join(path, name)); - 读取本地文件lib/types/supervisor/storage/manifest-store.js:140
const beforeRemove = await lstat(path); - 删除本地文件lib/types/supervisor/storage/manifest-store.js:143
await rmdir(path); - 删除本地文件lib/types/supervisor/storage/manifest-store.js:151
await unlink(path); - 写入本地文件lib/types/supervisor/storage/manifest-store.js:540
await rename(from, to); - 删除本地文件lib/types/supervisor/storage/manifest-store.js:577
await unlink(join(this.options.runsRoot, ...parts, name)).catch(error => { if (error.code !== 'ENOENT') - 删除本地文件lib/types/supervisor/storage/manifest-store.js:1055
await unlink(path); - 写入本地文件lib/types/supervisor/storage/manifest-store.js:1379
await rename(stage, run); - 读取本地文件lib/types/supervisor/storage/recovery.js:18
info = await lstat(path); - 读取本地文件lib/types/supervisor/storage/recovery.js:32
const names = (await readdir(path)).sort(); - 读取本地文件lib/types/supervisor/storage/recovery.js:105
names = (await readdir(categoryPath)).sort(); - 写入本地文件lib/types/supervisor/storage/bounded-file.js:121
await mkdir(parent, { recursive: true, mode: 0o700 }); - 读取本地文件lib/types/supervisor/storage/bounded-file.js:135
await lstat(path); - 读取本地文件lib/types/supervisor/storage/bounded-file.js:145
const current = await lstat(path); - 删除本地文件lib/types/supervisor/storage/bounded-file.js:164
await unlink(temp); - 写入本地文件lib/types/supervisor/storage/bounded-file.js:167
await rename(temp, path); - 读取本地文件lib/types/supervisor/storage/bounded-file.js:169
const published = await stat(path); - 删除本地文件lib/types/supervisor/storage/bounded-file.js:183
await unlink(temp).catch(() => undefined); - 写入本地文件lib/compat-engine/index.js:1190
await mkdir(dir, { - 读取本地文件lib/compat-engine/index.js:1194
const directory = await lstat(dir); - 写入本地文件lib/compat-engine/index.js:1196
await chmod(dir, 448); - 读取本地文件lib/compat-engine/index.js:1199
for (const entry of await readdir(dir, { withFileTypes: true })) { - 读取本地文件lib/compat-engine/index.js:1218
const before = await lstat(path); - 写入本地文件lib/compat-engine/index.js:1285
await rename(target, backup); - 删除本地文件lib/compat-engine/index.js:1293
await rm(temporary); - 删除本地文件lib/compat-engine/index.js:1299
await rm(backup); - 删除本地文件lib/compat-engine/index.js:1309
if (!published) await rm(temporary, { force: true }).catch(() => {}); - 读取本地文件lib/compat-engine/index.js:1321
before = await lstat(path); - 读取本地文件lib/compat-engine/index.js:1372
const current = await lstat(path); - 读取本地文件lib/compat-engine/index.js:1377
const current = await lstat(state.dir);
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/cordis-plugin-group@deepseek-ai/cordis-plugin-hmr@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh@deepseek-ai/dsh-agent@deepseek-ai/dsh-anonymous-user-id@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 保存并后台运行工作流
- 查看运行记录
- 斜杠命令调用
DeepSeek 工作流,用法和 grok build 命令行一模一样。给 DeepSeek Harness 加上 /create-workflow 和 /workflows 斜杠命令
README
由 DeepSeek 最新模型翻译生成@zaalipro/dsh-workflows
@zaalipro/dsh-workflows@0.1.0-rc.5 是一个可安装的 DeepSeek Harness bundle,提供已保存的 JavaScript workflow、受监督的后台运行、保留记录检查、斜杠命令和 Web 仪表盘。它面向官方 DeepSeek Harness 0.1.2-rc.1,并附带一个由本包拥有、采用 MIT 许可的 compatibility evaluator,以提供 replay-safe background execution;它不包含任何 Grok CLI 代码、账户、配额、二进制文件、协议或运行时依赖,也不包含 Rhai 解析器或求值器。
兼容性
已验证的 Host 是官方 DeepSeek Harness 0.1.2-rc.1。Plugin 0.1.0-rc.5 针对该精确版本编译并完成 smoke test,其直接 Harness peer dependency 也精确锁定在该版本。原版 0.1.0-rc.8 仍不受支持;更高 Harness 版本需要新的已验证 plugin release。
本包要求 Node ^22.19.0 || >=24.0.0,使用 pnpm@11.7.0,并按 MIT license 发布。原生锁依赖的归属信息见 NOTICE.md。
展开完整文档(README 剩余 1 节)
@zaalipro/dsh-workflows
@zaalipro/dsh-workflows@0.1.0-rc.5 是一个可安装的 DeepSeek Harness bundle,提供已保存的 JavaScript workflow、受监督的后台运行、保留记录检查、斜杠命令和 Web 仪表盘。它面向官方 DeepSeek Harness 0.1.2-rc.1,并附带一个由本包拥有、采用 MIT 许可的 compatibility evaluator,以提供 replay-safe background execution;它不包含任何 Grok CLI 代码、账户、配额、二进制文件、协议或运行时依赖,也不包含 Rhai 解析器或求值器。
兼容性
已验证的 Host 是官方 DeepSeek Harness 0.1.2-rc.1。Plugin 0.1.0-rc.5 针对该精确版本编译并完成 smoke test,其直接 Harness peer dependency 也精确锁定在该版本。原版 0.1.0-rc.8 仍不受支持;更高 Harness 版本需要新的已验证 plugin release。
本包要求 Node ^22.19.0 || >=24.0.0,使用 pnpm@11.7.0,并按 MIT license 发布。原生锁依赖的归属信息见 NOTICE.md。
安装
先确保 service user 的 PATH 中有 pnpm。像其他 profile plugin 一样安装固定 release tag;它增加一个依赖和一个名为 @zaalipro/dsh-workflows 的 bundle 层,无需手动 profile patch 或 install-time build。
dsh plugin --profile web add github:zaalipro/dsh-workflows#v0.1.0-rc.5
dsh plugin --profile headless add github:zaalipro/dsh-workflows#v0.1.0-rc.5
也可以把 exact tested tarball 复制到 durable path(不要使用 /tmp)后安装:
dsh plugin --profile web add /absolute/path/zaalipro-dsh-workflows-0.1.0-rc.5.tgz
dsh plugin --profile headless add /absolute/path/zaalipro-dsh-workflows-0.1.0-rc.5.tgz
0.1.0-rc.5 在 npm 公开发布后,可以使用等价的 registry install:
dsh plugin --profile web add @zaalipro/dsh-workflows@0.1.0-rc.5
dsh plugin --profile headless add @zaalipro/dsh-workflows@0.1.0-rc.5
Web 会加载 Host 产品和浏览器 Client;headless 只加载 Host 产品,绝不求值浏览器代码。Plugin 不修改 stock ctx.workflowEngine。Supervisor 私下使用本包拥有的 compatibility evaluator,其产物为 lib/compat-engine/index.js 与 worker.cjs。
移除
同时移除依赖和 bundle 条目,然后重启 profile:
dsh plugin --profile web remove @zaalipro/dsh-workflows
dsh plugin --profile headless remove @zaalipro/dsh-workflows
移除后,未修改的官方 profile 可以启动;该命令不会就地改写官方 profile 文件。
已保存定义与创作
定义和运行是不同资源。定义是扁平的 UTF-8 <name>.workflow.json 文件,按以下顺序选择第一个胜出的根:已配置的 bundled 根、最近 Git 项目根的 .dsh/workflows 目录(没有 Git 根时使用 Session cwd),最后是 $DSH_HOME/workflows。根不存在是合法情况;已观察到的匹配文件若不安全、格式错误、过大、为链接或存在其他无效情况,整个观察会失败,而不是从目录中静默消失。
每个文件只包含作为数据的 metadata 和一个纯 JavaScript body:
{
"meta": {
"name": "review-changes",
"description": "Review a change and verify the findings",
"whenToUse": "Before merge",
"phases": [
{ "title": "Review" },
{ "title": "Verify" }
]
},
"script": "phase(\"Review\");\nconst review = await agent(\"Review the requested change. Return evidence.\", { label: \"reviewer\", phase: \"Review\" });\nif (review === null) complete({ ok: false, reason: \"review failed\" });\nphase(\"Verify\");\nconst verified = await agent(Verify this review against the workspace:\\n${review}, { label: \"verifier\", phase: \"Verify\" });\ncomplete({ ok: verified !== null, review, verified });"
}
名称采用小写 kebab-case,以字母开头,不超过 64 个 UTF-16 code unit,与文件名 stem 一致,并避开命令保留名和 Windows 设备名。运行 /create-workflow [detail] 可调用已安装的创作 skill;它会收集意图与 fan-out,用 JSON data 保存 metadata 并编写 JavaScript,使用 canned agent result 验证一个有代表性的 args-selected path,而且只在 smoke check 成功后保存。Inline tool call 默认使用 save_scope: "project",也可用 save_scope: "user" 保存到 $DSH_HOME/workflows;user scope 不要求 Session cwd。完整 hook 与 quota 参考见已安装的创作 skill。
Structured agent() schema 可以在 array 节点上使用包含端点的 minItems 与 maxItems bound。每个 bound 必须是非负 safe integer(不能是 -0),minItems 不得超过 maxItems,且两个 keyword 都不能与 oneOf 并列。Evaluator 会在 child 启动前检查 declaration,并再次检查返回值;stock-RC2 adaptation 只会从 provider-facing schema 副本中移除这两个 keyword。
启动与操作
使用 /workflow <name> [<json-args>] 或生成的 /<name> [<json-args>] alias 启动已保存定义。普通命令会保留冲突的裸名称;workflow 会取得第一个可用的重复前缀 alias,例如 /workflow-review-changes,而 /workflow review-changes 始终可用。启动会立即返回 Started workflow "<display-name>" in the background. Open /workflows to watch it.;同一 metadata name 的后续运行使用 review-changes-2 等 display handle,不暴露内部 id。
在 Web 中,裸 /workflow 打开已保存定义选择器;严格的裸 /workflows 是仅由浏览器处理的 slash action,它打开 dashboard,不产生 Host command lifecycle,也不会唤醒模型。参数和附件会在本地被拒绝并保留在 composer 中。在 headless 中,裸 /workflow 输出 usage;由于不存在 dashboard surface,/workflows 不注册为 Host command。仪表盘列出已保存 definition(可 Start),以及 live 与 retained run、phase、agent spend、member outcome、log、terminal result 和分块 scratch artifact。Pause、Resume、Stop 与符合条件的 Save action 都检查 revision;键盘操作和窄屏 drill-down 同样可用。
符合条件的 terminal run 最多尝试一次 owner-visible completion notice。它优先使用有界的 scratch/report.md,否则使用有界 result preview,并以 Open /workflows to inspect the run. 结尾。Notice 会直接追加到 durable Session surface,因此无需唤醒模型或进入 Agent inbox 即可显示。Notice delivery 是 at most once:进程故障可能导致 notice 缺失,但不会重试已 claimed、delivered 或 abandoned 的 notice。
Replay、恢复与安全
Pause 和 Resume 仅限同一进程(same-process only)。attempt result settle 且 disposal 排空已接纳的 child 与 scratch work 后,package evaluator 的 quiescent checkpoint 是唯一 replay authority。匹配且已提交的 journal call 会 replay,不再次消耗 agent,也不重复其已提交 effect;observer event 不是 authority。若外部 effect 的结果尚未提交,它可能再次执行,因此 effectful prompt 与 verification step 必须保持幂等。
await_user() 会继续同一个已确认 attempt 并提交该 gate;pause() 不提交,在 replay 后条件仍成立时会重新触发。budget-limited run 不能通过人工 control 恢复:model tool 必须使用内部 resume token,并提供比旧 total 更大且不超过 1,024 的绝对 agent_budget。
进程退出会把每个 retained active row 转换为不可恢复的 Interrupted,取消界面上仍在运行的 member,并且只恢复 inspection data。系统不会跨进程重建 Agent、args、script authority、journal、checkpoint、gate、child reference 或 effect claim;Interrupted run 不能 Resume 或 Save。
version-2 store 位于 $DSH_HOME/workflow-runs。一个永久 .workflow-storage.lock anchor 在 Host 生命周期内持有 native advisory lease;第二个协作进程会收到 workflow storage root is already owned by another live process。descriptor-rooted identity、owner、mode、type 和 link 检查都会 fail closed。该 lease 只协调同一用户下相互协作的 Host;它不能防御以同一 OS 用户运行、忽略 lease 或替换 anchor 的恶意进程。
Workflow script 与现有 model shell access 具有相同的 trust premise。worker 和 node:vm 用于塑造可用 API 并隔离 host event loop,但不是 hostile-code security sandbox。
限制
- Workflow body 是支持 top-level await 的纯 JavaScript;不存在 Rhai language path。
- Workflow script 不提供嵌套 workflow() hook。
- 不提供 cross-process execution resume 或 exactly-once external effect。
- 本包不会以任何形式联系或复用 Grok CLI。
- Validate-only 会编译完整 script,但只执行一个使用 canned output 的 args-selected path;它不覆盖所有 branch、live tool 或所有可能的 agent response。
文档
- 用户指南 — 创建、验证、启动、检查、控制 workflow 并排查故障。
- 架构 — Host/Client composition、lifecycle authority、storage、Remote paging 和 package build。
- 测试与发布验收 — 自动化证据与最终人工 Web checklist。
- 已安装的创作 skill — JavaScript global、schema、budget、scratch 和安全创作模式。
- License 与原生依赖 notice。
- 官方 Harness 0.1.2-rc.1 提供 Host、Agent、Session、provider 与 Client service。Plugin compatibility evaluator 私下拥有 deferred-start、journal、gate、scratch 与 checkpoint protocol。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
zaalipro/dsh-workflows
保存并后台运行 JavaScript 工作流,随时查看记录
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 415,267已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,414已汉化MCP
71.9
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 967已汉化DSH
71.6
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,756已汉化DSH
70.8
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 649已汉化DSH
70.7