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

狼图索引 hawk2048/dsh-openwolf

DeepSeek Harnessv0.10.2
hawk204824 天前有提交已提供中文文档扫描:含敏感能力

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-openwolf
npm 源 · dsh-openwolf 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · dev
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 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
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 构建。
预览分享卡片长什么样 ↓hawk2048/dsh-openwolf
分享 · DeepSeek Harness Hub
hawk2048/dsh-openwolf

dsh-openwolf:给 DeepSeek Harness 用的紧凑代码地图「第二大脑」——预索引项目地图、逐文件摘要,还能注入 AGENTS.md(wolf_map / wolf_file / wolf_refresh)

回到顶部