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

文件变更回执 jwilson411/dsh-mutation-receipt

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

记录文件触碰的路径与哈希,不存内容

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add jwilson411/dsh-mutation-receipt
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · security
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/26·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 64 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

读写/删除本地文件
查看扫描证据(共 6 处,展示前 6 条)
  • 读取本地文件
    src/receipt.js:109
    if (!statSync(real).isDirectory()) {
  • 读取本地文件
    src/receipt.js:196
    const bytes = readFileSync(join(root, stored))
  • 读取本地文件
    src/receipt.js:209
    const bytes = readFileSync(join(root, stored))
  • 写入本地文件
    src/receipt.js:387
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    src/receipt.js:388
    appendFileSync(target, `${JSON.stringify(line)}\n`, 'utf8')
  • 读取本地文件
    src/receipt.js:404
    text = readFileSync(resolve(receiptPath), 'utf8')
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 记录文件路径与哈希
  • 仅追加JSONL
  • 不含文件内容

DeepSeek Harness 插件:只追加的 JSONL,记录文件系统操作(路径、操作、前后 sha256),不含文件内容

README

由 DeepSeek 最新模型翻译生成
dsh-mutation-receipt 一个 DeepSeek Harness 函数插件,将文件系统触碰转化为可引用、仅追加的 JSONL 回执:每个文件一行,记录路径、发生了什么,以及变更前后的 sha256。 它不携带任何文件内容。这就是整个设计约束。招聘经理、审计员或审查者可以询问智能体触碰了什么,并得到一份即使在他们无权阅读所描述文件时仍被允许阅读的回执——而且这份回执对任何窃取它的人都毫无价值。 {"ts":"2026-09-01T05:34:13.000Z","session_id":"sess-1","op":"create","path":"notes/hello.txt","sha256_before":null,"sha256_after":"a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447","byte_len_after":12} 它不是什么 在依赖它做任何事之前,请先读这份清单。 - 不是备份。 摘要可以证明一个文件曾经是什么。它无法把文件找回来。没有恢复功能,也永远不会有——回执不包含字节内容。 - 不是 DLP 即服务。 它记录主机报告给它的触碰。它不扫描、不分类、不拦截、不阻止任何东西,也无法告诉你移动的内容是否敏感。 - 不是云上传器。
展开完整文档(README 剩余 1 节)
dsh-mutation-receipt

一个 DeepSeek Harness 函数插件,将文件系统触碰转化为可引用、仅追加的 JSONL 回执:每个文件一行,记录路径、发生了什么,以及变更前后的 sha256。

它不携带任何文件内容。这就是整个设计约束。招聘经理、审计员或审查者可以询问智能体触碰了什么,并得到一份即使在他们无权阅读所描述文件时仍被允许阅读的回执——而且这份回执对任何窃取它的人都毫无价值。

{"ts":"2026-09-01T05:34:13.000Z","session_id":"sess-1","op":"create","path":"notes/hello.txt","sha256_before":null,"sha256_after":"a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447","byte_len_after":12}

它不是什么

在依赖它做任何事之前,请先读这份清单。

- 不是备份。 摘要可以证明一个文件曾经是什么。它无法把文件找回来。没有恢复功能,也永远不会有——回执不包含字节内容。
- 不是 DLP 即服务。 它记录主机报告给它的触碰。它不扫描、不分类、不拦截、不阻止任何东西,也无法告诉你移动的内容是否敏感。
- 不是云上传器。 没有文件内容、没有回执、没有任何路径会离开本机。该库不打开任何套接字,也不进行任何形式的网络调用;回执是你拥有的本地文件,可以删除。
- 它不存储文件内容。 不是片段,不是差异,不是“预览”。如果调用方传入 contents、body、data、text 或 diff 字段,这些键会被丢弃而不是被记录。
- 它不会遍历你的文件系统。 没有爬取,没有监视器,不遍历你的主目录或任何主机挂载点。当主机告诉它某个文件发生了变化时,它写一行;除此之外什么都不做。
- 不是完整记录。 它只知道主机报告的内容。一次从未调用 recordMutation 的写入,就是回执从未听说过的一次写入,回执也不会假装不是这样。

安装

dsh plugin --profile default add github:jwilson411/dsh-mutation-receipt

基于固定在 0.1.1-rc.2 的 harness RC 构建(@deepseek-ai/dsh-tools@0.1.1-rc.2、@deepseek-ai/cordis@^4.0.1)。Node =22.14.0。

安装程序从 package.json 读取 dsh.bundle.patch,并将 cordis.patch.yml 组合为配置文件的一层。该文件插入一行,id: mutation-receipt,带有空的 config。

主机调用 recordMutation(...)

这个 RC 没有可供订阅的文件系统变更事件。
@deepseek-ai/dsh-tools@0.1.1-rc.2 发布两个会话事件—— tool/code-dispatch-start 和 tool/code-dispatch——两者都不是文件写入。订阅一个虚构的 file/mutation 会产生一个能干净加载却静默地什么都不记录的插件,这比没有回执还糟全部。因此,宿主是知道文件发生变化的一方,并且由宿主来声明:

import { recordMutation } from 'dsh-mutation-receipt'

// 在写入之前,如果你希望记录一次更新:一旦你覆盖了之前的字节,它们就 // 不复存在了,而这个包不会去猜测它们。
const { sha256: before } = hashFile('notes/hello.txt', workspaceRoot)

writeFileSync(join(workspaceRoot, 'notes/hello.txt'), next)

recordMutation({
workspaceRoot, // 必填;每个路径都相对于此 receiptPath, // 必填;仅追加的 JSONL sessionId: 'sess-1', // 可选,可以为 null op: 'update', // 'create' | 'update' | 'delete' path: 'notes/hello.txt', // 相对路径,或根目录下的绝对路径 sha256_before: before, // update 必填;delete 也必填 })

apply 返回相同的辅助函数,但已绑定此部署的根目录、回执路径和会话 ID,因此拥有插件实例的宿主无需再重复声明它们:

const receipt = plugin.apply(ctx, { workspaceRoot, receiptPath })
receipt.recordMutation({ op: 'create', path: 'notes/hello.txt' })

每个操作需要什么

| op | sha256_before | sha256_after | byte_len_after |
| create | 始终为 null —— 之前不存在 | 来自磁盘,或由调用方提供 | 来自磁盘,或由调用方提供 |
| update | 必须由调用方提供 | 来自磁盘,或由调用方提供 | 来自磁盘,或由调用方提供 |
| delete | 必填,除非文件仍可读取 | 始终为 null | 始终为 null |

操作需要但无法推导出的哈希是一个错误(MissingHashError,代码 MUTATION_RECEIPT_HASH),绝不会是一个被悄悄折入该行的 null。三个操作之外的 op 会抛出 InvalidMutationOpError。

其他导出

- hashFile(path, workspaceRoot) → { sha256, byte_len }
- readReceipt(receiptPath) → 按文件顺序返回每一解析行
- summarizeReceipt(lines, { limit }) → { plugin, total, counts, lines }
- relativizePath(workspaceRoot, path) → 存储形式,或抛出错误
- MutationReceiptError、MutationPathError、InvalidMutationOpError、 MissingHashError

路径策略

工作区根目录是回执的作用域,而不是一个提示。

- 存储的路径始终相对于配置的 workspaceRoot,采用 POSIX 风格:/ 分隔符,无前导斜杠,无盘符。
- 根目录下的绝对路径会被相对化,并以该形式存储。
- 根目录之外的绝对路径会被拒绝。任何通过 .. 向上爬出的路径,以及任何其现有路径段通过符号链接解析到外部某处的路径,也会被拒绝。该检查是对最长路径进行真正的 realpath 现有祖先目录,因此符号链接的父目录无法将写入偷运出去。
- 被拒绝的路径会抛出 MutationPathError(代码 MUTATION_RECEIPT_PATH),并且不会追加任何行。

值得明确说明的后果是:回执从不披露它是在机器上的何处生成的。没有主目录、没有挂载点、没有任何类型的绝对路径会进入该文件。

工具:mutation_receipt

在 apply 内部针对 tools 服务注册。一个工具,仅此而已。

参数 —— 两者均可选:

| 名称 | 类型 | 含义 |
| limit | integer | 返回多少条末尾行,最旧的在前。默认 20。 |
| session_id | string | 仅报告在此会话 id 下记录的行。 |

返回:

{
"plugin": "dsh-mutation-receipt",
"total": 3,
"counts": { "create": 1, "update": 1, "delete": 1 },
"lines": [ /* the last N matching lines */ ]
}

counts 和 total 覆盖整个回执(在可选的会话过滤之后)——而不仅仅是返回的窗口。lines 是尾部:最后 N 条匹配行,其中最旧的在前,因此你可以按事情发生的顺序向下阅读。

该工具不返回文件内容,它也不是恢复路径。

CLI:mutation-receipt show

mutation-receipt show [--receipt ] [--root ] [-n ] [--json]

与该工具读取的是同一个文件。

| 选项 | 含义 |
| --receipt | 回执文件。默认 $DSH_MUTATION_RECEIPT_PATH,否则为 ./mutation-receipt.jsonl。 |
| --root | 工作区根目录,为提供上下文而报告。 |
| -n, --limit | 要打印的末尾行,最旧的在前。默认 20。 |
| --json | 输出摘要对象而不是表格。 |
| -h, --help | 用法。 |

文本模式是一个简短的表格——ts、op、path、sha256_after(删除时为 -)。没有文件内容,因为没有内容可打印。

配置

在后续补丁层中的 mutation-receipt 行上设置。请注意,以 id 为目标的补丁会替换该行的整个 config,而不是合并到其中,因此覆盖必须重新声明它想要保留的每一个键。

| 键 | 默认值 | 含义 |
| workspaceRoot | process.cwd() | 每个存储的路径都相对于此;在此之外会被拒绝。 |
| receiptPath | mutation-receipt.jsonl | 仅追加的 JSONL。父目录会被创建。 |
| sessionId | null | 会标记在此部署所记录的行上。 |
| limit | 20 | mutation_receipt 的默认窗口。 |

DSH_MUTATION_RECEIPT_ROOT、DSH_MUTATION_RECEIPT_PATH 和 DSH_MUTATION_RECEIPT_SESSION_ID 仅在配置未指定时适用——该补丁是部署所声明的意图,因此其优先级高于环境变量。

许可证

MIT。版权所有 (c) 2026 jwilson411。
预览分享卡片长什么样 ↓jwilson411/dsh-mutation-receipt
分享 · DeepSeek Harness Hub
jwilson411/dsh-mutation-receipt

记录文件触碰的路径与哈希,不存内容

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部