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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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>,不会自动下载或更新协议。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Dev-Wiki/dev-harness-runtime
dev-harness 的统一执行 Runtime 与多平台插件分发层。任务选择、状态、授权、恢复和编排由公共…
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9