一键创建临时文件夹并统一管理,用完安全清理
31.3/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add s0meb0dy3/dsh-scratch-workspace该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 159 处,展示前 66 条)
- 写入本地文件host.js:33
await mkdir(directory, { recursive: true }); - 写入本地文件host.js:36
await rename(target, finalPath); - 读取本地文件host.js:48
const exists = async (value) => access(value, constants.F_OK).then(() => true, () => false); - 写入本地文件host.js:151
await fs.mkdir(this._stateDir, { recursive: true, mode: 448 }); - 读取本地文件host.js:152
const stat2 = await fs.lstat(this._stateDir, { bigint: true }); - 读取本地文件host.js:154
this._stateDir = await fs.realpath(this._stateDir); - 读取本地文件host.js:216
const stat2 = await fs.lstat(this._stateDir, { bigint: true }); - 读取本地文件host.js:217
if (!stat2.isDirectory() || stat2.isSymbolicLink() || !sameIdentity(stat2, this._stateIdentity.dev, this._stateIdentity.ino) || await fs.realpath(this - 读取本地文件host.js:243
const tempStat = await fs.lstat(temp, { bigint: true }); - 写入本地文件host.js:245
await fs.rename(temp, destination); - 删除本地文件host.js:258
await fs.unlink(temp); - 写入本地文件host.js:326
await fs.mkdir(rootDirectory, { recursive: true }); - 写入本地文件host.js:333
await fs.mkdir(directory, { mode: 448 }); - 删除本地文件host.js:379
if (await this._assertOwned(record, true)) await fs.rm(record.path, { recursive: true, force: false }); - 删除本地文件host.js:381
await fs.rmdir(record.path); - 读取本地文件auto.test.js:10
const base=await fs.realpath(await fs.mkdtemp(path.join(os.tmpdir(),'dsh-scratch-auto-')));process.env.DSH_SCRATCH_TRASH_DIR=path.join(base,'trash'); - 读取本地文件auto.test.js:26
finally{await service.close();assert.ok(path.isAbsolute(base)&&path.dirname(base)===await fs.realpath(os.tmpdir())&&path.basename(base).startsWith('ds - 读取本地文件auto.test.js:29
const exists=async p=>{try{return (await fs.stat(p)).isDirectory();}catch(e){if(e.code==='ENOENT')return false;throw e;}}; - 读取本地文件auto.test.js:51
const r=await service.create();await service.close();const file=path.join(stateDir,'tasks.json');const data=JSON.parse(await fs.readFile(file,'utf8')) - 写入本地文件auto.test.js:52
data.settings.autoCleanupEnabled=true;delete data.tasks[0].cleanupPolicy;delete data.tasks[0].lastActivityAt;await fs.writeFile(file,JSON.stringify(da - 删除本地文件auto.test.js:113
store._removeAuthorizedDirectory=async record=>{const marker=path.join(record.path,'.dsh-scratch-owner.json');assert.equal(path.dirname(marker),r.path - 读取本地文件build.mjs:16
hash.update(await readFile(`${here}${name}`)); - 读取本地文件build.mjs:28
locked = JSON.parse(await readFile(LOCK, 'utf8')).sources; - 读取本地文件build.mjs:34
await readFile(`${here}host.js`); - 写入本地文件build.mjs:67
await writeFile(LOCK, `${JSON.stringify({ sources }, null, 2)}\n`); - 写入本地文件core.js:93
await fs.mkdir(this._stateDir, { recursive: true, mode: 0o700 }); - 读取本地文件core.js:94
const stat = await fs.lstat(this._stateDir, { bigint: true }); - 读取本地文件core.js:96
this._stateDir = await fs.realpath(this._stateDir); - 读取本地文件core.js:145
const stat = await fs.lstat(this._stateDir, { bigint: true }); - 读取本地文件core.js:146
if (!stat.isDirectory() || stat.isSymbolicLink() || !sameIdentity(stat, this._stateIdentity.dev, this._stateIdentity.ino) || await fs.realpath(this._s - 读取本地文件core.js:171
const tempStat = await fs.lstat(temp, { bigint: true }); - 写入本地文件core.js:174
await fs.rename(temp, destination); - 读取本地文件core.js:180
try { leftover = await fs.lstat(temp, { bigint: true }); } - 删除本地文件core.js:184
await fs.unlink(temp); - 写入本地文件core.js:250
await fs.mkdir(rootDirectory, { recursive: true }); - 写入本地文件core.js:257
await fs.mkdir(directory, { mode: 0o700 }); - 删除本地文件core.js:287
if (await this._assertOwned(record, true)) await fs.rm(record.path, { recursive: true, force: false }); - 删除本地文件core.js:290
await fs.rmdir(record.path); - 读取本地文件core.test.js:9
const absent = async target => assert.rejects(fs.lstat(target), { code: 'ENOENT' }); - 读取本地文件core.test.js:16
const base = await fs.realpath(allocated); - 读取本地文件core.test.js:17
const tempRoot = await fs.realpath(os.tmpdir()); - 删除本地文件core.test.js:28
const remove = async target => { intended(target); await fs.rm(target, { recursive: true, force: true }); }; - 写入本地文件core.test.js:29
const move = async (source, destination) => { intended(source); intended(destination); await fs.rename(source, destination); }; - 读取本地文件core.test.js:38
assert.equal(await fs.realpath(base), base); - 删除本地文件core.test.js:40
await fs.rm(base, { recursive: true, force: false }); - 写入本地文件core.test.js:53
await fs.mkdir(target); - 读取本地文件core.test.js:74
assert.equal(record.rootDirectory, await fs.realpath(root)); - 读取本地文件core.test.js:77
const marker = JSON.parse(await fs.readFile(path.join(record.path, MARKER), 'utf8')); - 写入本地文件core.test.js:81
await fs.mkdir(path.join(record.path, 'outputs')); - 写入本地文件core.test.js:82
await fs.writeFile(path.join(record.path, 'outputs', 'artifact.txt'), 'generated'); - 写入本地文件core.test.js:154
await fs.mkdir(target); - 写入本地文件core.test.js:155
await fs.writeFile(path.join(target, 'precious'), 'keep'); - 读取本地文件service.js:108
try{entries=await fs.readdir(current,{withFileTypes:true});}catch(error){if(error.code==='ENOENT')continue;throw error;} - 读取本地文件service.js:113
try{const info=await fs.lstat(target);bytes+=info.size;files++;} - 读取本地文件service.js:173
await fs.stat(r.path); - 读取本地文件service.test.js:9
const dir=await fs.realpath(await fs.mkdtemp(path.join(os.tmpdir(),'dsh-scratch-service-')));process.env.DSH_SCRATCH_TRASH_DIR=path.join(dir,'trash'); - 读取本地文件service.test.js:15
finally{const actual=await fs.realpath(dir);assert.equal(actual,dir);assert.ok(path.isAbsolute(dir)&&path.basename(dir).startsWith('dsh-scratch-servic - 写入本地文件service.test.js:18
const r=await service.create();assert.ok(headers.has(r.sessionId));await fs.writeFile(path.join(r.path,'output.txt'),'result'); - 读取本地文件service.test.js:19
await assert.rejects(service.complete(r.id),/用户/);assert.ok((await fs.stat(r.path)).isDirectory()); - 读取本地文件service.test.js:20
assert.equal((await service.complete(r.id,{user:true})).completed,true);await assert.rejects(fs.stat(r.path),{code:'ENOENT'});assert.equal(workspaces. - 读取本地文件service.test.js:24
test('busy task refuses completion before archive or deletion',()=>fixture(async({service,busy,archived,store})=>{const r=await service.create();busy. - 读取本地文件service.test.js:27
const second=await service.create();workspaces.set('nested',{id:'nested',path:path.join(second.path,'nested')});await assert.rejects(service.complete( - 写入本地文件service.test.js:36
test('ownership replacement refuses cleanup and preserves unrelated directory',()=>fixture(async({service,store})=>{const r=await service.create();con - 写入本地文件trash.js:35
await mkdir(directory, { recursive: true }); - 写入本地文件trash.js:38
await rename(target, finalPath); - 读取本地文件trash.js:51
const exists = async value => access(value, constants.F_OK).then(() => true, () => false);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 的临时工作区插件:一键创建、侧边栏管理面板、安全清理,可选空闲自动过期。
README
由 DeepSeek 最新模型翻译生成临时工作区(DeepSeek Harness 插件)
给 DeepSeek Harness 用的「随手开一个临时工作区」:一键建独立文件夹与会话,在侧边栏面板里统一管理,用完安全删除——或者打开闲置自动清理,让它自己消失。
临时工作区面板
[!NOTE]
清理会把整个文件夹移入系统废纸篓 / 回收站,误删仍可恢复。聊天记录会保留并归档;确认不再需要后再清空废纸篓。
安装
1. 在 DeepSeek Harness 左侧打开 插件 页 → 安装;
2. 粘贴包名:
@s0meb0dy3/dsh-scratch-workspace
3. 完全退出并重开 DeepSeek Harness,然后在左侧打开 临时工作区。
需要 DeepSeek Harness 0.2.1 或更新版本。
它会给你什么
- 一个入口,两件事 — 侧边栏面板里既创建(+ 临时任务),也管理(列表、打开、清理)。
- 一眼看清每个任务 — 友好名称、实时状态(运行中/终端打开)、闲置倒计时、目录大小,以及其中的会话。
- 删除有保障 — 校验目录所有权与 inode,落盘删除授权可断点重试;agent 或终端仍在用该目录时拒绝清理。
- 可选闲置清理 — 默认关闭;开启后只对新建任务生效。
文档
| 配置项 | 存放位置、目录前缀、删除确认、闲置小时数 |
| 安全模型 | 删除校验了什么,以及不防什么 |
| 平台支持 | macOS 已验证;Windows 注意事项 |
| 参与开发 | 本地开发、测试、发布流程 |
许可证
MIT © 2026 s0meb0dy3
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
s0meb0dy3/dsh-scratch-workspace
一键创建临时文件夹并统一管理,用完安全清理
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目