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

任务运行时 Dev-Wiki/dev-harness-runtime

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

dev-harness 的统一执行 Runtime 与多平台插件分发层。任务选择、状态、授权、恢复和编排由公共…

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;engines.node 要求 >=24.15.0 <25,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Dev-Wiki/dev-harness-runtime
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · dev
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 32 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;engines.node 要求 >=24.15.0 <25,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dev-harness-runtime(未发布到 npm,仅可源码安装)
✗Node 引擎要求 >=24.15.0 <25 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/7 01:12:41

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

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

读写/删除本地文件
查看扫描证据(共 107 处,展示前 94 条)
  • 写入本地文件
    build/manifests/golden.ts:8
    await writeFile(path, expected, { encoding: 'utf8' });
  • 读取本地文件
    build/manifests/golden.ts:12
    try { actual = await readFile(path, 'utf8'); }
  • 读取本地文件
    build/manifests/input.ts:23
    const base = await realpath(root);
  • 读取本地文件
    build/manifests/input.ts:28
    const info = await lstat(cursor);
  • 读取本地文件
    build/manifests/input.ts:31
    if (!(await lstat(cursor)).isFile()) throw new Error(`Source is not a file: ${path}`);
  • 读取本地文件
    build/manifests/input.ts:32
    return readFile(cursor);
  • 读取本地文件
    build/manifests/input.ts:64
    const actualRoot = await realpath(sourceRoot);
  • 读取本地文件
    build/manifests/metadata.ts:14
    const raw: unknown = JSON.parse(await readFile(resolve(root, 'build/manifests/metadata.json'), 'utf8'));
  • 写入本地文件
    build/targets/agent-plugin.ts:54
    await mkdir(resolve(target, '..'), { recursive: true });
  • 写入本地文件
    build/targets/agent-plugin.ts:55
    await writeFile(target, bytes);
  • 读取本地文件
    build/targets/agent-plugin.ts:67
    const readme = await readFile(resolve(root, 'README.md'), 'utf8');
  • 读取本地文件
    build/targets/agent-plugin.ts:76
    path: `${generated.root}/${manifest}`, sha256: sha256(await readFile(resolve(root, manifest))) }] };
  • 写入本地文件
    build/targets/agent-plugin.ts:84
    await mkdir(resolve(this.#root, 'dist', id), { recursive: true });
  • 写入本地文件
    build/targets/agent-plugin.ts:85
    await writeFile(resolve(this.#root, 'dist', id, filename), bytes);
  • 写入本地文件
    build/targets/antigravity.ts:104
    await mkdir(resolve(target, '..'), { recursive: true });
  • 写入本地文件
    build/targets/antigravity.ts:105
    await writeFile(target, bytes);
  • 读取本地文件
    build/targets/antigravity.ts:113
    const notice = await readFile(resolve(root, 'plugin/DISTRIBUTION_NOTICE.md'));
  • 读取本地文件
    build/targets/antigravity.ts:116
    if (!notice.equals(await readFile(resolve(root, path)))) checks.push({
  • 读取本地文件
    build/targets/antigravity.ts:122
    const plugin = await readFile(resolve(root, 'plugin', skill.path));
  • 读取本地文件
    build/targets/antigravity.ts:123
    const project = await readFile(resolve(root, 'project-skills/.agents', skill.path));
  • 读取本地文件
    build/targets/antigravity.ts:124
    const global = await readFile(resolve(root, 'global-skills', skill.path));
  • 读取本地文件
    build/targets/antigravity.ts:134
    path: `${generated.root}/${manifest}`, sha256: sha256(await readFile(resolve(root, manifest))) }] };
  • 写入本地文件
    build/targets/antigravity.ts:142
    await mkdir(resolve(this.#root, 'dist', id), { recursive: true });
  • 写入本地文件
    build/targets/antigravity.ts:152
    await writeFile(resolve(this.#root, 'dist', id, value.name), bytes);
  • 写入本地文件
    build/targets/codex.ts:153
    await mkdir(resolve(target, '..'), { recursive: true });
  • 写入本地文件
    build/targets/codex.ts:154
    await writeFile(target, bytes);
  • 读取本地文件
    build/targets/codex.ts:161
    const values = JSON.parse(await readFile(resolve(root, manifest), 'utf8')) as { name?: string; skills?: string };
  • 读取本地文件
    build/targets/codex.ts:162
    const marketplace = JSON.parse(await readFile(resolve(root, catalog), 'utf8')) as { plugins?: { name?: string; source?: { path?: string } }[] };
  • 读取本地文件
    build/targets/codex.ts:163
    const runtime = JSON.parse(await readFile(resolve(root, runtimeSource), 'utf8')) as unknown;
  • 读取本地文件
    build/targets/codex.ts:177
    sha256: sha256(await readFile(resolve(root, manifest))) }] };
  • 写入本地文件
    build/targets/codex.ts:185
    await mkdir(resolve(this.#root, 'dist', id), { recursive: true });
  • 写入本地文件
    build/targets/codex.ts:186
    await writeFile(resolve(this.#root, 'dist', id, filename), bytes);
  • 写入本地文件
    build/targets/cursor.ts:102
    await mkdir(resolve(target, '..'), { recursive: true });
  • 写入本地文件
    build/targets/cursor.ts:103
    await writeFile(target, bytes);
  • 读取本地文件
    build/targets/cursor.ts:110
    const values = JSON.parse(await readFile(resolve(root, manifest), 'utf8')) as {
  • 读取本地文件
    build/targets/cursor.ts:122
    const ruleText = await readFile(resolve(root, rulePath), 'utf8');
  • 读取本地文件
    build/targets/cursor.ts:126
    const commandText = await readFile(resolve(root, commandPath), 'utf8');
  • 读取本地文件
    build/targets/cursor.ts:134
    path: `${generated.root}/${manifest}`, sha256: sha256(await readFile(resolve(root, manifest))) }] };
  • 写入本地文件
    build/targets/cursor.ts:142
    await mkdir(resolve(this.#root, 'dist', id), { recursive: true });
  • 写入本地文件
    build/targets/cursor.ts:143
    await writeFile(resolve(this.#root, 'dist', id, filename), bytes);
  • 写入本地文件
    build/targets/dsh.ts:139
    await mkdir(resolve(target, '..'), { recursive: true });
  • 写入本地文件
    build/targets/dsh.ts:140
    await writeFile(target, bytes);
  • 读取本地文件
    build/targets/dsh.ts:147
    const packageJson = JSON.parse(await readFile(resolve(root, 'package.json'), 'utf8')) as {
  • 读取本地文件
    build/targets/dsh.ts:150
    const yaml = await readFile(resolve(root, 'cordis.patch.yml'), 'utf8');
  • 读取本地文件
    build/targets/dsh.ts:151
    const source = await readFile(resolve(root, sourcePath), 'utf8');
  • 读取本地文件
    build/targets/dsh.ts:170
    path: `${generated.root}/package.json`, sha256: sha256(await readFile(resolve(root, 'package.json'))) }] };
  • 写入本地文件
    build/targets/dsh.ts:178
    await mkdir(resolve(this.#root, 'dist', id), { recursive: true });
  • 写入本地文件
    build/targets/dsh.ts:179
    await writeFile(resolve(this.#root, 'dist', id, filename), bytes);
  • 写入本地文件
    build/targets/opencode.ts:126
    await mkdir(resolve(target, '..'), { recursive: true });
  • 写入本地文件
    build/targets/opencode.ts:127
    await writeFile(target, bytes);
  • 读取本地文件
    build/targets/opencode.ts:136
    const manifest = JSON.parse(await readFile(resolve(root, npmManifest), 'utf8')) as { name?: string; main?: string };
  • 读取本地文件
    build/targets/opencode.ts:140
    const npmText = await readFile(resolve(root, npmEntry), 'utf8');
  • 读取本地文件
    build/targets/opencode.ts:141
    const localText = await readFile(resolve(root, localEntry), 'utf8');
  • 读取本地文件
    build/targets/opencode.ts:146
    const npmBytes = await readFile(resolve(root, npmRoot, skill.path));
  • 读取本地文件
    build/targets/opencode.ts:147
    const localBytes = await readFile(resolve(root, localRoot, '.opencode', skill.path));
  • 读取本地文件
    build/targets/opencode.ts:154
    path: `${generated.root}/${npmManifest}`, sha256: sha256(await readFile(resolve(root, npmManifest))) }] };
  • 写入本地文件
    build/targets/opencode.ts:171
    await mkdir(resolve(this.#root, 'dist', id), { recursive: true });
  • 写入本地文件
    build/targets/opencode.ts:174
    await writeFile(resolve(this.#root, 'dist', id, value.filename), value.bytes);
  • 写入本地文件
    build/targets/pipeline.ts:35
    await writeFile(temporary, bytes, { flag: 'wx', mode: 0o600 });
  • 写入本地文件
    build/targets/pipeline.ts:36
    try { await rename(temporary, path); } catch (error) { await rm(temporary, { force: true }); throw error; }
  • 删除本地文件
    build/targets/pipeline.ts:36
    try { await rename(temporary, path); } catch (error) { await rm(temporary, { force: true }); throw error; }
  • 读取本地文件
    build/targets/pipeline.ts:40
    const rootInfo = await lstat(root);
  • 读取本地文件
    build/targets/pipeline.ts:44
    for (const entry of await readdir(directory, { withFileTypes: true })) {
  • 读取本地文件
    build/targets/pipeline.ts:49
    else if (entry.isFile()) output.set(path, await readFile(join(directory, entry.name)));
  • 读取本地文件
    build/targets/pipeline.ts:106
    const info = await lstat(path);
  • 写入本地文件
    build/targets/pipeline.ts:112
    await mkdir(paths.base, { recursive: true });
  • 删除本地文件
    build/targets/pipeline.ts:123
    finally { await handle.close(); await rm(lockPath); }
  • 删除本地文件
    build/targets/pipeline.ts:137
    finally { await handle.close(); await rm(lockPath); }
  • 读取本地文件
    build/targets/pipeline.ts:158
    try { receipt = JSON.parse(await readFile(paths.generated, 'utf8')) as GeneratedReceipt; }
  • 读取本地文件
    build/targets/pipeline.ts:182
    try { if ((await lstat(paths.plugin)).isSymbolicLink()) throw new BuildError('INVALID_PATH', 'Generated root is a symlink'); }
  • 删除本地文件递归
    build/targets/pipeline.ts:184
    await rm(paths.plugin, { recursive: true, force: true });
  • 删除本地文件
    build/targets/pipeline.ts:185
    await rm(paths.generated, { force: true });
  • 删除本地文件
    build/targets/pipeline.ts:186
    await rm(paths.validated, { force: true });
  • 读取本地文件
    build/targets/source.ts:24
    const lock = JSON.parse(await readFile(resolve(checkout, 'protocol-lock.json'), 'utf8')) as {
  • 读取本地文件
    build/targets/source.ts:28
    const release = JSON.parse(await readFile(resolve(checkout, 'package.json'), 'utf8')) as { version: string };
  • 读取本地文件
    build/targets/source.ts:29
    const adapter = JSON.parse(await readFile(resolve(checkout, adapterManifest), 'utf8')) as { version: string };
  • 读取本地文件
    packages/adapter-codex/src/runtime-adapter.ts:84
    const stat = await readFile(`/proc/${namespace.initPid}/stat`, 'utf8').catch((error: NodeJS.ErrnoException) => {
  • 读取本地文件
    packages/adapter-codex/src/runtime-adapter.ts:155
    const stat = await readFile(`/proc/${pid}/stat`, 'utf8').catch((error: NodeJS.ErrnoException) => {
  • 读取本地文件
    packages/adapter-codex/src/runtime-services.ts:47
    const info = await lstat(current);
  • 读取本地文件
    packages/adapter-codex/src/runtime-services.ts:50
    if (!(await lstat(current)).isFile()) missing(`Codex package file is not regular: ${path}`);
  • 读取本地文件
    packages/adapter-codex/src/runtime-services.ts:51
    return { path: current, bytes: await readFile(current) };
  • 读取本地文件
    packages/adapter-codex/src/runtime-services.ts:68
    const root = await realpath(packageRoot);
  • 读取本地文件
    packages/adapter-codex/src/runtime-services.ts:96
    const canonical = await realpath(candidate);
  • 读取本地文件
    packages/adapter-codex/src/runtime-services.ts:97
    const info = await lstat(canonical);
  • 读取本地文件
    packages/adapter-dsh/src/plugin.ts:148
    const bytes = await readFile(path);
  • 读取本地文件
    packages/adapter-dsh/src/runtime-adapter.ts:67
    const stat = await readFile(`/proc/${namespace.initPid}/stat`, 'utf8').catch((error: NodeJS.ErrnoException) => {
  • 读取本地文件
    packages/adapter-dsh/src/runtime-services.ts:48
    const info = await lstat(current);
  • 读取本地文件
    packages/adapter-dsh/src/runtime-services.ts:51
    if (!(await lstat(current)).isFile()) missing(`DSH package file is not regular: ${path}`);
  • 读取本地文件
    packages/adapter-dsh/src/runtime-services.ts:52
    return { path: current, bytes: await readFile(current) };
  • 读取本地文件
    packages/adapter-dsh/src/runtime-services.ts:69
    const root = await realpath(packageRoot);
  • 读取本地文件
    packages/adapter-dsh/src/runtime-services.ts:97
    const canonical = await realpath(candidate);
  • 读取本地文件
    packages/adapter-dsh/src/runtime-services.ts:98
    const info = await lstat(canonical);
  • 读取本地文件
    packages/cli/src/index.ts:139
    try { record = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(await readFile(path))); }
  • 读取本地文件
    packages/cli/src/index.ts:158
    const manifest = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')) as { version: string };
扫描于 2026/10/31(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 统一执行Runtime
  • 多平台插件分发
  • 任务选择与编排

README

由 DeepSeek 最新模型翻译生成
dev-harness-runtime 项目简介 dev-harness 的统一执行 Runtime 与多平台插件分发层。任务选择、状态、授权、恢复和编排由公共 Core 承担,宿主接入由 Adapter 负责,安装产物由 Packager 生成。 当前阶段 公共 Core 已接通串行任务编排、独立验收、状态与恢复;共享 run / status / worker Skill 已建立。dhr 提供只读 doctor / status 和运行命令的可信服务入口。Codex 与 DSH Executor 已通过原始 Worker、三任务链、独立验收、逐任务提交及恢复验收。Codex、DSH、Cursor、OpenCode、Antigravity 和 Portable 的九个本地产物已通过统一打包验证;Antigravity 模型会话内 Skill 调用经用户豁免,尚未实测。各平台能力边界见能力矩阵及逐平台验证记录。
展开完整文档(README 剩余 1 节)
dev-harness-runtime

项目简介

dev-harness 的统一执行 Runtime 与多平台插件分发层。任务选择、状态、授权、恢复和编排由公共 Core 承担,宿主接入由 Adapter 负责,安装产物由 Packager 生成。

当前阶段

公共 Core 已接通串行任务编排、独立验收、状态与恢复;共享 run / status / worker Skill 已建立。dhr 提供只读 doctor / status 和运行命令的可信服务入口。Codex 与 DSH Executor 已通过原始 Worker、三任务链、独立验收、逐任务提交及恢复验收。Codex、DSH、Cursor、OpenCode、Antigravity 和 Portable 的九个本地产物已通过统一打包验证;Antigravity 模型会话内 Skill 调用经用户豁免,尚未实测。各平台能力边界见能力矩阵及逐平台验证记录。

- 项目与仓库名:dev-harness-runtime
- CLI:dhr
- DSH 适配目标:0.2.0-rc.2
- Run 状态根:$(git rev-parse --git-path dev-harness-runtime)/runs/
- 每个 Run 的唯一权威状态文件:<run-id>/run.json

编程语言

TypeScript、JavaScript(ESM)与 Python fixture 校验。

构建系统

pnpm workspace、TypeScript 编译和 esbuild CLI bundle。

核心模块

- packages/contracts:版本化 TypeBox Schema、严格结构 / 关联校验、执行结果身份绑定与 JSON Schema 导出。
- packages/core/src/discovery:真实 Git / worktree 发现、docs root 选择和项目契约读取。
- packages/core/src/planning:结构化 Markdown 读取、依赖归档核验和权威顺序单任务选择。
- packages/core/src/snapshot:原始文件 / index / HEAD 内容快照、漂移和授权变更校验。
- packages/core/src/state / lock:私有 Run 持久化、revision CAS、操作证据、互斥 owner 与无锁只读状态检查。
- packages/core/src/recovery:按持久证据与真实边界分类恢复、显式对齐和新 Run 门禁;partial 的 noncompleted ending 安全停止,可信 worker-checkpoint 支持继续剩余工作。
- packages/core/src/result:冻结原验收输入、单任务 Planning delta、独立受控验收与接受 capability。
- packages/core/src/authorization:Linux 隔离验证 provider 与按冻结 Git policy 执行的受控提交 / 提交恢复。
- packages/core/src/worker:共享 Worker 请求构造、递归保护与紧凑父上下文投影。
- packages/core/src/orchestrator:可信 RuntimeAdapter 注册接入、任务执行循环、接受后重读计划及 resume / reconcile 桥接。
- packages/cli:参数、退出码与信号边界;doctor / status 只读入口,以及显式 RuntimeServices / BuildPipeline 注入入口;构建生成独立 bundle。
- packages/adapter-* / build/targets:统一 PlatformRegistry 为 run 和 build / validate / pack 提供同一平台注册表;可信宿主 Executor 仅在真实 probe 通过后注册,六平台 Packager 已接通。
- build/manifests、build/validators、build/transforms:来源与共享元数据校验、静态包检查、受限 Skill 转换和确定性归档。
- skills/run、skills/status、skills/worker:唯一共享 Skill 业务源码,平台差异留给后续转换。

使用说明

- 安装:pnpm install --frozen-lockfile --ignore-scripts
- 构建:pnpm build
- 运行:pnpm dhr --help
- Codex 插件:安装本地 Marketplace 后,在新线程显式使用 $dev-harness:status 或 $dev-harness:run;Skill 会调用同一插件包内的 scripts/dhr.mjs,不要求全局 dhr alias。

Codex 插件体验

每次从新的 Codex 线程显式调用插件。安装自检不会读取项目或创建 Run:

$dev-harness:run 插件安装自检

实际执行前,项目需要有可领取的 Planning Task,并按执行契约声明有界写入范围、归档目标和已确认的验证命令。可按需选择一种模式:

$dev-harness:run 执行任务 ID K5,不提交 $dev-harness:run 执行下一个 ready Task,不提交 $dev-harness:run 执行全部 ready Task,按任务提交

默认不提交;只有第三种示例中的明确授权才允许 Core 在每个 Task 独立验收通过后提交。运行返回 runId 后,可在新线程查询或恢复:

$dev-harness:status 查询 Run <run-id> $dev-harness:run 恢复 Run <run-id>

Linux 上执行 Task 还需要已登录的 Codex CLI 和可信 bubblewrap;Runtime 会在创建 Run 前探测实际能力,缺失时返回诊断并停止。父 Codex 的命令沙箱无法启动嵌套隔离时,会只为已校验的包内 dhr 精确命令请求升级;批准前应核对插件缓存路径、任务 ID、项目路径和提交模式。

与 dev-harness 协作

dev-harness 维护工程契约与 8 个技能;本项目提供统一执行 Runtime、dhr 和平台插件。技能包与 Runtime 插件分别安装;本项目的 run / status / worker 是执行入口,不替代上游 Planning、Commands 或 Git 工作流契约。

构建消费 protocol-lock.json 固定的上游来源;项目执行读取目标仓库的上下文、Planning、HARNESS 与 Git 规范。完整 Audit / Finding / Auto Fix / QA 流程不作为内建自动流水线,已准备好的 Planning Task 按公共 Core 契约执行。

各平台的打包、安装与自动执行能力见平台能力矩阵。DSH 是本仓库中的 Adapter / Packager 目标,其宿主能力由本仓库的实现与验证记录维护。

项目入口

- 文档导航
- 开发看板
- 资料完整性评估
- Git 提交与发布规范
- 共享打包契约
- v0.1.1 GitHub Release
- v0.1.0 GitHub Release
- MIT 许可与第三方许可声明

本地开发

使用 Node 24.15.0、pnpm 11.1.0,fixture 校验另需 Python 3.12。依赖版本由锁文件固定。

pnpm install --frozen-lockfile --ignore-scripts
pnpm verify
pnpm dhr --help

WSL2 已完成本机验证;Ubuntu / Windows 原生 CI 的离线验证与九产物 dry-run 已通过,见 CI run 36394754252。构建、测试及命令语义以 HARNESS 为准;模块边界见 ARCHITECTURE。

protocol-lock.json 固定上游提交和文件摘要。需要验证上游 checkout 时运行 pnpm verify:protocol --source <checkout>,不会自动下载或更新协议。
预览分享卡片长什么样 ↓Dev-Wiki/dev-harness-runtime
分享 · DeepSeek Harness Hub
Dev-Wiki/dev-harness-runtime

dev-harness 的统一执行 Runtime 与多平台插件分发层。任务选择、状态、授权、恢复和编排由公共…

回到顶部