以 Jev 为调度核心的新一代 harness 架构。
37.5/100
综合分
8
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/4 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yinhong-zhou/jevdo该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · skill
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 28 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/22) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装engines.node 要求 >=24.14.0,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包jevaction(未发布到 npm,仅可源码安装)
✗Node 引擎要求 >=24.14.0 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 04:48:48
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 46 处,展示前 44 条)
- 读取本地文件benchmarks/developer-workflows/dev.mjs:11
const json = async file => JSON.parse(await readFile(path(file), 'utf8')); - 写入本地文件benchmarks/developer-workflows/dev.mjs:12
const put = async (file, data) => { await mkdir(dirname(path(file)), { recursive: true }); await writeFile(path(file), JSON.stringify(data, null, 2)); - 写入本地文件benchmarks/developer-workflows/dev.mjs:12
const put = async (file, data) => { await mkdir(dirname(path(file)), { recursive: true }); await writeFile(path(file), JSON.stringify(data, null, 2)); - 写入本地文件benchmarks/developer-workflows/dev.mjs:13
const log = async (event, details = {}) => { await mkdir(path('.dev'), { recursive: true }); await appendFile(path('.dev/events.jsonl'), JSON.stringif - 写入本地文件benchmarks/developer-workflows/dev.mjs:13
const log = async (event, details = {}) => { await mkdir(path('.dev'), { recursive: true }); await appendFile(path('.dev/events.jsonl'), JSON.stringif - 发起网络请求benchmarks/developer-workflows/dev.mjs:19
const response = await fetch(info.url + '/health', { signal: AbortSignal.timeout(800) }); - 写入本地文件benchmarks/developer-workflows/dev.mjs:58
await mkdir(path('.dev'), { recursive: true }); - 执行外部命令来自配置/变量benchmarks/developer-workflows/dev.mjs:60
const child = spawn(process.execPath, [path('dev.mjs'), '_serve', role, randomUUID()], { - 发起网络请求benchmarks/developer-workflows/dev.mjs:76
await fetch(info.url + '/shutdown', { method: 'POST', headers: { 'x-instance': info.instance }, signal: AbortSignal.timeout(1000) }); - 读取本地文件benchmarks/developer-workflows/dev.mjs:84
const source = await readFile(path('src/math.mjs')); - 读取本地文件benchmarks/developer-workflows/dev.mjs:91
const source = await readFile(path('src/math.mjs')); - 写入本地文件benchmarks/developer-workflows/dev.mjs:93
await mkdir(path('build'), { recursive: true }); await cp(path('src/math.mjs'), path('build/math.mjs')); - 读取本地文件benchmarks/developer-workflows/dev.mjs:99
if (manifest.sourceHash !== hash(await readFile(path('src/math.mjs'))) || manifest.sourceHash !== hash(await readFile(path('build/math.mjs')))) throw - 读取本地文件benchmarks/developer-workflows/dev.mjs:111
if (await readFile(path('generated/client.ts'), 'utf8') !== expected) throw new Error('Generated client is stale'); - 读取本地文件benchmarks/developer-workflows/dev.mjs:152
const report = await json('.dev/test.json'); if (!report.passed || report.sourceHash !== hash(await readFile(path('src/math.mjs')))) throw new Error(' - 读取密钥环境变量src/cli.ts:19
jevConfigured: Boolean(process.env.TYPESAFE_API_KEY), - 读取本地文件src/cli.ts:31
print(await createAction(config.store, projectId, JSON.parse(await readFile(resolve(file), 'utf8')))); - 写入本地文件src/cli.ts:52
const folder = join(ROOT, '.runtime', `demo-${Date.now()}`); await mkdir(folder, { recursive: true }); - 执行外部命令来自配置/变量src/cli.ts:57
const execution = spawnSync(process.execPath, ['--import', 'tsx', fileURLToPath(import.meta.url), 'ask', id, `build_artifact ${id}`, '--literal-baseli - 读取本地文件src/cli.ts:61
runs.push({ project: id, result: JSON.parse(execution.stdout), artifact: await readFile(join(folder, id, 'artifact.txt'), 'utf8') }); - 读取本地文件src/config.ts:13
const models = Models.parse(JSON.parse(await readFile(resolve(ROOT, 'config/models.json'), 'utf8'))); - 读取密钥环境变量src/config.ts:20
const options = { apiKey: process.env.TYPESAFE_API_KEY || '', - 请求外部主机api.typesafe.aisrc/decision.ts:50
const response = await fetch(this.options.endpoint ?? 'https://api.typesafe.ai/v1/systemone', { - 发起网络请求src/decision.ts:50
const response = await fetch(this.options.endpoint ?? 'https://api.typesafe.ai/v1/systemone', { - 读取密钥环境变量src/dsh/host.ts:90
apiKey: process.env.DEEPSEEK_API_KEY || '', baseUrl: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com', - 读取本地文件src/dsh/host.ts:156
try { actions = (await readFile(resolve(runtime.store.home, 'events.jsonl'), 'utf8')).trim().split('\n') - 读取本地文件src/dsh/runtime.ts:72
const root = await realpath(resolve(agent.session.header.cwd)); - 执行外部命令来自配置/变量src/executor.ts:18
const child = spawn(spec.command, spec.args, { cwd, env, shell: false, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }); - 读取本地文件src/executor.ts:45
for (const entry of (await readdir(await within(project.root, folder), { withFileTypes: true })).sort((a,b) => a.name.localeCompare(b.name))) { - 读取本地文件src/learning.ts:14
return readFile(new URL('../prompts/action-authoring.md', import.meta.url), 'utf8'); - 发起网络请求src/model.ts:37
const response = await fetch(`${this.options.baseUrl.replace(/ $/, '')}/chat/completions`, { - 读取本地文件src/store.ts:9
const base = await realpath(root); - 读取本地文件src/store.ts:10
const target = await realpath(resolve(base, path)); - 写入本地文件src/store.ts:21
await mkdir(join(this.home, group), { recursive: true }); - 写入本地文件src/store.ts:24
await writeFile(temporary, JSON.stringify(value, null, 2), { flag: 'wx' }); - 删除本地文件src/store.ts:26
finally { await unlink(temporary); } - 读取本地文件src/store.ts:32
try { files = await readdir(folder); } catch (error) { - 读取本地文件src/store.ts:37
schema.parse(JSON.parse(await readFile(join(folder, file), 'utf8'))))); - 读取本地文件src/store.ts:54
project.root = await realpath(project.root); - 写入本地文件src/store.ts:78
await mkdir(this.home, { recursive: true }); - 写入本地文件src/store.ts:80
await appendFile(join(this.home, 'events.jsonl'), `${JSON.stringify({ at: new Date().toISOString(), ...event })}\n`); - 读取本地文件src/store.ts:87
hash.update(file).update(await readFile(await within(project.root, file))); - 读取本地文件src/tools.ts:33
const text = await readFile(await within(root, path), 'utf8'); - 写入本地文件src/tools.ts:41
await writeFile(destination, content);
扫描于 2026/11/1(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
涉及外部主机:api.typesafe.ai
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent-loop@deepseek-ai/dsh-brand@deepseek-ai/dsh-session-persistence-jsonl@deepseek-ai/dsh-util-values@deepseek-ai/schemastery@deepseek-ai/dsh-agent@deepseek-ai/dsh-llm@deepseek-ai/dsh-scope@deepseek-ai/dsh-session@deepseek-ai/dsh-session-persistence@deepseek-ai/dsh-session-projection给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- Jev调度核心
- 智能体循环
- 可复用动作
README
由 DeepSeek 最新模型翻译生成JevDo
模型现在只是个工具。
以 Jev 为调度核心的新一代 harness 架构。
Action 沉淀经验 · Jev 决定下一步 · 大模型只是选项之一
Just Jev it.
简体中文 · English
使用场景 · 快速开始 · 工作方式 · 实验结果 · 贡献指南
会做的事,为什么还要再想一遍? 第十次打开同一个项目,它还在读配置、找脚本、拼命令,把上周已经走通的路再想一遍。JevDo 在调用大模型之前,先让 Jev 判断:这件事,是不是已经会了?已有操作能处理,就直接调度执行;遇到新问题,再交给主模型。主模型把值得复用的做法保存为 Action,经过验证,留给下一次会话。
接力长什么样
三个使用示例,假设项目已保存并验证了对应的 Action。
① 日常修 bug
“启动后台,修掉订单列表的分页 bug,跑完单测和构建再交给我。”
Jev 启动依赖与服务,检查就绪 [start-admin-backend] ↓ 主模型 读 issue,定位并修复分页逻辑 ↓ Jev 跑单测、构建,核对退出码与产物 [test-and-build] ↓ 主模型 说明修改与验证结果
② CI 红了
“CI 的 lint 又挂了,本地复现修一下,确认能过。
展开完整文档(README 剩余 1 节)
JevDo
模型现在只是个工具。
以 Jev 为调度核心的新一代 harness 架构。
Action 沉淀经验 · Jev 决定下一步 · 大模型只是选项之一
Just Jev it.
简体中文 · English
使用场景 · 快速开始 · 工作方式 · 实验结果 · 贡献指南
会做的事,为什么还要再想一遍? 第十次打开同一个项目,它还在读配置、找脚本、拼命令,把上周已经走通的路再想一遍。JevDo 在调用大模型之前,先让 Jev 判断:这件事,是不是已经会了?已有操作能处理,就直接调度执行;遇到新问题,再交给主模型。主模型把值得复用的做法保存为 Action,经过验证,留给下一次会话。
接力长什么样
三个使用示例,假设项目已保存并验证了对应的 Action。
① 日常修 bug
“启动后台,修掉订单列表的分页 bug,跑完单测和构建再交给我。”
Jev 启动依赖与服务,检查就绪 [start-admin-backend] ↓ 主模型 读 issue,定位并修复分页逻辑 ↓ Jev 跑单测、构建,核对退出码与产物 [test-and-build] ↓ 主模型 说明修改与验证结果
② CI 红了
“CI 的 lint 又挂了,本地复现修一下,确认能过。”
Jev 准备依赖,按 CI 配置复现 lint [repro-ci-lint] ↓ 主模型 根据报错修改代码 ↓ Jev 重跑 lint,再执行提交前检查 [verify-before-push] ↓ 主模型 解释改动,给出 commit message
③ 准备发版
“走一遍发版流程:版本号、changelog、tag、构建产物。”
Jev 跑全量回归,检查发版条件 [regression-gate] ↓ 主模型 读合并记录,更新版本号与 CHANGELOG ↓ Jev 按项目脚本打 tag、构建、校验产物 [cut-release] ↓ 主模型 整理 release notes
Jev 调度重复操作,主模型处理新问题。 启动 → 代码修改 → 测试构建的完整交接已在实验中跑通。如果请求只是“启动项目”或“跑一遍回归”,已有 Action 能覆盖全部工作且满足完成条件时,Jev 可以独立完成,全程零次主模型调用。
一轮是怎么走的
- Jev:决定下一步。读取与主模型相同的已组装会话和工具历史,选择 Action、请求主模型、澄清或结束本次请求。
- Action:留下怎么做。命令或脚本,连同用途、项目绑定和验收方式,跨会话保留;简单操作直接保存命令,复杂行为更适合脚本。
- 主模型:解决新问题,积累新操作。写代码、做推理、处理异常,也在任务中主动维护 Action 库。
基于 DeepSeek Harness,早期版本优先支持 DSH 0.2.0-rc.1 的 headless 使用。包名和工具前缀保留 jevaction。主模型参与后,由它完成最终答复。
flowchart LR
U["任务与会话历史"] --> J{"Jev"}
J -->|已有 Action| A["Harness 执行与验收"]
J -->|新问题 / 异常| M["主模型"]
A --> H["结果回到共同历史"]
M -->|工具调用与结果| H
H --> J
M -.->|保存并验证| K[("Action 库")] K -.->|候选操作| J classDef judge fill:#ede8ff,stroke:#9b8deb,color:#302653 classDef model fill:#eef3ff,stroke:#5171ae,color:#162b50 class J judge class M model
Jev 选择,代码执行。它只能选择当前可用的操作和参数,实际命令仍经过宿主工具权限与验收。实现发生变化、执行失败,或没有合适的操作时,工作交回主模型。
Action 怎么留下来
第一次,主模型读取项目,找到可复用的命令或脚本,通过 jevaction_create 保存用途、项目绑定和验收方式,再用 jevaction_validate 验证并激活。它会主动考虑保存稳定的开发操作,也遵守用户“不保存”的要求。
下一次,Jev 根据当前请求选择 Action 和项目,Harness 补全已保存的执行参数,运行并验收。操作成功不等于整个任务结束:还需要分析、修改或解释,就继续调用主模型。
同一个构建 Action 可以绑定不同项目的命令。实现脚本变化后,旧版本需要复核;测试针对的源码、报表读取的数据变化,则由验收检查当前结果。完整规则见 Action 规格 与 使用场景。
实测
在三个常见开发场景——项目启动、项目测试与构建、本地发布——中,对比 JevDo 与原生 DSH Loop。所有组获得相同现成脚本,原实验 Action 库从空开始;原生 DSH Loop 每项测一次,JevDo 每轮新会话、相同输入并保留操作库。
| 每组 3 个任务 | 原生 Loop | JevDo 第 1 轮(积累) | 第 2 轮 | 第 3 轮 |
| 验收成功 | 3/3 | 3/3 | 3/3 | 3/3 |
| 主模型调用 | 24 | 22 | 0 | 0 |
| 无需主模型的任务 | 0/3 | 0/3 | 3/3 | 3/3 |
| Jev 调用 | 0 | 56 | 20 | 15 |
| 平均耗时 | 10.06 s | 19.36 s | 3.61 s | 3.17 s |
| 估算费用(含 Jev) | ¥0.2245 | ¥0.6065 | ¥0.0828 | ¥0.0587 |
| 相对原生的费用降低 | — | — | 63.14% | 73.86% |
表中为自主保存组。后两轮均无需主模型,平均估算费用比原生同任务降低 68.50%。 降幅仅指复用阶段;包含首次积累的三轮合计 ¥0.7480,仍比原生单轮乘三的外推参考高 11.04%。费用包含 Jev,沿用固定费率,非实际账单。
这是原实验的事后三任务子集统计,没有重跑或改写原始数据;小样本一次采样,非公开基准成绩。原四任务的 31 → 8 次、约 74% 调用降幅及回滚记录保留在历史报告中。最终三任务结果 · 费用拆解 · 原四任务报告 · 原始轨迹
快速开始
需要 Node.js 24.14+。先运行不需要 API 密钥的跨会话复用演示:
git clone https://github.com/yinhong-zhou/jevdo.git
cd jevdo
npm ci
npm run demo
接入真实 Jev 与主模型,或替换自己的 DSH 默认 Loop,见 安装与配置。插件提供 Loop、Action 工具和维护提示;实际执行继续使用宿主工具。
文档与开发
配置与实现参考 · Action 规格 · 使用场景 · 反馈问题
欢迎提交 Action 示例、复现用例、Loop 修复与文档改进。开发约定与上游协作方式见 贡献指南。
npm run check
npm test
npm run build
当前可学习操作以固定命令和项目绑定为主,任意自由参数、完整 Web UI 和多 Agent 组合兼容性不在已验证范围内。核心入口见 src/dsh/index.ts,完整实现边界见 参考文档。
来源与协议
MIT。感谢 DeepSeek Harness 的作者与贡献者提供插件与 Agent 运行底座。本项目适配了其官方 Loop 生命周期代码,原版权与来源保留在 第三方声明 和 适配代码。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yinhong-zhou/jevdo
以 Jev 为调度核心的新一代 harness 架构。
相关插件 · 技能 / 提示词
人设统管ZiChuanLan/agent-purge
一份系统提示词,喂给多个 coding…
★ 931已汉化DSH
73.8
人物画像蒸馏titanwings/distilly
Distilly — 把他们的思考方式提炼成可复用的技能,供任何智能体或机器人使用。原名 Colleague Skill(原同事 Skill)。
★ 25,659已汉化DSH
71.3
推理工作空间套件Tiger3807861189/J-Space-Cognition-Suite
J-Space 是面向复杂推理、大型仓库工程、子代理协作与授权安全分析的推理时工作空间和控制套件。
★ 2,957已汉化DSH
70.5
两阶段工具锚定预设xiaobright/dsh-anchored-standard
实验性 DeepSeek Harness agent preset…
★ 3,742已汉化DSH
70.1
智能体工作流编排nrslib/takt
不再日夜盯着 AI 编码智能体。
★ 1,402已汉化DSH
70
Agent 运行时手册Electricitysheep/dsh-handbook
DeepSeek Harness dsh 从 0 到 1 深度手册:安装/插件开发/性能调优/实测案例/同模型多…
★ 827已汉化DSH
68.7