dsh-openwolf:给 DeepSeek Harness 用的紧凑代码地图「第二大脑」——预索引项目地图、逐文件摘要,还能注入 AGENTS.md(wolf_map / wolf_file / wolf_refresh)
36/100
综合分
3
GitHub 星标
206
npm 周下载
—/5
用户评分
数据截至 2026/10/10 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-openwolfnpm 源 · dsh-openwolf 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-openwolf @ 0.10.2
✓Node 引擎要求 >=20.19.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 22:52:34
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 64 处,展示前 51 条)
- 读取本地文件bin/wolf.mjs:161
const st = await stat(join(dir, entry.path)) - 读取本地文件bin/wolf.mjs:201
token = (await readFile(tokenFile, 'utf8')).trim() - 写入本地文件bin/wolf.mjs:207
await mkdir(dirname(tokenFile), { recursive: true }) - 写入本地文件bin/wolf.mjs:208
await writeFile(tokenFile, token, 'utf8') - 写入本地文件bin/wolf.mjs:210
await chmod(tokenFile, 0o600) - 读取本地文件bin/wolf.mjs:235
if (!existsSync(pkgPath)) { - 读取本地文件bin/wolf.mjs:240
const ownVersion = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')).version - 读取本地文件bin/wolf.mjs:241
const doc = JSON.parse(await readFile(pkgPath, 'utf8')) - 写入本地文件bin/wolf.mjs:247
await writeFile(pkgPath, JSON.stringify(doc, null, 2) + '\n', 'utf8') - 执行外部命令固定命令bin/wolf.mjs:260
? spawn('cmd.exe', ['/c', 'pnpm', 'install', '--registry=https://registry.npmjs.org', '--no-frozen-lockfile'], { cwd: profileDir, stdio: 'ignore' }) - 执行外部命令固定命令bin/wolf.mjs:261
: spawn('pnpm', ['install', '--registry=https://registry.npmjs.org', '--no-frozen-lockfile'], { cwd: profileDir, stdio: 'ignore' }) - 读取本地文件bin/wolf.mjs:286
const ownVersion = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')).version - 执行外部命令来自配置/变量bin/wolf.mjs:688
const child = spawn(process.execPath, childArgs, { detached: true, stdio: 'ignore' }) - 写入本地文件bin/wolf.mjs:690
await writeFile(pidPath, String(child.pid), 'utf8') - 删除本地文件bin/wolf.mjs:698
await rm(pidPath, { force: true }) - 读取本地文件lib/scanner.js:24
const gitignore = opts.useGitignore ? await loadRootGitignore(root, async (p) => readFile(p, 'utf8')) : []; - 读取本地文件lib/scanner.js:96
buf = await readFile(filePath); - 读取本地文件lib/scanner.js:135
entries = await readdir(dirAbs, { withFileTypes: true }); - 读取本地文件lib/scanner.js:172
st = await stat(`${base}/${rel}`); - 读取本地文件lib/scanner.js:187
const st = await stat(`${base}/${w.rel}`); - 读取本地文件lib/scanner.js:229
entries = await readdir(dirAbs, { withFileTypes: true }); - 读取本地文件lib/render.js:90
existing = await readFile(filePath, 'utf8'); - 写入本地文件lib/render.js:99
await mkdir(dirname(filePath), { recursive: true }); - 写入本地文件lib/render.js:100
await writeFile(filePath, next, 'utf8'); - 写入本地文件lib/brain.js:98
await mkdir(join(this.dir, 'hooks'), { recursive: true }); - 读取本地文件lib/brain.js:103
await stat(p); - 读取本地文件lib/brain.js:116
await stat(join(this.dir, file)); - 读取本地文件lib/brain.js:170
return await readFile(p, 'utf8'); - 写入本地文件lib/brain.js:177
await mkdir(dirname(p), { recursive: true }); - 写入本地文件lib/brain.js:181
await writeFile(tmp, text, 'utf8'); - 写入本地文件lib/brain.js:182
await rename(tmp, p); - 读取本地文件lib/brain.js:189
return JSON.parse(await readFile(p, 'utf8')); - 读取本地文件lib/brain.js:381
existing = await readFile(p, 'utf8'); - 读取本地文件lib/brain.js:491
for (const entry of await readdir(this.dir, { recursive: true })) { - 删除本地文件lib/brain.js:493
await unlink(join(this.dir, entry)).catch(() => { }); - 写入本地文件lib/brain.js:516
await mkdir(lockPath); - 删除本地文件递归lib/brain.js:524
await rm(lockPath, { recursive: true, force: true }); - 删除本地文件递归lib/brain.js:541
await rm(lockPath, { recursive: true, force: true }).catch(() => { }); - 读取本地文件lib/dashboard.js:217
mtime = (await stat(join(brain.dir, rel))).mtimeMs; - 读取本地文件lib/registry.js:25
return JSON.parse(await readFile(path, 'utf8')); - 写入本地文件lib/registry.js:32
await writeFile(path, `${JSON.stringify(doc, null, 2)}\n`, 'utf8'); - 写入本地文件lib/registry.js:75
await mkdir(dest, { recursive: true }); - 读取本地文件lib/registry.js:83
const entries = await readdir(root); - 读取本地文件lib/registry.js:87
if ((await stat(join(root, e))).isDirectory()) - 删除本地文件递归lib/registry.js:110
await rm(dest, { recursive: true, force: true }); - 写入本地文件lib/registry.js:111
await mkdir(dest, { recursive: true }); - 读取本地文件lib/import-openwolf.js:69
return JSON.parse(await readFile(p, 'utf8')); - 读取本地文件lib/import-openwolf.js:78
return await readFile(p, 'utf8'); - 写入本地文件lib/import-openwolf.js:87
await writeFile(tmp, text, 'utf8'); - 写入本地文件lib/import-openwolf.js:88
await rename(tmp, p); - 读取本地文件lib/import-openwolf.js:117
sourceIsDir = (await stat(source)).isDirectory();
扫描于 2026/11/1(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/dsh-code-runtime@deepseek-ai/dsh-invariants@deepseek-ai/dsh-agent@deepseek-ai/dsh-user-approval@deepseek-ai/dsh-llm@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-skill@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-attachment@deepseek-ai/dsh-tools@deepseek-ai/dsh-timeout给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 预索引项目地图
- 逐文件摘要
- 注入AGENTS.md
最近更新
在 GitHub 查看全部 →v0.10.22026-10-08
· 修复
插件市场的开关每次都被打回“重启后生效”。 市场的热挂载只接受纯 id/name
的 insert 行;cordis.patch.yml 里那段 config: 块加一行 inject: 会让整份补丁被
判为“含配置行/表达式”,于是:
· 开启 → 无法热挂载 → 回退到“重启后生效”;
· 按市场的 #575 规则,热挂载失败的 enable 不会被持久化 → 关一次之后再开,会一直卡在
关闭状态,只能靠手改补丁层或重启到恰到好处才能恢复。
现在 bundle patch 只剩:
· insert:
- id: openwolf
name: dsh-openwolf
没有任何行为变化:被删掉的每个选项本来就等于 src/index.ts 里的 schema 默认值
(maxMapBytes / maxFiles / ignore / brainEnabled / interceptReads …),
inject: [tools] 也由模块自身 export const inject = ['tools'] 声明。要覆盖选项,写在
自己 profile 的 cordis.patch.yml(行 id openwolf)——用户层配置不影响热挂载路径。
效果:市场里对 dsh-openwolf 的开 / 关都不再需要重启,关掉之后也能正常开回来。
· 依赖(沿用 0.10.1 的显式声明)
| 位置 | 声明 |
| --- | --- |
| engines.dsh | >=0.1.0-rc.6 =20.19.0 |
| @deepseek-ai/dsh-tools / dsh-skill / dsh-llm / dsh-session (peer) | >=0.1.0-rc.6 |
| @deepseek-ai/cordis (peer) | ^4.0.1 |
已验证环境:DSH 0.2.0-rc.2(dsh-desktop 0.11.0)+ cordis 4.0.4。
· 安装
npm i dsh-openwolf@0.10.2
已在 DSH 插件市场安装过的话,更新到 0.10.2 即可获得正常的开/关行为。
· 校验
本 Release 附件与 npm 分发产物逐字节相同:
sha1 9f1585d922cb9160efdd6cdccf950a8f97d05086 dsh-openwolf-0.10.2.tgz
sha512 F/ADA6WJ2LK6KiUcTMu8dSwvpy0gWd5j6IAP4PmD4E3Y/4wl6gZW2xHIs/f46V8K+HdliDBIOujbzXGOuhZs/w==
37 个文件 / 106,185 字节。
v0.10.12026-10-08
· 修复
注入上下文污染了每一个 session-format-v4 会话。 wolfMessage() 用已退役的
{ kind: 'plugin', plugin: 'dsh-openwolf' } 包装归属它注入的上下文;会话格式 v4 直接
拒绝这种来源,而拒绝是粘性的 —— 被拒的那次写入会污染活会话,之后每一次写入
(turn/end、投影缓存、重命名、删除)都跟着失败。现象就是:会话报
本轮运行失败 format v4 message requires a producer-owned source kind,
同一个会话改名和删除也一起失效。
现在来源跟随接收会话:v4 会话用生产者自有的 { kind: 'plugin:dsh-openwolf' },
仅 pre-v4 会话保留历史包装;agent/inject() 与 additionalContexts 四处注入点
都传入了 live session。
· 变更:DSH 宿主依赖已显式标记
本版把「对 DSH 的依赖」从隐性变成可被插件市场体检读取的声明:
| 位置 | 声明 |
| --- | --- |
| engines.dsh | >=0.1.0-rc.6 =0.1.0-rc.6 |
| @deepseek-ai/dsh-skill (peer) | >=0.1.0-rc.6 |
| @deepseek-ai/dsh-llm (peer) | >=0.1.0-rc.6 |
| @deepseek-ai/dsh-session (peer) | >=0.1.0-rc.6 — 本版新增 |
| @deepseek-ai/cordis (peer) | ^4.0.1 |
| engines.node | >=20.19.0 |
为什么必须补上 @deepseek-ai/dsh-session:会话格式代际(SESSION_FORMAT_VERSION)
正是由这个包持有,而它此前只出现在 devDependencies —— 会话格式从 v3 演进到 v4
这类破坏性变更,在插件声明层面完全不可见,任何兼容性预检都无法把它标红。
同时把 dsh-tools / dsh-skill / dsh-llm 的 ^0.1.0-rc.6 放宽:0.x 的 caret
上界会把 0.2.x 宿主判成越界,既低估了支持范围,也掩盖了真实的 0.2 发布线。
· 运行要求
· Node.js >= 20.19.0
· DeepSeek Harness 宿主 >= 0.1.0-rc.6 < 0.3.0
· 已验证环境:DSH 0.2.0-rc.2(dsh-desktop 0.11.0)+ cordis 4.0.4
· 安装
npm i dsh-openwolf@0.10.1
或在 DSH 插件市场安装 / 更新 dsh-openwolf。
· 校验
本 Release 附带的 .tgz 与 npm 分发的产物逐字节相同,可直接核对:
sha1 280a8f9304f88a722e6fe51c8fe824582e169cf6 dsh-openwolf-0.10.1.tgz
sha512 LLsJH09VQ5nJb7EjpjE1yEv60Gn4Bo6o6Q1uut9dBtev5Gxxd/lyRMKW9PzdGN9o6FVlDHeLL8suI9kTCqjXVA==
37 个文件 / 104,751 字节。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-openwolf
DeepSeek Harness 的第二大脑。
更好的上下文管理、预索引项目地图、更聪明的 token 利用,通过 harness 隐形钩子交付。工作流零改动。
快速开始 · 它会创建什么 · 初始化 · 工作原理 · Token 智能 · 仪表盘 · 命令 · 变更日志
| 不用 dsh-openwolf | 用 dsh-openwolf |
| 模型反复整文件重读(每次 ~2,000 tokens) | 先读一行摘要,或干脆跳过读取 |
| 为找一个函数整文件读取 | 符号级提示给出精确行号,offset/limit 定向读 |
| 上下文压缩抹掉已做的工作 | PreCompact 快照 + 恢复摘要,工作留在上下文里 |
| 每个会话从冷提示开始 | 预算封顶的会话摘要预载目标、已知错误、最近修复与项目地图 |
| 不知道 token 花在哪 | harness token meter 实测 + 实时本地仪表盘 |
为什么用 dsh-openwolf?
编码智能体很强大,但它们是「盲」的。在打开文件之前,智能体不知道文件里有什么;它分不清 50-token 的配置和 2,000-token 的模块;同一会话里重读同一文件而不自知;跨会话忘记你的纠正;上下文窗口压缩时丢失一切。
展开完整文档(README 剩余 1 节)
dsh-openwolf DeepSeek Harness 的第二大脑。 更好的上下文管理、预索引项目地图、更聪明的 token 利用,通过 harness 隐形钩子交付。工作流零改动。 快速开始 · 它会创建什么 · 初始化 · 工作原理 · Token 智能 · 仪表盘 · 命令 · 变更日志 | 不用 dsh-openwolf | 用 dsh-openwolf | | 模型反复整文件重读(每次 ~2,000 tokens) | 先读一行摘要,或干脆跳过读取 | | 为找一个函数整文件读取 | 符号级提示给出精确行号,offset/limit 定向读 | | 上下文压缩抹掉已做的工作 | PreCompact 快照 + 恢复摘要,工作留在上下文里 | | 每个会话从冷提示开始 | 预算封顶的会话摘要预载目标、已知错误、最近修复与项目地图 | | 不知道 token 花在哪 | harness token meter 实测 + 实时本地仪表盘 | 为什么用 dsh-openwolf? 编码智能体很强大,但它们是「盲」的。在打开文件之前,智能体不知道文件里有什么;它分不清 50-token 的配置和 2,000-token 的模块;同一会话里重读同一文件而不自知;跨会话忘记你的纠正;上下文窗口压缩时丢失一切。 dsh-openwolf 给 harness 一个修复这一切的第二大脑——灵感来自 Claude Code 版 OpenWolf,作为 DeepSeek Harness 原生插件从零实现(MIT,不含 AGPL 参考项目的任何代码): - 上下文管理。 每个会话开始注入一份预算封顶的摘要(当前目标、已知错误、已修复 bug、项目地图)。压缩快照 + 压缩感知恢复意味着上下文压缩不再抹掉会话已完成的工作。 - 架构脚手架。 一份持久、自愈的项目索引为每个文件标注描述、token 估算,大文件还索引函数与类及其精确行号。智能体导航你的代码库,而不是重新发现它。 - Token 利用。 重复读被拦下,整文件读变成定向切片读,真实用量从 harness token meter 实测——你可以验证节省,而不是相信估算。 快速开始 两种安装方式,二选一——最终都能获得完整体验。 方式 1 —— 装进 harness(推荐) 最直接的方式。 一条命令,每个会话获得完整体验(会话摘要、读/写拦截、工具、技能): dsh plugin --profile web add dsh-openwolf # 装进你的 profile dsh web # 重启(或重启 GUI) 就这么简单。无需初始化、无需配置:第一个会话里插件扫描一次工作区,此后保持地图新鲜,在底层默默工作——harness 照常用,没有任何流程改动。 不想敲命令?让智能体帮你装。 把下面这句复制进任意会话(Web GUI 或 headless 都行),智能体会替你安装并重启: 帮我把 dsh-openwolf 装进当前 profile,然后重启让它生效。 智能体会执行 dsh plugin --profile web add dsh-openwolf、重启,然后确认装好了。(用自己的话表达也可以——智能体理解意图,不挑措辞。) 方式 2 —— 独立安装 CLI,再接进 harness 本包也是普通 npm 包:装在任何地方,dshwolf CLI 即可独立使用(init / (scan / status / report / dashboard / cron / backups): npm install -g dsh-openwolf # 或项目内:npm install --save-dev dsh-openwolf dshwolf init . && dshwolf scan . # 初始化 + 索引当前目录 要在 harness 里也使能(会话获得工具、会话摘要、读/写拦截——而不只是 CLI),把已装的包接进某个 profile——一条命令同时完成初始化 + 接线 + 安装依赖: dshwolf init . --agent deepseek-harness # 初始化 + 接进默认 profile(web) dsh web # 重启 harness(或重启 GUI) 也可以指定某个 profile 或全部,OpenWolf 风格: dshwolf init . --agent headless # 接进 'headless' profile dshwolf init . --agent all # 接进所有 profile dshwolf harness status # 看看哪些 profile 已接线 dshwolf harness add web # 显式接线 + 安装到某个 profile 为什么需要这一步。 CLI 和 harness 插件是同一个 .dshwolf/ 大脑的两个前端——CLI 初始化的内容(地图、STATUS、memory、buglog、账本)正是 harness 读取的内容。但全局 npm install 对 harness 不可见:harness 只解析你 profile dependencies 里声明的包(已实测:profile node_modules 解析不到全局副本)。dshwolf init --agent(与 harness add)替你注册依赖 + bundle 行并自动运行 pnpm install——对应 OpenWolf openwolf init --agent claude 的一步到位(只想改 package.json 时用 --no-install,如 CI)。两个前端并存——CLI 给人和 cron 用、插件给会话用,共享同一个大脑。DSH 本身就是 agent 平台,所以"接线"= profile 里注册一行,而不是 OpenWolf 的 hook 文件安装。 从 git URL 或本地 checkout 安装需要额外的构建授权——见从源码安装。 装完你能得到什么(全部开箱即用,无需额外配置): | 领域 | 内容 | | 会话内工具 | wolf_map · wolf_file · wolf_refresh · wolf_scan · wolf_init · wolf_status · wolf_learn · wolf_bug · wolf_report · wolf_schedule | | 自动行为 | 会话开始摘要、重复读警告、符号行号提示、写动作日志、压缩幸存 | | CLI 命令 | init · scan · scan --check · status · report · bug search · cron · register · update · backups · restore · dashboard · daemon | | 仪表盘 | 实时本地面板:token、上下文健康、anatomy、活动、cron | 每个命令的用途场景见命令;自我维护机制(什么自动初始化、什么保持新鲜、什么时候才需要手动命令)见初始化与保持新鲜。 它会创建什么 首次扫描会在工作区创建 .dshwolf/ 目录: | 文件 | 用途 | | anatomy-index.json | 持久项目索引:描述、token 估算、内容哈希、符号 | | anatomy.md | 索引的人类可读渲染,自动保持同步 | | cerebrum.md | 学习到的偏好、纠正、Do-Not-Repeat 列表 | | memory.md | 时序动作日志(含 token 估算) | | STATUS.md | 会话交接:一次小读取即可恢复任何会话 | | buglog.json | bug 修复记忆,可搜索,防止重新排查 | | token-ledger.json | 实测 token 用量,按会话与 agent 统计 | | hooks/ | 会话状态、扫描状态(git HEAD 钉住)、压缩前快照 | | config.json | 配置,包括会话摘要预算 | | OPENWOLF.md | agent 遵循的操作协议 | 为什么用 .dshwolf/ 而不是 .wolf/? 原版 OpenWolf(面向 Claude Code / Codex / OpenCode / Gemini / Cursor)也使用 .wolf/ 大脑。我们把大脑放在独立的 .dshwolf/ 目录,意味着两个工具可以管理同一个工作区而互不覆盖彼此的配置、账本或记忆——未来的 OpenWolf 更新也永远不会逼着这里跟着改。 从本插件旧位置(0.9 之前)迁移:mv .wolf .dshwolf。从原版 OpenWolf 迁移:dshwolf import-openwolf——把 .wolf/ 的 cerebrum、memory、buglog、 STATUS 增量合并进 .dshwolf/(内容级去重、先备份、幂等),详见命令。(文件格式遵循 OpenWolf 行为规范——cerebrum、STATUS、 buglog、memory——所以一个项目可以选择任一大脑或两者并用。) 初始化与保持新鲜 无需任何手动初始化——插件在工作区的首次使用时惰性初始化大脑,之后自动重扫: - 首次接触:第一次调用 wolf_ 工具(或第一个带 injectAgentsMd 的会话)即创建 .dshwolf/、扫描一次工作区、把地图注入 AGENTS.md。不需要单独执行 init。 - 自动刷新:防抖 watcher 在文件变更时重扫;write/edit 结果立即重分析被改文件,地图和 anatomy.md 随你的工作保持新鲜。 - 会话开始摘要:每个新会话注入预算封顶的摘要(STATUS 🚀 / Do-Not-Repeat / 最近 bugs / anatomy 指针),扫描过旧或 git HEAD 移动时给出陈旧警告。 想要显式控制时,一切都是一条命令(会话内也有对应工具): | 你想… | 命令(CLI) | 工具(会话内) | | 立刻从磁盘重建整个索引 | dshwolf scan | wolf_refresh | | 校验索引与文件系统一致(CI 友好) | dshwolf scan --check | wolf_scan | | 手动初始化 .dshwolf/(幂等,很少需要) | dshwolf init | wolf_init | | 读写会话交接文档 | dshwolf status | wolf_status | | 更新所有已注册项目(先备份) | dshwolf update | — | | 从时间戳备份回滚 .dshwolf/ | dshwolf restore | — | | 定时无人值守重扫(零 token) | dshwolf cron add … scan | wolf_schedule | 提示:这些基本都不需要——插件的职责就是让大脑自我维护。只有当你在 harness 之外改了大量文件(例如一次大 git pull)想立刻重建地图时,才需要跑 dshwolf scan。 工作原理 会话开始插件注入预算封顶的摘要:当前目标、已知错误、最近 bug 修复、项目地图指针 agent 决定读一个大文件 插件:"auth.ts (~2,900 tok)。符号: validateToken L82-140 ~450 tok。 用 offset/limit 只取你要的部分。" agent 编辑文件插件在跨进程锁下更新索引、记录动作、刷新被改文件的条目会话中途上下文压缩插件在压缩前快照状态,压缩后重新注入"本会话已改文件"摘要, agent 不会重做已完成的工作会话结束插件从 harness token meter 读取真实用量写入账本 代码地图通过 harness 内置的 agent-instructions 插件预载:插件在工作区 AGENTS.md 内维护一个标记围栏块(你自己的内容从不被改动,相同内容绝不重写),所以每个会话开始时地图已经在上下文里。 上下文管理 - 会话摘要。 会话开始时把最高价值状态推进模型上下文,按可配置的 token 预算封顶(各段成本优先用 harness token meter 的启发式计价)。模型不需要读六个文件就能拿到所需。 - 压缩幸存。 compaction/start 快照;压缩后摘要列出已修改文件并指向动作日志。恢复与压缩不再重置跟踪。 - 陈旧检测。 扫描钉住 git HEAD。HEAD 移动或扫描超龄时,agent 会被提示先重扫再信任地图——错误索引绝不会被静默信任。 - STATUS.md 交接。 阶段末状态放在一份小文档里,新会话一次读取即达生产性上下文。 - 维护提醒。 cerebrum 过少 → 用 wolf_learn;buglog 为空 → 用 wolf_bug。插件提醒,模型喂大脑。 项目解剖 索引是持久存储(anatomy-index.json)加人类可读渲染(anatomy.md)。写入方通过跨进程锁协调,并发 hook 触发不丢条目。手改 markdown 会被内容哈希检测并 加性吸收(绝不覆盖)。 超过 500 估算 token 的文件还索引顶层符号: - shared.ts (~3,200 tok) - fn parseAnatomy L82-104 (~180 tok) - fn serializeAnatomy L106-129 (~200 tok) 在大文件被读取前,提示列出最大的符号及其行号,agent 用 offset/limit 取一个函数而不是整个文件。文件在索引后变过则自动抑制提示——过期行号绝不会误导读取。 当前符号支持:TypeScript、JavaScript、Python、Go、Rust、Java(lezer CST 解析,可选依赖——其余语言回退正则启发式)。 Token 智能 估算有用,实测可信。插件从 harness token meter(ctx.tokenMeter, provider 上报)读取真实用量,按会话写入账本: dshwolf report token ledger: 12 sessions measured (harness token meter): ~1,549,658 tokens estimated (heuristic): ~1,420,011 tokens current session: ~57,489 tokens DeepSeek Harness 实测 A/B(同一"1 读 1 编辑"任务、同一份 3 文件工作区、 provider 上报合计): | 运行 | 读取 | 编辑 | 计费 tokens | | 带 dsh-openwolf | 1 | 1 | 39,164 | | 不带 | 1 | 1 | 35,488 | | 差值 | | | +3,676(+10%) | 诚实解读:在"单次读取"的最小任务上,插件是净开销——固定成本占优。 省 token 的机制(避免重复读、offset/limit 定向读、地图优先导航)要等会话读多个文件或重复读同一文件时才兑现。原版项目字段数据(启发式估算)平均 ~65.8% token 下降、拦下 71% 的重复读。预期:会话触及多个文件或足够长时回本。 插件每个会话新增什么: | 组件 | 频次 | 大小 | | 会话摘要(+维护提醒) | 会话开始 | ≤ 1,500 tokens(可配) | | AGENTS.md 地图块(injectAgentsMd 开启时) | 会话基线 | ≤ maxMapBytes(16 KiB ≈ 4k tokens) | | 10 个 wolf_ 工具 schema | 每个请求 | ≈ 1–2k tokens(KV-cache 前缀稳定) | | 2 条技能目录条目 | 会话基线 | ≈ 100 tokens | 一次性小任务可考虑 digestEnabled: false / injectAgentsMd: false / 调小 maxMapBytes。 安全 - 仪表盘只绑定 127.0.0.1,所有 API 访问需要逐项目 token(timing-safe 比较);token 可放 --token-file(chmod 600),不出现在命令行参数里。 - 所有动态进程调用使用参数数组,任何地方都不做 shell 插值。 - 所有文件访问都有路径穿越防护。 - 密钥类文件(keys、keystores、凭据文件、.npmrc、.env 等)绝不进入索引、提示或日志;模板(.env.example)保持可索引。 - 安全回归套件随 pnpm test 运行。 内置技能 两个技能注册进 harness 技能目录: - wolf-security-audit —— 分层审计(依赖 → 秘密 → 注入面 → 授权),产出严重度排序报告并写入 .dshwolf/buglog.json。 - wolf-reframe —— 设计大脑。从 13 框架知识库挑选或迁移 UI 框架,或按反"AI 味"设计准则审计/修复现有 UI:独特性是验收标准,一眼可辨的 AI 生成外观是失败态。 仪表盘 dshwolf daemon start dshwolf dashboard 本地、token 认证的仪表盘:实测 vs 估算 token、上下文健康(扫描新鲜度、钉住的 git HEAD、摘要预算)、会话交接、实时活动、cron 控制、带逐文件符号的 anatomy 浏览器。面板可深链(/#tokens)。页面是实时的——SSE 流在 brain 文件一变就重渲染当前面板,流断开时回退 30s 轮询。 命令 所有命令都接受可选目录参数(默认当前工作目录)。按使用场景分组: 大脑生命周期 | 命令 | 作用 | 什么时候用 | | dshwolf init [dir] | 创建 .dshwolf/(幂等);--agent <profile\|all\|deepseek-harness> 同时接线 + 安装进 harness | 通常不需要——大脑首次使用时自动初始化;--agent 是方式 2 的一条命令初始化 | | dshwolf scan [dir] | 重建项目索引、渲染 anatomy.md、注入 AGENTS.md | 在 harness 之外做了大改动(如 git pull)想立刻重建地图 | | dshwolf scan --check [dir] | 校验索引与文件系统一致(size/mtime + git HEAD) | CI 或会话前校验;漂移退出码 1 | | dshwolf status [dir] | 大脑健康:配置、扫描状态、账本、memory/buglog 计数 | "我的大脑健康吗?" | | dshwolf report [dir] | token 账本摘要:各会话实测 vs 估算 | 弄清楚 token 花在哪 | | dshwolf import-openwolf [dir] | 把已有 OpenWolf .wolf/ 大脑合并进 .dshwolf/(cerebrum/memory/buglog/STATUS,内容级去重,--dry-run/--from=<dir>/--status=…) | 从 Claude Code 等带 OpenWolf 大脑的项目迁移到 dsh-openwolf | harness 接线(方式 2 独立安装后) | 命令 | 作用 | 什么时候用 | | dshwolf harness status | 列出 DSH profiles,标出哪些已接 dsh-openwolf | "我哪些 profile 已经装了插件?" | | dshwolf harness add [name] | 把插件写进某 profile 的 package.json(dependencies + bundles)并自动运行 pnpm install(默认 profile web;--no-install 只改文件) | 方式 2 独立安装后,一条命令获得会话内体验(然后重启) | 记忆与 bug | 命令 | 作用 | 什么时候用 | | dshwolf bug search <term> | 搜索 .dshwolf/buglog.json | 重新排查可能已修复的问题之前 | | dshwolf register [dir] | 把工作区加进全局项目注册表 | 让 dshwolf update 覆盖你所有项目 | | dshwolf unregister [dir] | 从注册表移除 | 清理 | | dshwolf update | 备份 + 重扫所有已注册工作区 | 一次性刷新所有已索引项目 | 备份 | 命令 | 作用 | 什么时候用 | | dshwolf backups [dir] | 列出时间戳 .dshwolf/ 备份 | 看有哪些可回滚 | | dshwolf restore [dir] [tag] | 从备份恢复 .dshwolf/(默认最新) | 实验搞砸之后 | 调度与服务 | 命令 | 作用 | 什么时候用 | | dshwolf cron add <name> '<expr>' <scan\|check> [dir] | 定时零 token 任务(cron 语法、@daily 等) | 无人值守刷新:如每晚 scan | | dshwolf cron list [dir] / dshwolf cron run <id> / dshwolf cron remove <id> | 管理定时任务 | 查看或手动触发任务 | | dshwolf dashboard [dir] | 前台运行 Web 仪表盘(--port / --token / --token-file) | 实时查看 token / 上下文 / anatomy | | dshwolf daemon start [dir] / dshwolf daemon stop | 后台守护:仪表盘 + cron 调度 | 不占用终端地常驻仪表盘与定时任务 | 所有命令也以工具形式出现在会话里(wolf_map、wolf_file、wolf_refresh、 wolf_scan、wolf_init、wolf_status、wolf_learn、wolf_bug、 wolf_report、wolf_schedule)——模型自己能做这一切,命令行只是给人、脚本和 cron 用的。 全局选项:dshwolf --help(分组帮助)与 dshwolf --version 随处可用;裸 dshwolf 也打印帮助。子命令组也有自己的帮助——dshwolf cron --help、dshwolf daemon --help、 dshwolf bug --help、dshwolf harness --help(或只敲组名)。旧名 wolf 仍可作为别名使用。 环境要求 - Node.js >= 20.19.0(engines.node) - DeepSeek Harness >= 0.1.0-rc.6 < 0.3.0(engines.dsh) - 运行时用到的宿主包(peerDependencies): @deepseek-ai/dsh-tools、@deepseek-ai/dsh-skill、@deepseek-ai/dsh-llm、 @deepseek-ai/dsh-session 均 >= 0.1.0-rc.6,@deepseek-ai/cordis ^4.0.1 - 任意 DeepSeek Harness 配置档(web、headless、…) - Windows、macOS 或 Linux 已在 DSH 0.2.0-rc.2(dsh-desktop 0.11.0)+ cordis 4.0.4 上验证。 宿主版本以 package.json 的 engines.dsh 与 peerDependencies 为准 —— 插件市场按它们判定兼容性。@deepseek-ai/dsh-session 列为 peer,是因为会话格式代际(SESSION_FORMAT_VERSION)由它持有:宿主换格式这类破坏必须能在声明层面被发现。 配置 所有选项经 schema 校验、默认值合理;无需配置任何东西。在配置档的 cordis.patch.yml 中按行 id(openwolf)覆盖: - id: openwolf config: maxMapBytes: 16384 # 注入/返回地图文本的上限(字节) maxFileBytes: 65536 # 超过此大小的文件只列不读 maxFiles: 4000 # 每个工作区扫描文件数上限 watch: true # 防抖 watcher,文件变更自动重扫 injectAgentsMd: true # 维护 AGENTS.md 受管块 useGitignore: true # 遵循根目录 .gitignore symbols: true # 提取顶层符号 symbolBackend: auto # auto | regex | lezer(CST 解析) sessionDigestBudgetTokens: 1500 # 注入的会话摘要 token 上限 rescanIntervalHours: 6 # 重扫警告前的陈旧窗口 symbolThresholdTokens: 500 # 超过此 token 数的文件给符号行号提示 digestEnabled: true # 会话开始时注入会话摘要 interceptReads: true # 重复读警告 + anatomy 提示 interceptWrites: true # 动作日志 + 单文件索引刷新 compactionSurvival: true # 压缩快照 + 恢复摘要 skillsEnabled: true # 注册 wolf-security-audit + wolf-reframe autoRescanMinutes: 0 # 每 N 分钟自动重扫缓存根(0 = 关) 后层可按 id 整体覆盖该行,部署方保留自己的默认值。 限制 - 实测 vs 估算 —— 实测数字来自 harness token meter,精确;启发式估算是字符比近似。 - 多智能体接线 N/A —— 原版钩 5 个外部智能体(Claude Code/Codex/ OpenCode/Gemini/Cursor);DSH 本身是智能体平台,一个大脑服务所有 DSH 会话与子代理。 - cron 引擎自研 —— 每次运行 0 token,有意不接 harness 的模型面向调度器(后者每次触发烧一次 LLM 轮次)。 - dashboard 是零依赖服务器渲染单页(面板子集),非 React SPA。 - 仅根级 .gitignore —— 暂不支持嵌套 .gitignore 与 git check-ignore 的精确语义。 - 读提示随结果到达 —— tools/post-execute 把提示附加在结果上下文上(DSH 目前没有读前拦截缝)。 - 摘要注入依赖智能体生命周期 —— 从持久日志恢复的会话跳过摘要(历史完整,与原版 resume 行为一致)。 - 发现问题?提交 issue。 开发 pnpm install pnpm build # tsc → lib/ pnpm test # node --test,进程内执行 本包是可擦除 TypeScript + rewriteRelativeImportExtensions:node 可直接运行 src/ 做测试,tsc 产出发布用的 ESM lib/。prepare 脚本从源码构建,这正是 git 安装能工作的原因。想在真实 harness profile 里跑本地 checkout,见从源码安装。 License MIT —— 对代码地图/上下文大脑思路的独立实现,不含任何 AGPL 项目的代码。 为 DeepSeek Harness 构建。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
hawk2048/dsh-openwolf
dsh-openwolf:给 DeepSeek Harness 用的紧凑代码地图「第二大脑」——预索引项目地图、逐文件摘要,还能注入 AGENTS.md(wolf_map / wolf_file / wolf_refresh)
相关插件 · 开发 / 工程
隐私简历生成器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