🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

防御性编码工作流 stmcw1/DACW

DeepSeek Harness
stmcw14 天前有提交已提供中文文档扫描:含敏感能力

让写手、运行机与审查者分工校验代码,最终交由人工裁决合入

30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add stmcw1/DACW
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · tool
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 40 处,展示前 28 条)
  • 删除本地文件递归
    build.mjs:38
    rmSync(outDir, { recursive: true, force: true });
  • 写入本地文件
    build.mjs:39
    mkdirSync(outDir, { recursive: true });
  • 读取本地文件
    build.mjs:42
    const source = readFileSync(path.join(root, file), 'utf8');
  • 写入本地文件
    build.mjs:45
    writeFileSync(path.join(outDir, file.replace(/ ts$/, '.js')), output, 'utf8');
  • 读取本地文件
    index.ts:256
    stat = await fs.lstat(current);
  • 读取本地文件
    index.ts:277
    const root = await fs.realpath(safeDir);
  • 写入本地文件
    index.ts:295
    await fs.mkdir(parentDir, { recursive: true });
  • 读取本地文件
    index.ts:299
    const stat = await fs.lstat(targetPath);
  • 读取本地文件
    index.ts:308
    const realParentDir = await fs.realpath(parentDir);
  • 写入本地文件
    index.ts:313
    await fs.writeFile(targetPath, content, 'utf-8');
  • 读取本地文件
    index.ts:319
    const stat = await fs.lstat(target);
  • 读取本地文件
    index.ts:322
    const realTarget = await fs.realpath(target);
  • 删除本地文件
    index.ts:341
    if (entry.isDirectory()) await fs.rm(fullPath, { recursive: true, force: true });
  • 删除本地文件
    index.ts:342
    else await fs.unlink(fullPath);
  • 写入本地文件
    plugin.ts:736
    await fs.mkdir(lexical, { recursive: true });
  • 读取本地文件
    plugin.ts:738
    const directory = await fs.realpath(lexical);
  • 读取本地文件
    plugin.ts:741
    const entries = await fs.readdir(directory, { withFileTypes: true });
  • 读取本地文件
    plugin.ts:749
    const content = await fs.readFile(markerPath, 'utf-8').catch(() => '');
  • 写入本地文件
    plugin.ts:766
    if (!hasMarker) await fs.writeFile(markerPath, WORKSPACE_MARKER_CONTENT, 'utf-8');
  • 读取本地文件
    runner.ts:57
    fsSync.accessSync(full, fsSync.constants.X_OK);
  • 读取本地文件
    runner.ts:134
    const nodeRes = cliJs && fsSync.existsSync(cliJs) ? this.resolveCommandPath('node') : null;
  • 执行外部命令来自配置/变量
    runner.ts:137
    child = spawn(nodeRes.absPath, [cliJs, ...args], {
  • 执行外部命令来自配置/变量
    runner.ts:153
    child = spawn(resolution.absPath, args, {
  • 执行外部命令固定命令
    runner.ts:218
    const tk = spawn('taskkill', ['/pid', String(child.pid), '/f', '/t'], { stdio: 'ignore', windowsHide: true });
  • 写入本地文件
    state_manager.ts:86
    await fs.mkdir(this.stateDir, { recursive: true, mode: 0o700 });
  • 写入本地文件
    state_manager.ts:100
    await fs.rename(tmpPath, this.stateFilePath);
  • 删除本地文件
    state_manager.ts:111
    await fs.unlink(tmpPath).catch(() => { });
  • 读取本地文件
    state_manager.ts:123
    const raw = await fs.readFile(this.stateFilePath, 'utf8');
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

防御式智能体编码工作流:写作者 → 确定性运行器 → 独立审查者 → 人工把关。dacw_run 工具在隔离工作区里编写、测试并审计代码,未经人工审查不会合并任何内容

README

由 DeepSeek 最新模型翻译生成
点击 or click DACW — 防御性智能体编程工作流 让 AI 写代码,让机器验代码,让人做最终裁决。 DACW 是一个 DSH Host 插件:写手子代理按增量协议产出代码,确定性运行机执行项目自带测试,独立审查者给出结构化裁决,最后停在人工闸门。所有失败与异常路径都收敛到 NEED_HUMAN,绝不自动合入。 特性 - 三权分立:写手只产出 JSON 变更集,运行机只执行白名单命令,审查者只输出裁决——没有任何一方能独立合入代码。 - 子代理零工具隔离:写手/审查者运行在 persona-only preset 上,插件在 agent/created 阶段用 ctx.tools.restrict({ allow: [] }) 剥除全部继承工具并校验可见工具为 0;隔离失败则拒绝创建子代理。 - 输出协议 v2:写手只输出相对基线的变更,未提及文件逐字节保留,明显减少 token,并避免"上轮通过的代码被改坏"。 - 确定性运行机:命令白名单(npm / pnpm / yarn / npx / node / python / python3 / pytest / cargo / go)、环境变量白名单、超时强杀进程树、输出截断。 - 结构化审查:裁决必须为精确 JSON,解析失败按 REJECTED 处理;PASS 但含可疑字样 → 人工闸门。
展开完整文档(README 剩余 1 节)
点击 or click

DACW — 防御性智能体编程工作流

让 AI 写代码,让机器验代码,让人做最终裁决。

DACW 是一个 DSH Host 插件:写手子代理按增量协议产出代码,确定性运行机执行项目自带测试,独立审查者给出结构化裁决,最后停在人工闸门。所有失败与异常路径都收敛到 NEED_HUMAN,绝不自动合入。

特性

- 三权分立:写手只产出 JSON 变更集,运行机只执行白名单命令,审查者只输出裁决——没有任何一方能独立合入代码。
- 子代理零工具隔离:写手/审查者运行在 persona-only preset 上,插件在 agent/created 阶段用 ctx.tools.restrict({ allow: [] }) 剥除全部继承工具并校验可见工具为 0;隔离失败则拒绝创建子代理。
- 输出协议 v2:写手只输出相对基线的变更,未提及文件逐字节保留,明显减少 token,并避免"上轮通过的代码被改坏"。
- 确定性运行机:命令白名单(npm / pnpm / yarn / npx / node / python / python3 / pytest / cargo / go)、环境变量白名单、超时强杀进程树、输出截断。
- 结构化审查:裁决必须为精确 JSON,解析失败按 REJECTED 处理;PASS 但含可疑字样 → 人工闸门。
- 可配置模型:写手/审查者可分别继承父会话路由,或从 DSH 已配置模型目录中选择;启动日志与结果对象显示实际生效的模型。
- 工作区安全闸门:仅接受空目录或本插件写入的合法 .dacw-workspace 标记;拒绝系统根、用户主目录、DSH_HOME/profile 目录;写入前做 realpath + 逐段符号链接校验。
- 审计记录:状态文件包含任务、文件清单摘要、测试输出与审查文本,HMAC-SHA256 签名。

工作流程

写手(JSON 变更集) → 协调器(校验 / 合并 / 落盘) → 运行机(项目测试) │ 失败 → 打回重写(最多 maxRounds 轮)审查者(JSON 裁决) → 人工闸门 NEED_HUMAN

1. 写手按协议 v2 输出变更。
2. 协调器做路径越权校验、合并基线并把工作区重置为合并集。
3. 运行机按项目类型执行测试(每轮重新嗅探)。
4. 审查者审计全量文件 + 地基文件(锁文件送 SHA256 摘要)。
5. 通过后返回 success: true、status: "NEED_HUMAN";其余路径同样收敛到人工闸门。

安装

前置要求(DSH 宿主环境):宿主需支持 agentPresets 与 subagents 服务(ctx.subagents / agentPresets,建议使用最新版 DSH)。它们用于创建写手/审查者专用零工具 preset 并强制执行子代理工具隔离;宿主版本过旧时 DACW 会触发 Fail-Closed 拒绝运行(不会静默降级为继承父会话工具),以保证隔离的安全底线。

前置:DSH 提供 ctx.subagents、agentPresets 服务与 spawn provider(@deepseek-ai/dsh-subagent-spawn-in-process);构建需要 Node ≥ 22.13;被测试项目的依赖需人工预装。

node build.mjs # 构建 dist/(Node 内置类型擦除,无需 typescript)
node selftest.mjs # 60 项回归自测
npm pack --pack-destination ../dacw-pack # 生成安装产物

在 DSH 插件管理器中执行 install_bundle,target 填 tarball 的绝对路径并加 file: 前缀(例如 file:/absolute/path/to/stmcw1-dacw-1.0.2.tgz)。安装后向 profile 插入 Host 行 dacw(bundle 包名 @stmcw1/dacw)。不要用目录路径安装——目录安装会绕过 files 白名单,把源码、测试与构建脚本一并装进 profile。

升级:改代码 → node build.mjs → npm pack → remove_bundle → install_bundle 同一 tarball → 重启 Harness。

使用

模型调用 dacw_run 工具:

| 参数 | 必填 | 说明 |
| task | 是 | 需求描述(自然语言,越具体越好) |
| workspace | 否 | 专用工作区;绝对路径或相对会话工作目录,省略则用配置值/会话工作目录 |
| task_id | 否 | 审计记录文件名后缀;省略自动生成 |

成功返回:

| 字段 | 说明 |
| success / status | 机器闸门结果;status 恒为 NEED_HUMAN |
| message | 人类可读结论 |
| workspace / files / round | 工作区、产出文件、终止轮次 |
| models | { writer, reviewer },实际生效的模型 |
| logs / elapsed_ms | 日志尾部与耗时 |

启动日志示例:

🧠 模型配置 | ✍️ 写手: deepseek-account/deepseek-flash(插件配置) | 🔍 审查者: 继承父会话路由(DSH 默认: deepseek-account/deepseek-flash)

工作流失败时工具抛出错误(附工作区、状态、轮次与日志尾部),不会把失败伪装成普通结果;所有路径都不提交、不合入。

模型配置

writerModel / reviewerModel 支持四种取值:

| 取值 | 行为 |
| null / "inherit" | 继承父会话路由(默认) |
| "provider/model" | 显式指定,并校验 provider 已在 DSH 中注册 |
| "model" | 按模型名在 DSH 已配置模型目录中解析唯一 provider |
| { provider?, model, reasoningEffort? } | 对象形式,reasoningEffort 透传给子代理 |

config:
writerModel: deepseek-account/deepseek-flash
reviewerModel: { model: deepseek-flash, reasoningEffort: high }

解析发生在每次工具调用开始时,DSH 设置变更即时生效;解析失败即 fail-closed,不会静默换用其他模型。

安全

DACW 会执行模型生成的代码与命令,不是容器级沙箱。请在专用或一次性环境、最小权限账号下使用,并始终保留人工终审。完整边界与免责声明见 SAFETY.md。

项目结构

| 路径 | 职责 |
| plugin.ts | DSH Host 半边:工具注册、子代理 preset、运行时工具隔离、模型解析、工作区闸门 |
| index.ts | 协调器:轮次、基线合并、运行机调度、裁决、人工闸门 |
| runner.ts | 运行机:命令解析、超时强杀、输出截断 |
| state_manager.ts | 状态:原子写、HMAC、串行队列 |
| build.mjs / selftest.mjs | 构建(TS → dist/)与回归自测 |
| cordis.patch.yml / locale/ / icon.png | 插件清单与展示资源 |

开发

- dist/ 由 build.mjs 用 Node 内置类型擦除生成,不依赖 typescript,也不入库。
- 提交前请执行 node build.mjs && node selftest.mjs。
- 完整配置项与默认值见 plugin.ts 的 DEFAULT_PLUGIN_CONFIG(cordis.patch.yml 的 config 可逐项覆盖)。
- 实验性项目,接口与行为可能变化。

状态

实验性开发者预览(当前版本 v1.0.2,bundle @stmcw1/dacw):构建冒烟与回归自测通过,并已在 DSH desktop profile 完成真实闭环验证(写手产出 → npm test 通过 → 独立审查 PASS → NEED_HUMAN),子代理工具隔离实测生效。欢迎 issue / PR。

许可证

本项目基于 MIT 许可证开源。

npm: @stmcw1/dacw · GitHub
预览分享卡片长什么样 ↓stmcw1/DACW
分享 · DeepSeek Harness Hub
stmcw1/DACW

让写手、运行机与审查者分工校验代码,最终交由人工裁决合入

这是你的仓库?认领条目

回到顶部