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

Codex 工作区桥接 jony5933/codex-dsh-bridge

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

把 Codex 任务实时接入 Web Host 并正确分组

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
数据截至 2026/09/26·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 72 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 84 处,展示前 72 条)
  • 读取本地文件
    contracts/checks/a2-access-request.mjs:106
    const serviceSource = await readFile(join(worktree, "src/access-service.js"), "utf8");
  • 读取本地文件
    contracts/checks/a3-daily-window-behavior.mjs:10
    const source = await readFile(sourcePath, "utf8");
  • 读取本地文件
    contracts/checks/ant-design-table-states.mjs:33
    await lstat(path);
  • 执行外部命令固定命令
    contracts/checks/ant-design-table-states.mjs:41
    const result = spawnSync('npm', args, {
  • 执行外部命令固定命令
    contracts/checks/ant-design-table-states.mjs:56
    const result = spawnSync('/bin/cp', ['-cR', source, destination], {
  • 读取本地文件
    contracts/checks/ant-design-table-states.mjs:72
    const canonicalDependencies = await realpath(dependencyDirectory);
  • 删除本地文件递归
    contracts/checks/ant-design-table-states.mjs:88
    await rm(join(nodeModules, '.cache'), { recursive: true, force: true });
  • 写入本地文件
    contracts/checks/ant-design-table-states.mjs:89
    await copyFile(fixture, acceptanceTest);
  • 删除本地文件
    contracts/checks/ant-design-table-states.mjs:95
    await unlink(acceptanceTest);
  • 删除本地文件
    contracts/checks/ant-design-table-states.mjs:110
    await unlink(acceptanceTest).catch((error) => {
  • 删除本地文件递归
    contracts/checks/ant-design-table-states.mjs:113
    await rm(nodeModules, { recursive: true, force: true });
  • 删除本地文件递归
    contracts/checks/ant-design-table-states.mjs:114
    await rm(umiDevelopment, { recursive: true, force: true });
  • 删除本地文件递归
    contracts/checks/ant-design-table-states.mjs:115
    await rm(umiProduction, { recursive: true, force: true });
  • 读取本地文件
    contracts/checks/runner-skill-proof.mjs:9
    await readFile(join(worktree, "src/skill-smoke-proof.txt"), "utf8"),
  • 读取本地文件
    src/acceptance.ts:29
    const repositoryPath = await realpath(repository);
  • 读取本地文件
    src/acceptance.ts:30
    const worktreePath = await realpath(worktree);
  • 读取本地文件
    src/acceptance.ts:35
    const script = await realpath(resolve(rootContractDirectory, config.script));
  • 读取本地文件
    src/benchmark/dsh-session.ts:101
    return extractDshSessionMetrics(await readFile(path));
  • 读取本地文件
    src/cli.ts:46
    const prompt = await readFile(webRun.promptPath, "utf8");
  • 读取本地文件
    src/contract.ts:26
    await access(candidate);
  • 读取本地文件
    src/contract.ts:57
    const schemaText = await readFile(await findSchemaPath(schemaFilename), "utf8");
  • 读取本地文件
    src/contract.ts:108
    const contractText = await readFile(absoluteContractPath, "utf8");
  • 读取本地文件
    src/evidence.ts:85
    try { await access(candidate); return candidate; } catch { }
  • 读取本地文件
    src/evidence.ts:91
    const schema = JSON.parse(await readFile(await findDirectEvidenceSchemaPath(), "utf8")) as object;
  • 读取本地文件
    src/git/policy.ts:19
    await access(candidate, constants.X_OK);
  • 读取本地文件
    src/git/policy.ts:20
    return await realpath(candidate);
  • 写入本地文件
    src/git/policy.ts:42
    await mkdir(policyDirectory);
  • 写入本地文件
    src/git/policy.ts:43
    await writeFile(logPath, "", "utf8");
  • 写入本地文件
    src/git/policy.ts:74
    await writeFile(wrapperPath, wrapper, "utf8");
  • 写入本地文件
    src/git/policy.ts:75
    await chmod(wrapperPath, 0o755);
  • 读取本地文件
    src/git/policy.ts:101
    const wrapper = await readFile(prepared.audit.wrapperPath, "utf8");
  • 读取本地文件
    src/git/policy.ts:105
    const attemptText = await readFile(prepared.audit.logPath, "utf8");
  • 写入本地文件
    src/git/worktree.ts:22
    await mkdir(dirname(path), { recursive: true });
  • 读取本地文件
    src/harness/headless.ts:20
    await access(candidate);
  • 读取本地文件
    src/harness/headless.ts:33
    const protocol = await readFile(await findProtocolPath(), "utf8");
  • 执行外部命令来自配置/变量
    src/lib/command.ts:60
    const child = spawn(command, args, {
  • 读取本地文件
    src/report.ts:30
    await access(candidate);
  • 读取本地文件
    src/report.ts:40
    const schema = JSON.parse(await readFile(await findRunReportSchemaPath(), "utf8")) as object;
  • 读取本地文件
    src/review.ts:31
    await access(candidate);
  • 读取本地文件
    src/review.ts:125
    const schema = JSON.parse(await readFile(await findReviewSchemaPath(), "utf8")) as object;
  • 读取本地文件
    src/review.ts:143
    const absoluteReportPath = await realpath(resolve(reportPath));
  • 读取本地文件
    src/review.ts:144
    const absoluteCandidatePath = await realpath(resolve(candidatePath));
  • 读取本地文件
    src/review.ts:146
    JSON.parse(await readFile(absoluteReportPath, "utf8")) as unknown,
  • 读取本地文件
    src/review.ts:148
    const worktree = await realpath(report.worktree);
  • 写入本地文件
    src/review.ts:161
    await writeFile(reviewPath, `${JSON.stringify(review, null, 2)}\n`, {
  • 读取本地文件
    src/reviewer/codex-cli.ts:43
    await access(candidate);
  • 读取本地文件
    src/reviewer/codex-cli.ts:116
    const protocol = await readFile(await findReviewerProtocolPath(), "utf8");
  • 写入本地文件
    src/reviewer/codex-cli.ts:177
    await writeFile(path, `${JSON.stringify(report, null, 2)}\n`, "utf8");
  • 读取本地文件
    src/reviewer/codex-cli.ts:186
    const absoluteReportPath = await realpath(resolve(reportPath));
  • 读取本地文件
    src/reviewer/codex-cli.ts:187
    const report = await loadReviewEvidence(JSON.parse(await readFile(absoluteReportPath, "utf8")) as unknown);
  • 读取本地文件
    src/reviewer/codex-cli.ts:191
    const worktree = await realpath(report.worktree);
  • 读取本地文件
    src/reviewer/codex-cli.ts:192
    const artifactDirectory = await realpath(dirname(absoluteReportPath));
  • 写入本地文件
    src/reviewer/codex-cli.ts:194
    await mkdir(attemptDirectory);
  • 写入本地文件
    src/reviewer/codex-cli.ts:202
    await writeFile(promptPath, prompt, "utf8");
  • 写入本地文件
    src/reviewer/codex-cli.ts:237
    await writeFile(stdoutPath, command.stdout, "utf8");
  • 写入本地文件
    src/reviewer/codex-cli.ts:238
    await writeFile(stderrPath, command.stderr, "utf8");
  • 写入本地文件
    src/reviewer/codex-cli.ts:263
    await writeFile(stdoutPath, command?.stdout ?? "", "utf8");
  • 写入本地文件
    src/runner.ts:61
    await mkdir(artifactDirectory, { recursive: true });
  • 写入本地文件
    src/runner.ts:100
    await writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
  • 写入本地文件
    src/runner.ts:113
    await writeFile(join(artifactDirectory, "prompt.md"), prompt, "utf8");
  • 写入本地文件
    src/runner.ts:132
    await writeFile(join(artifactDirectory, "harness.stdout.log"), harness.stdout, "utf8");
  • 写入本地文件
    src/runner.ts:133
    await writeFile(join(artifactDirectory, "harness.stderr.log"), harness.stderr, "utf8");
  • 写入本地文件
    src/runner.ts:169
    await writeFile(patchPath, patch, "utf8");
  • 读取本地文件
    src/skills.ts:73
    const entries = await readdir(directory, { withFileTypes: true });
  • 读取本地文件
    src/skills.ts:79
    const metadata = await lstat(absolutePath);
  • 读取本地文件
    src/skills.ts:104
    const content = await readFile(file.absolutePath);
  • 读取本地文件
    src/skills.ts:115
    return createHash("sha256").update(await readFile(path)).digest("hex");
  • 读取本地文件
    src/skills.ts:124
    const unresolvedMetadata = await lstat(unresolvedBundlePath);
  • 读取本地文件
    src/skills.ts:131
    const sourcePath = await realpath(unresolvedBundlePath);
  • 写入本地文件
    src/skills.ts:182
    await mkdir(stagedRoot, { recursive: false });
  • 写入本地文件
    src/skills.ts:208
    await writeFile(
  • 读取本地文件
    src/version.ts:14
    const packageDocument = JSON.parse(await readFile(candidate, "utf8")) as unknown;
扫描于 2026/11/3(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 接入WebHost
  • 任务实时分组

一个可见、感知工作区的 Codex 到 DeepSeek Harness Web Host 桥接。

README

由 DeepSeek 最新模型翻译生成
Codex → DSH Web Host 桥接 GitHub · MIT 许可证 本项目的核心价值是:为 Codex 提供一个标准化、实时可见、正确分组的 DSH Web Host 通道,并在需要时附加安全控制。 目标工作流是: 1. Codex 生成计划和中文任务说明,保留必要的英文技术标识。 2. Bridge 根据项目路径解析或创建 DSH Workspace,并通过同一个 Web Host 创建 session。 3. DSH Web UI 无需重新载入即可显示 session、运行状态和输出,session 归入正确的 Workspace,而不是 Ungrouped。 4. DSH 执行具体修改,完成证据返回 Codex。 5. Codex 在自己的代码变化界面中执行 review。 Bridge 提供两种模式: - web-direct:日常推荐模式。直接在用户指定项目中运行,优先保证低开销、实时可见和正确分组。 - web-guarded:按需安全模式。在 Web Host 通道外附加 Task Contract、隔离 worktree、Git policy、独立 checks、路径边界和审计 artifacts。 现有安全 Runner 是已经验证的可复用策略层,不再被定位为所有任务的默认入口,也不以“比直接调用更快或更省 Token”为卖点。
展开完整文档(README 剩余 1 节)
Codex → DSH Web Host 桥接

GitHub · MIT 许可证

本项目的核心价值是:为 Codex 提供一个标准化、实时可见、正确分组的 DSH Web Host 通道,并在需要时附加安全控制。

目标工作流是:

1. Codex 生成计划和中文任务说明,保留必要的英文技术标识。
2. Bridge 根据项目路径解析或创建 DSH Workspace,并通过同一个 Web Host 创建 session。
3. DSH Web UI 无需重新载入即可显示 session、运行状态和输出,session 归入正确的 Workspace,而不是 Ungrouped。
4. DSH 执行具体修改,完成证据返回 Codex。
5. Codex 在自己的代码变化界面中执行 review。

Bridge 提供两种模式:

- web-direct:日常推荐模式。直接在用户指定项目中运行,优先保证低开销、实时可见和正确分组。
- web-guarded:按需安全模式。在 Web Host 通道外附加 Task Contract、隔离 worktree、Git policy、独立 checks、路径边界和审计 artifacts。

现有安全 Runner 是已经验证的可复用策略层,不再被定位为所有任务的默认入口,也不以“比直接调用更快或更省 Token”为卖点。M7 已通过真实 Web Host smoke:已打开的 DSH UI 无需刷新即可显示正确 Workspace 下的新 session、运行状态和输出。详细方向见 docs/web-host-bridge-direction.md,进度见 ROADMAP.md。

安装

codex-dsh-bridge@0.1.0-beta.1 已发布到 npm。推荐显式使用 beta channel 安装:

npm install --global codex-dsh-bridge@beta
codex-dsh --version

Bridge 不会代替用户安装或升级 DSH。使用前需要单独安装受支持的 dsh,并让 dsh web 在本机运行;当前已验证的 DSH 版本为 0.1.0-rc.8、0.1.1-rc.1 与 0.1.1-rc.2。Node.js 需要 >=22.19。

若只在单个项目内使用,也可以安装为开发依赖,并通过 npx codex-dsh 调用:

npm install --save-dev codex-dsh-bridge@beta
npx codex-dsh --version

从源码运行:

nvm use
pnpm install
pnpm run check

更新 beta:

npm install --global codex-dsh-bridge@beta
codex-dsh web-probe "/absolute/path/to/project"

卸载 CLI:

npm uninstall --global codex-dsh-bridge

卸载不会删除 DSH,也不会自动删除 ~/.dsh-bridge/runs 中的本地 evidence 与运行索引。完整安装、升级、卸载和发布边界见 docs/package-installation.md。

推荐入口:web-direct

先把 Codex 生成的中文任务说明保存为 UTF-8 Markdown 文件,例如 /tmp/dsh-task.md,然后运行:

codex-dsh web-run "/absolute/path/to/project" /tmp/dsh-task.md

从源码开发时,把以下示例中的 codex-dsh 替换为 pnpm dev -- 即可。兼容旧脚本的 deepseek-loop binary alias 暂时保留,但新文档和自动化应统一使用 codex-dsh。

web-run 连接本机 http://127.0.0.1:3080,按项目 canonical path 解析或创建 Workspace,在该 Workspace 中创建 session,并订阅 DSH Web Host 的 mux/host 事件。已打开的 DSH UI 会通过同一 Host 实时显示该 session,无需重新载入。

命令会把 evidence 持久保存到 ~/.dsh-bridge/runs///evidence.json,同时写入不可变运行索引 ~/.dsh-bridge/runs/index//.json;stdout 输出会包含 evidencePath 与 indexPath,不再要求 shell redirect。completed / failed / blocked、Workspace/session identity、event seq、terminal reason 和 reconnect 次数都会保留。Web 通道没有 process exitCode,因此 evidence 不会伪造该字段。非 completed 状态会让 CLI 返回非零进程状态。

可以显式覆盖本机 Host、全程 timeout 和 artifact root:

codex-dsh web-run "/absolute/path/to/project" /tmp/dsh-task.md \
--endpoint http://127.0.0.1:3080 \
--timeout-ms 1800000 \
--artifact-root "/absolute/path/outside-project/runs"

endpoint 仍由 client 强制限制为 loopback HTTP(S) origin;timeout 必须位于 1 毫秒至 24 小时之间。artifact root 会在 prompt 发送前 canonicalize、创建并确认位于目标项目之外,预检失败时不会创建 DSH session。evidence 使用同目录临时文件和原子 hard link 发布,已有同名文件不会被覆盖。
每次 web-run 都会先执行只读 compatibility probe:核对 PATH 中的 DSH CLI version、host.describe 协议标记、workspace.list、session.list 以及 mux/host 两条 WebSocket。任一检查失败时会在创建 Workspace/session 和发送 prompt 前阻断,并保存 compatibility.json。当前验证支持 0.1.0-rc.8、0.1.1-rc.1 与 0.1.1-rc.2;未知版本仍会完成只读 capability 采样,但不能执行任务。

也可以只做探测,不创建 session:

codex-dsh web-probe "/absolute/path/to/project"

host.describe.version 当前是 Host protocol marker 0.0.1,不是 npm package version;evidence 会把两者分开记录,并明确标注本机 CLI 与运行中 Host 的同进程关系无法由现有 API 自动证明。

使用只读命令查询本地运行索引;它不会连接 DSH,也不会创建、修改或删除 session:

codex-dsh web-runs \
--project "/absolute/path/to/project" \
--status completed \
--since 2026-08-01T00:00:00Z \
--limit 20

可用筛选项为 --project、--workspace、--session、--status、--since、--until 和 --limit;需要查询非默认位置时增加 --artifact-root。结果按 startedAt 倒序返回。失败发生在 Workspace 确认前时,索引中的 workspaceId 为 null,不会虚构归属。

当前命令固定为 web-direct。它直接允许 DSH 在指定项目中工作,适合低风险、人工可立即检查的任务;请在 prompt 中明确允许范围、禁止 commit/push、验收条件和停止条件。需要隔离 worktree、外部 acceptance checks、路径边界、Git wrapper 或隔离 Skill catalog 时,继续使用下面的 guarded Runner。rc.8 Web Host 不支持 per-session environment/Skill patch,因此这些预防式控制不能被 Web evidence 冒充为已启用。

现有 guarded Runner

复制 contracts/examples/safe-change.json,将 repository 设置为已有 Git 仓库,并按任务调整允许范围和验收条件:

pnpm dev -- run ./my-task.json

run 当前显式使用 HeadlessTransport;不会在 prompt 已被 Web Host 接受后自动 fallback 或重发同一任务。

以下命令保留为高约束任务的现有能力。Runner 会在系统临时目录中创建独立 worktree 和任务分支,调用配置好的 DSH 命令,执行必需检查,并生成以下审计文件:

- prompt.md:发送给 DSH 的完整任务指令;
- harness.stdout.log、harness.stderr.log:DSH 标准输出与错误输出;
- git-policy/:Harness Git wrapper、被拒绝命令日志与完整性证据;
- changes.patch:本次代码变化;
- result.json:统一的结构化运行报告,包含 passed / failed / blocked 状态、baseline、required checks、独立 acceptance checks 和 Contract lineage;

其中 changes.patch、Harness 日志和 Git policy 证据仅在 Harness 实际启动后生成。

运行期间,生命周期事件和 DSH 输出会实时写入 stderr;最终 JSON 报告单独写入 stdout,方便调用方解析或重定向。报告中的 worktree 路径可以直接交给 Codex 审阅。

记录 Codex review

Codex 独立审阅后,只生成符合 contracts/review.schema.json 的候选 JSON,并将它保存在执行 worktree 外。随后运行:

pnpm dev -- record-review ./artifacts/result.json ./review-candidate.json

Runner 会绑定 runId 与 taskId,检查 approved / changes-requested / blocked 状态语义、finding 唯一 ID、文件位置、证据、最小修复和解决状态,再把标准化结果写为与 result.json 同目录的 review.json。固定审阅协议位于 prompts/reviewer.md;它不发送给 DSH。

也可以显式启动 bundled Codex CLI adapter:

pnpm dev -- codex-review ./artifacts/result.json /Applications/ChatGPT.app/Contents/Resources/codex

该命令固定使用 never approval、read-only sandbox、ephemeral、忽略用户 config/rules、structured output 和 JSONL 审计。普通 run 不会自动调用 Codex reviewer;已有 review.json 也不会被覆盖。它既接受正式 Runner result.json,也接受符合 contracts/direct-evidence.schema.json 的直接通道 evidence;review prompt 会明确标记 channel 和实际 controls。当前 bundled CLI 是 App 内部 alpha 版本,真实项目启用前仍应先做一次专门 smoke test。

DSH session 计量

DSH rc.8 默认把 session 保存为 concatenated Zstandard frames。可以只读汇总其中每次最终 assistant/message 的模型与 Token usage:
pnpm dev -- dsh-session-metrics ~/.dsh/sessions///session.jsonl.zstd

该命令不会输出 prompt、推理正文或 tool result,只汇总模型调用数、input、cached read、output、reasoning tokens 以及 event/frame 数量。它用于通道基准审计,不会修改 DSH session。

返修 Contract

返修不能重新复制或改写完整任务 Contract,只能使用 repair overlay:

{
"version": 1,
"taskId": "example-safe-change-repair-1",
"repair": {
"parentContract": "./safe-change.json",
"iteration": 1,
"findings": [
{
"id": "preserve-error-shape",
"severity": "P2",
"title": "保持既有错误响应结构", "description": "实现改变了原有 API Contract,需要按审阅要求修复。"
}
]
}
}

Runner 会自动继承父 Contract 的 objective、baseCommit、路径边界、acceptanceCriteria、baselineChecks、requiredChecks、acceptanceChecks、skills、Harness 和 execution 配置。Overlay 出现这些字段会被 schema 拒绝;iteration 必须连续且最多为 2。完整示例见 contracts/examples/repair-overlay.json。

外部 DSH Skill 注入

Skill 配对实验可在根 Contract 中声明可信的外部 Skill root:

{
"skills": {
"root": "../skills",
"names": ["ant-design-admin"],
"invocation": "explicit"
}
}

root 相对于根 Contract 所在目录解析,必须位于目标仓库和 execution worktree 外。Runner 会拒绝 symlink,使用标准 YAML 解析并核对每个 //SKILL.md 的 name 与非空 description,再对 bundle 内全部常规文件按相对路径和内容计算确定性 SHA-256。

Runner 只把 names 声明的 bundle 复制到 worktree 外的 artifact 投影目录,并生成 skills.patch.yml,把 skill-filesystem.includeDefaultRoots 固定为 false、customSkillDirs 固定为该投影目录。配置 skills 时,harness.args 必须包含 {skillPatch};Runner 会替换为生成的 patch 路径。只有 Harness 子进程收到 DSH_BUNDLED_SKILL_DIR,requiredChecks、acceptanceChecks 和 Codex review 不继承该变量。

explicit 会在 DSH prompt 中加入 /name;automatic 只提供 catalog,由模型按 description 选择。result.json 记录隔离状态、调用方式、canonical source/staged root、生成 patch 及其 hash、每个 bundle 的 hash/文件数和 Harness 后完整性复核结果;Skill 正文和源路径不会写进目标 patch。若 Harness 改写投影成员、bundle 或生成 patch,run 会 fail closed。

正式无 Skill / 有 Skill 配对必须保持 repository、baseCommit、任务目标、验收条件、checks、模型和超时相同。为排除本机项目级或用户级 Skill 污染,B1 应配置 "skills": { "names": [] } 并使用同一 {skillPatch} 参数;B2 只增加 root、目标 names 和 invocation。返修 overlay 会不可变继承原始 skills 配置。完全省略 skills 只用于兼容普通 Runner 任务,不代表隔离的无 Skill 实验。

独立验收检查

baselineChecks 是可选的执行前健康检查,只能用于“开始修改前就必须通过”的前置条件:

{
"baselineChecks": [
"npm run test:baseline"
]
}

Runner 在隔离 worktree 中、DSH 启动前运行这些可信 shell 命令。任一检查失败时,Runner 不启动 Harness,也不生成 patch,而是返回并写入标准 result.json:status 为 blocked,blockers 保存原因,baseline 保存完整检查证据,未执行的 harness、skills、gitPolicy 和 patchPath 明确为 null。该报告受 contracts/result.schema.json 约束;failed 只表示 Harness 已执行后的进程、验证或策略失败。任务目标本身需要修复的失败测试不得放入 baselineChecks,应继续放在 requiredChecks 或独立 acceptanceChecks 中。

requiredChecks 在执行 worktree 中运行,适合项目自身的 test、typecheck 和 lint。对于不能由 DSH 改写的行为基准,可在根 Contract 增加 acceptanceChecks:

{
"acceptanceChecks": [
{
"id": "preserve-response-contract",
"runner": "node",
"script": "./checks/preserve-response-contract.mjs",
"args": [],json
"timeoutMs": 900000
}
]
}

script 相对于根 Contract 所在目录解析,必须位于目标仓库和执行 worktree 之外。Runner 使用固定的 node 或 shell interpreter 启动脚本,并把 worktree 绝对路径作为第一个参数传入;脚本自己的 fixture 和预期结果也应保存在外部目录。返修 overlay 会继承同一组检查,且 DSH prompt 不包含检查脚本路径或源码。

安全模型

- DSH 通过无 shell 的子进程方式启动。
- Harness 的 PATH 优先使用 Runner 生成的 Git policy wrapper;标准 git commit / git push 会被拒绝并记录。Harness 结束后 Runner 还会比较 HEAD 与 refs,检测绕过 wrapper 的本地历史改写。
- requiredChecks 会通过 /bin/sh -lc 执行,因此只能运行可信任务契约。
- acceptanceChecks 使用无 shell 的固定 interpreter 执行外部脚本;检查仍属于可信代码,不是安全 sandbox。
- 外部 Skill 是会进入执行模型上下文的可信代码;Runner 校验位置、frontmatter、symlink 和内容 hash,但不会证明 Skill 指令本身安全。
- baseline、required 和 acceptance checks 只继承 PATH、HOME、locale、临时目录和包管理器路径等白名单环境变量,不继承 *_API_KEY、Token、DSH session 或 SSH agent 等宿主凭据。
- POSIX 命令在独立 process group 中运行;timeout 会终止整个进程组,避免 Harness 或 CLI 的派生进程残留。
- 执行结束后,Runner 会使用 allowedPaths 和 forbiddenPaths 核验真实变更文件。
- Runner 不会自动 commit、push、merge 或删除 worktree。
- 主仓库不会作为执行代理的写入目录。
- 返修必须使用 repair overlay,禁止复制后手动改写原始验收条件。

路径与 Git policy 属于通道约束及事后检测,不是完整的文件系统或网络 sandbox。执行代理仍可能通过绝对可执行路径或自带网络客户端绕过命令 wrapper;Runner 能检测本地 HEAD/ref 变化,但无法撤销已经发生的外部 remote 写入。如果未来需要执行不可信指令或从 OS 层保证禁止 push,必须叠加容器、网络策略或系统 sandbox。

验证策略

不要从依赖 Skill 的界面任务开始。应先使用普通仓库任务建立无 Skill 基线,再对同一个任务进行有 Skill 和无 Skill 的配对实验。

推荐顺序:

1. 带确定性单元测试的纯逻辑缺陷;
2. 带行为保持测试的跨文件重构;
3. 不使用设计 Skill 的前端表单修改;
4. 使用 Ant Design 或项目 Design System Skill 重复同一个前端任务;
5. 诱导执行者修改禁止文件的边界任务;
6. 需求含糊、正确行为应是停止并报告阻塞的任务。

每次记录首次通过率、审阅问题严重度、边界违规、返修次数、耗时和可获取的 Token/API 成本。Skill 应被视为实验变量,而不是无 Skill 基线的一部分。

当前进度见 ROADMAP.md;代理职责、安全约束和标准操作流程见 AGENTS.md。

发布形态

项目计划以 GitHub/npm 上的 DSH Bridge 为核心发布,并主要面向 DSH/Cordis 生态;Codex plugin 作为可选薄 companion,只提供 Skill、命令入口和依赖检查,不复制 transport 或 review UI。完整决策与发布顺序见 docs/distribution-strategy.md。

项目尚未公开发布。发布前必须完成 docs/release-checklist.md 中的许可证、repository metadata、隐私/evidence 策略和安全审计 gate。贡献规则见 CONTRIBUTING.md,安全报告与边界见 SECURITY.md,当前 Codex 调用方式见 docs/codex-companion-installation.md。
预览分享卡片长什么样 ↓jony5933/codex-dsh-bridge
分享 · DeepSeek Harness Hub
jony5933/codex-dsh-bridge

把 Codex 任务实时接入 Web Host 并正确分组

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部