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

代码审查 f-e-n-g-0531/dsh-code-review

DeepSeek Harnessv0.86.1
f-e-n-g-05318 天前有提交已提供中文文档扫描:含敏感能力

在 DeepSeek HarnessDSH的 Agent 对话里审查 Git / SVN…

36/100
综合分
9
GitHub 星标
4,276
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @feng0531/dsh-code-review
npm 源 · @feng0531/dsh-code-review 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · dev
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@feng0531/dsh-code-review @ 0.86.1
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 12:34:01

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 58 处,展示前 57 条)
  • 读取本地文件
    src/review-jobs.mjs:22
    try{return path.join(await realpath(current),...suffix);}
  • 读取本地文件
    src/review-jobs.mjs:26
    try{if((await lstat(current)).isSymbolicLink())throw new Error('Unsafe report directory');}catch(statError){if(statError.code!=='ENOENT')throw statErr
  • 写入本地文件
    src/review-jobs.mjs:42
    await mkdir(expected,{recursive:true,mode:0o700});
  • 读取本地文件
    src/review-jobs.mjs:43
    const stat=await lstat(directory),resolved=await checkDirectory(who);
  • 写入本地文件
    src/review-jobs.mjs:47
    async function save(job){await safeDirectory(job.record.owner);const tmp=path.join(canonicalDirectory,job.id+'.'+randomUUID()+'.tmp'),snapshot=JSON.st
  • 写入本地文件
    src/review-jobs.mjs:47
    async function save(job){await safeDirectory(job.record.owner);const tmp=path.join(canonicalDirectory,job.id+'.'+randomUUID()+'.tmp'),snapshot=JSON.st
  • 读取本地文件
    src/review-jobs.mjs:48
    async function owned(id,exec){const who=identity(exec),job=jobs.get(id);if(job){if(!same(who,job.record.owner))throw new Error('Foreign review job');r
  • 读取本地文件
    src/review-jobs.mjs:48
    async function owned(id,exec){const who=identity(exec),job=jobs.get(id);if(job){if(!same(who,job.record.owner))throw new Error('Foreign review job');r
  • 读取本地文件
    src/runtime-identity.mjs:4
    export const REVIEW_RUNTIME=Object.freeze({version:JSON.parse(readFileSync(manifestUrl,'utf8')).version,modulePath:fileURLToPath(new URL('../index.mjs
  • 读取本地文件
    src/project-review-service.mjs:39
    const root = await realpath(await resolveWorkspaceRepository(cwd, args.repositoryPath));
  • 读取本地文件
    src/content.mjs:46
    const canonicalRoot = await realpath(root);
  • 读取本地文件
    src/content.mjs:53
    const stat = await lstat(cursor);
  • 读取本地文件
    src/content.mjs:63
    const canonical = await realpath(filename);
  • 读取本地文件
    src/content.mjs:66
    const opened = await lstat(filename);
  • 读取本地文件
    src/content.mjs:85
    const now = await lstat(ancestor.path);
  • 读取本地文件
    src/content.mjs:89
    if (before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs || before.ino !== after.ino || canonical !== aw
  • 读取本地文件
    src/workspace-repository.mjs:7
    const root = await realpath(cwd);
  • 读取本地文件
    src/workspace-repository.mjs:11
    const stat = await lstat(current);
  • 读取本地文件
    src/workspace-repository.mjs:13
    const actual = await realpath(current);
  • 读取本地文件
    src/workspace-repository.mjs:20
    try { const stat = await lstat(path.join(current, '.' + type)); if (stat.isSymbolicLink()) throw new Error('Linked repository marker'); markers.push(t
  • 读取本地文件
    src/snapshot.mjs:22
    let current = await realpath(cwd);
  • 读取本地文件
    src/snapshot.mjs:26
    try { await lstat(path.join(current, '.' + type)); found.push(type); }
  • 读取本地文件
    src/review-artifacts.mjs:32
    try { return path.join(await realpath(current), ...suffix); }
  • 读取本地文件
    src/review-artifacts.mjs:35
    try { if ((await lstat(current)).isSymbolicLink()) throw fail('UNSAFE_REVIEW_ARTIFACT'); } catch (e) { if (e.code !== 'ENOENT') throw e; }
  • 写入本地文件
    src/review-artifacts.mjs:50
    await mkdir(resolved, { recursive: true, mode: 0o700 });
  • 读取本地文件
    src/review-artifacts.mjs:51
    const stat = await lstat(directory);
  • 读取本地文件
    src/review-artifacts.mjs:52
    if (!stat.isDirectory() || stat.isSymbolicLink() || await realpath(directory) !== resolved) throw fail('UNSAFE_REVIEW_ARTIFACT');
  • 写入本地文件
    src/review-artifacts.mjs:53
    await chmod(resolved, 0o700); canonical ??= resolved;
  • 读取本地文件
    src/review-artifacts.mjs:59
    const stat = await lstat(filename);
  • 读取本地文件
    src/review-artifacts.mjs:105
    try { const stat = await lstat(filename); if (stat.isSymbolicLink() || !stat.isFile() || stat.nlink !== 1) throw fail('UNSAFE_REVIEW_ARTIFACT'); } cat
  • 写入本地文件
    src/review-artifacts.mjs:106
    await rename(tmp, filename);
  • 删除本地文件
    src/review-artifacts.mjs:107
    } finally { await handle?.close(); await unlink(tmp).catch(() => {}); }
  • 读取本地文件
    src/project-snapshot.mjs:17
    if (await realpath(actual) !== root) throw new Error('Full project requires explicit repository root');
  • 读取本地文件
    src/project-snapshot.mjs:52
    if (!info || await realpath(info['wc-info']?.['wcroot-abspath']) !== root) throw new Error('Full project requires SVN working-copy root');
  • 读取本地文件
    src/project-snapshot.mjs:77
    const root = await realpath(cwd);
  • 读取本地文件
    src/project-snapshot.mjs:122
    const stat = await lstat(path.join(inventory.root, name));
  • 执行外部命令来自配置/变量
    src/process.mjs:11
    const child = spawn(command, args, {
  • 读取本地文件
    src/git-history.mjs:79
    const root = await realpath(utf8(await gitAt(cwd, ['rev-parse', '--show-toplevel'], options)).replace(/ ? $/, ''));
  • 读取本地文件
    src/git.mjs:14
    return realpath(top);
  • 读取本地文件
    src/svn.mjs:68
    const root = await realpath(info['wc-info']['wcroot-abspath']);
  • 读取本地文件
    src/svn.mjs:103
    if (status === 'unversioned') kind = (await lstat(path.join(root, name))).isDirectory() ? 'dir' : 'file';
  • 读取本地文件
    src/svn-history.mjs:78
    const root=await realpath(local['wc-info']['wcroot-abspath']);
  • 读取本地文件
    src/svn-history.mjs:79
    if(root!==await realpath(cwd))throw new Error('SVN historical scope must be working-copy root');
  • 读取本地文件
    src/svn-caller-node.mjs:9
    export async function svnCallerNode(root,name,options={}){relativePath(name);const parent=path.posix.dirname(name);const ancestors=await svnCallerAnce
  • 读取本地文件
    src/svn-caller-node.mjs:11
    export async function svnCallerProbes(root,names,options={}){if(!Array.isArray(names)||names.length>512||new Set(names).size!==names.length)throw new
  • 读取本地文件
    src/svn-caller-index.mjs:12
    export async function svnCallerIndex(root,scopes,options={}){const approved=validateCallerScopes(scopes),entries=[],chunks=[];let bytes=0;const seen=n
  • 读取本地文件
    src/svn-caller-index.mjs:16
    const nodes=[];for(const e of entries.filter(e=>!approved.includes(e['@_path'])&&!unsafe(e['wc-status']))){options.signal?.throwIfAborted();const stat
  • 读取本地文件
    src/svn-replacement-tree.mjs:38
    const stat=await lstat(name==='.'?root:path.join(root,name));if(stat.isSymbolicLink()||!stat.isDirectory())throw new Error('Replacement ancestor is no
  • 读取本地文件
    src/svn-working-special.mjs:10
    const canonical=await realpath(root);let cursor=canonical;const parts=name.split('/');
  • 读取本地文件
    src/svn-working-special.mjs:12
    for(const part of parts.slice(0,-1)){cursor=path.join(cursor,part);const stat=await lstat(cursor);if(stat.isSymbolicLink()||!stat.isDirectory())throw
  • 读取本地文件
    src/svn-working-special.mjs:13
    const filename=path.join(cursor,parts.at(-1)),before=await lstat(filename);let content;
  • 读取本地文件
    src/svn-working-special.mjs:15
    const target=await readlink(filename,{encoding:'buffer'});if(target.length>16384)throw new Error('SVN link target byte limit exceeded');
  • 读取本地文件
    src/svn-working-special.mjs:17
    content=decode(bytes);const after=await lstat(filename);const again=await readlink(filename,{encoding:'buffer'});
  • 读取本地文件
    src/svn-working-special.mjs:17
    content=decode(bytes);const after=await lstat(filename);const again=await readlink(filename,{encoding:'buffer'});
  • 读取本地文件
    src/svn-caller-safety.mjs:18
    export async function svnCallerAncestors(root,scope,options={}){if(scope!=='.')relativePath(scope);if(scope.split('/').length>32)throw new Error('SVN
  • 读取本地文件
    src/svn-caller-safety.mjs:18
    export async function svnCallerAncestors(root,scope,options={}){if(scope!=='.')relativePath(scope);if(scope.split('/').length>32)throw new Error('SVN
  • 发起网络请求
    src/model-approval.mjs:4
    const outcome = await approval.request(request);
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
v0.86.12026-10-23
· v0.86.1 发布说明 使用方式见 README,历史变化见 变更记录,发布门禁见 开发说明。 · 取证预算与成果保留 生产编排为主审、跨窗口/跨文件综合及候选复核在同一个根读取预算内按权重预留最低额度,阶段结束释放闲置份额;不提高根调用或输出字节上限。最低份额取整可能为零,额度和检索轮数不足仍如实披露,不能保证所有来源或阶段完成。 同一批准快照内,相同读取/搜索/查找请求可复用原始操作结果,身份、版本侧、坐标、查询和上限均参与匹配。返回独立副本;每次交付仍扣序列化输出字节,复核回执重新签发,不继承其他阶段凭据。缓存和分配账本参与原子事务回滚;失败、取消、源身份变化不放宽边界。低层默认保持原语义,仅生产优化编排启用。 已经校验的组成员不因后续读取准入失败被丢弃;组级受限原因传播至所有成员,但共享事件只计一次。跨窗口/跨文件阶段预算失败单独记录,不把已完成主审/窗口成果改写成主审失败;复用资格仍拒绝未完成综合、受限阶段或未复核候选。 · 工件容量与终态呈现 默认工件数量上限从64改为4096,单记录1MiB、单任务8MiB不变;真实数量/字节超限、截断仍明确记录,不宣称无限留存。普通诊断不含原文;取回仍需源码隐私知情同意。 任务结束的状态摘要显示真实报告状态、覆盖、调用、读取余量及分页总量,明确后台 completed 不等于报告 complete;一次 terminal wait 仍返回整份报告。跨文件综合不再统一误写为超时,而显示已有原因及失败代码。 · 验证与边界 新增离线夹具覆盖74文件共享读取、早期贪婪请求与后续复核额度、组限制传播、已完成窗口保留、零新读额度下缓存交付与新回执、事务回滚及128个小工件全部留存。它们证明机制,不代表已重跑用户业务,也不构成真实模型速度、覆盖或质量基准。 正式发布须通过冻结标签 Ubuntu/Windows × Node.js22/24 四矩阵及 Actions、npm、GitHub Release 原始包逐字节、校验清单和冻结发布说明核验。不会自动安装、升级或重启当前 DSH。
v0.86.02026-10-23
· v0.86.0 发布说明 使用方式见 README,历史变化见 变更记录,验证与发布门禁见 开发说明。 · 输出协议:减少格式往返,不放宽证据 生产入口优先使用真实 DSH 原生结果工具 submit_review_result,结构化提交作为数据交给现有审查、归因、定位和复核校验器,不执行模型返回的工具。宿主支持的 ToolSchema、工具调用增量/最终块以及 tool-calls 结束标记均已对照安装宿主声明和组装器核查;不使用宿主不存在的强制 toolChoice 参数。 提供方仍返回文本时,允许同一次调用的严格 JSON/单一围栏兼容;原生模式额外允许从响应开头提取未修改的完整 JSON 容器并忽略无歧义普通尾注,不搜索任意分析段、不选择多个对象、不拼补身份、字段或源码。歧义和非法工具调用失败关闭;有界格式纠正仍显式计调用。预览、窗口准备及检索、可选预取、复核使用原生工具定义、指令合同和正文的精确输入字节测量,发送前再次硬校验,不用隐藏保留量交换正文。 · 私有留存与重新确认后的续审 后台任务在审查工作区外有界保存原始文本块/工具参数,包括失败和取消的输出,不保存 reasoning 块。默认单记录1MiB、单任务8MiB、最多64条;超限省略和截断明确记录,不宣称无限或完整捕获。引用与计数可以进入状态和脱敏诊断,原始输出不能自动成为新审查证据。读取 code_review_artifacts 必须获得源码隐私知情同意并显式 confirmed:true,绑定相同会话、工作区和模型路由,默认一次1条。Windows不把mode位宣称为额外ACL隔离。 resumeFromJobId 重新捕获、预览并确认完全相同的快照、上下文/规则/需求、路由、运行时及执行配置,执行时仍复核并重新授权;旧批准永不恢复。只复用全部阶段及所属交互已完成、候选已完成独立复核的文件链,支持变更和项目批次。中断、窗口未完成、缺证据或未复核成果仍保留但不能冒充可复用完成链。旧发现标记 priorRun/reused,旧证据不是本轮新 receipt,旧调用不计入本轮。 · 真正组主审与编排 业务分组成为文件链调度前的独立阶段,不再先跑完整条首文件链。2至4个能完整装入输入预算且差异精确的变更文件,可以一次 group-primary 生成全部成员的主审结果,再按真实 fileId 与原始行号逐项严格校验、分发;不会仍为每个成员重复发起首轮主审。超预算、窗口/多批次、非精确差异、项目模式和多轮独立审查在发送前保持原路径。 组内风险问题可以合并到本次生成,缺失/无效计划和未读来源明确披露,不补发隐藏规划调用。组主审不冒充跨文件证据:独立交互阶段及候选复核保留,不能把不合格 interaction 降级成普通发现绕过校验。调用预算耗尽时保留已经生成并校验的成员结果,把后续未完成阶段标为 partial,不丢弃已付费主审成果。失败组不隐藏补发全体单文件调用。 · 验证与边界 新增离线回归覆盖原生流、歧义拒绝、格式兼容零额外调用、精确输入边界、私有留存与跨身份拒绝、取消清理、部分完成续审、新确认/授权及变更失效、组主审覆盖与预算边界。独立源码审计发现的“组结果在额度边界被丢弃”已修复并有回归;取消与落盘失败同时出现时保留原取消身份。 这轮对齐的是上述核心机制,不等于上游全部功能或模型质量完全一致;没有重跑用户业务审查,不承诺实际耗时、召回或全面覆盖。正式发布仍必须通过冻结标签 Ubuntu/Windows × Node.js22/24 四矩阵,以及 Actions、npm、GitHub Release 原始包逐字节、校验清单和冻结发布说明核验。不会自动安装、升级或重启当前 DSH。
v0.85.132026-10-23
· v0.85.13 发布说明 使用方式见 README,完整变化见 变更记录,预算与验证边界见 开发说明。 · 修复大上下文下规划合并不生效 · 变更主审优先保留主文件完整新旧正文,只附带有关系线索的完整批准上下文对象,序列化合计最多16KiB或输入上限四分之一,取较小值。其余来源保留版本目录按需读取,不截断上下文、不删主文件/规则/需求,也不把未提供正文当作不存在或已核查。无检索scope时不隐藏正文。 · 合并规划不再仅限全文传输:单批窗口必须与批准文件重新计算的全部精确编辑、新旧坐标、分段原文及快照/文件身份完全匹配,才可合入首轮主审。多批窗口、包络差异、项目模式和后续独立轮次继续原策略,不用丢弃编辑换速度。合并风险仍不是独立规划或已验证条件;候选独立复核和跨窗口/文件综合保留。 · 模型搜索的精确命中可同轮附带原文,单阶段最多两次读取尝试、每次最多24行,失败也计尝试;验证来源/快照/哈希及版本侧,不猜测另侧坐标。所有读取共用原reader,预留4次操作/16KiB输出,精确输入放不下则事务回滚;不增加检索轮次、不造复核receipt、不重复已有正文。 · 生产变更入口默认启用上述聚焦和搜索命中附读;可用插件配置focusPrimaryContext:false和enableSearchSeeds:false关闭,底层API默认关闭。预览披露选项和上下文提供/递延数,按相同策略计算输入与最低调用。 · 减少格式返工,区分具体限制 JSON传输提示补充反斜线、引号和换行的标准转义要求;不自动修补响应、不补身份、不降低证据或字段校验。诊断新增允许枚举的JSON语法纠正原因、检索协议/审查格式纠正及未合并规划原因,只记录真正获准执行的纠正;预算否决不计调用,原始错误响应和提供方文本不进入汇总。此前29次纠正的具体原因没有完整记录,本版提示是预防措施,不声称已证实消除这些纠正。 单阶段检索轮数、共享读取调用数和输出字节分别记原因;轮数达到上限而reader仍有余量时不再笼统暗示共享额度耗尽。已处理窗口不等于文件完整审核,缺证据继续保留partial。 v0.85.12标签冻结后补充检查发现离线脚本无baseline入口的比较断言不适用于新增单批窗口合并策略;未触发npm/Release发布,标签未移动。本版修正该脚本入口,生产修复保持不变,并重新通过冻结标签发布门禁。 · 验证与效果边界 新增夹具覆盖“大批准上下文+小主文件”、单批全部精确编辑合并、历史新旧侧、搜索同轮附读/跨轮尝试上限、输入边界/回滚/取消、独立新receipt复核、纠正原因脱敏与预算否决计数。 离线脚本node scripts/context-review-benchmark.mjs配合冻结v0.85.11源码,八文件的真实编排总调用25→17,八次独立复核全部保留、reader均16次、严格校验后的候选与反证结果一致;主审从窗口传输恢复为完整正文。输入加指令176968→129752字节,不含适配器追加合同,不是最终wire bytes。另一个搜索→读取夹具在相同reader操作和轮数下3→2调用。均为脚本模型验证,不保证真实耗时、召回率或覆盖;没有重跑用户业务审核。 最终v0.85.13的Windows本地完整回归986项:982通过、4项平台限定跳过、0失败;两路独立源码复核未发现本次新增P1/P2,已验证预算否决不计纠正的边界修正。真实宿主ToolRuntime离线检查及隔离安装通过。正式发布必须通过冻结标签四矩阵CI(Ubuntu/Windows × Node.js22/24)、隔离安装及Actions/npm/GitHub Release原始包逐字节与校验清单核验。 不会自动安装、升级或重启当前DSH。更新并重新加载后,以报告显示v0.85.13确认实际加载。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
DSH Code Review 在 DeepSeek Harness(DSH)的 Agent 对话里审查 Git / SVN 代码变更。插件先列出审查范围,等你确认后,再用当前 Agent 选择的模型生成中文问题报告。 只读:不修改代码,不自动修复,不提交、回滚或更新你的业务工作副本。 快速开始:第一次怎么用 1. 安装并启用插件 在 DSH 插件管理器中安装并启用本项目,或在终端执行: dsh plugin add https://github.com/f-e-n-g-0531/dsh-code-review.git 需要 Node.js 22+,以及已安装的 Git 或 SVN 命令行工具。插件依赖 DSH,不是独立命令行审查程序,不能用 npm test 或直接运行源码来发起审查。 安装或升级后,确认当前 DSH 已加载插件。仓库发布新版本不会自动升级正在运行的插件;如果当前会话仍未获得新工具,按 DSH 的插件加载提示重新加载或新建会话。 2. 在目标代码仓库创建 Agent 会话 将会话的工作目录设为要审查的 Git 仓库根目录或 SVN 工作副本根目录,并在 DSH 中选好模型。不需要另给本插件配置 API Key。 例如,你的 SVN 工作副本是 D:/work/my-project,就以该目录作为会话工作目录。
展开完整文档(README 剩余 1 节)
DSH Code Review

在 DeepSeek Harness(DSH)的 Agent 对话里审查 Git / SVN 代码变更。插件先列出审查范围,等你确认后,再用当前 Agent 选择的模型生成中文问题报告。

只读:不修改代码,不自动修复,不提交、回滚或更新你的业务工作副本。

快速开始:第一次怎么用

1. 安装并启用插件

在 DSH 插件管理器中安装并启用本项目,或在终端执行:

dsh plugin add https://github.com/f-e-n-g-0531/dsh-code-review.git

需要 Node.js 22+,以及已安装的 Git 或 SVN 命令行工具。插件依赖 DSH,不是独立命令行审查程序,不能用 npm test 或直接运行源码来发起审查。

安装或升级后,确认当前 DSH 已加载插件。仓库发布新版本不会自动升级正在运行的插件;如果当前会话仍未获得新工具,按 DSH 的插件加载提示重新加载或新建会话。

2. 在目标代码仓库创建 Agent 会话

将会话的工作目录设为要审查的 Git 仓库根目录或 SVN 工作副本根目录,并在 DSH 中选好模型。不需要另给本插件配置 API Key。

例如,你的 SVN 工作副本是 D:/work/my-project,就以该目录作为会话工作目录。不要把网页地址或仓库远端 URL 当作本地工作目录。

如果会话工作区中有多个子仓库,见下方「多个仓库」示例。

3. 把这段话发给 Agent

使用 code_review_preview 预览当前仓库所有已跟踪文件的改动。
先告诉我:审查哪个仓库、哪些文件、额外读取哪些上下文、发送给哪个模型,以及哪些文件不能审查。
先不要调用 code_review_execute,等我确认。全程不要修改代码。

这是发在 DSH 对话输入框里的请求,不是终端命令。Git 默认比较 HEAD 与当前工作区的净变化;SVN 默认比较本地 BASE(工作副本记录的基础版本)与当前文件。

预览不调用审查模型,但 Agent 对话本身仍可能使用模型。工作副本模式默认不读 SVN 远端;SVN 历史模式会读取仓库版本,必须另行明确允许远端访问。

4. 检查预览,再确认执行

检查 Agent 展示的:

- 仓库和文件是否选对,有没有遗漏或意外包含的文件。
- 额外上下文是什么;上下文是辅助理解的文件,也可能随执行发送给模型。
- 模型提供方和模型名称是否符合你的数据使用要求。
- 阻断、排除和预算限制;不能审查的文件不能当作已通过。

确认无误后,在同一会话回复:

确认刚才展示的预览范围和模型,使用该 previewId 执行只读审查。

插件使用预览返回的 ID 执行。默认预览有效期约 5 分钟;文件、模型或会话目录变化后,需要重新预览和确认。宿主权限不允许时,确认也不能绕过限制。

后台执行如何等待

后台任务推荐调用 code_review_wait({jobId, waitFor:"terminal"}),一次最多等待 60 秒,中间检查点继续逐条保存,但不会逐条唤醒等待方。任务仍在运行就继续等待;超时返回 changed:false 不代表结束。需要逐事件进度时使用 waitFor:"progress",把返回的 waitRevision 原样作为下一次 after,不要自行加一,也不必每次再查 status。code_review_status 用于主动分页取完整结果或检查点。取消等待调用只停止等待,不取消后台审核。

5. 查看结果

执行工具会在对话中返回 中文 Markdown 报告,同时返回结构化 JSON。「执行诊断」列出实际加载的插件版本、阶段调用和墙钟统计;累计调用耗时可能并发重叠,不代表纯提供方耗时或可相加的总耗时。先看「覆盖情况和限制」,再看问题列表,不要只看「发现了几个问题」。

如需保存报告,可以另行告诉 Agent:「将本次报告保存到我指定的位置」。插件本身不会自动在业务仓库创建报告文件。

按场景直接使用

下面的自然语言可以直接发给 Agent。每个场景都应先预览、展示范围,再确认执行。

只审查几个文件(Git / SVN 工作副本)

使用代码审查插件,只预览 src/api.ts 和 src/client.ts 的当前改动。
自动补充理解它们所需的依赖文件。先展示范围和模型,等我确认再执行,不修改代码。

对应 code_review_preview 参数(工具参数,不是 shell 命令):

{"selectedPaths":["src/api.ts","src/client.ts"],"autoContext":true}

文件名要替换成仓库中实际存在的变更路径。未跟踪文件不会默认纳入,必须用 selectedPaths 显式选择。省略该参数时,范围是整个仓库的变更,不限于当前子目录。

审查 Git 单个提交

使用代码审查插件预览 Git 提交 abc1234,先展示范围,等我确认后再执行。

{"commit":"abc1234"}

将 abc1234 换成实际提交号。与该提交的唯一父提交比较;根提交与空旧版本比较。合并提交请改用两个版本比较,明确选择旧、新端点。

审查 Git 两个版本之间的变化

预览 Git 的 v1.0.0 到 v1.1.0 之间的代码变化,自动读取必要依赖。先展示范围,不直接执行。

{"baseRevision":"v1.0.0","targetRevision":"v1.1.0","autoContext":true}

比较两个版本的文件树,不自动计算合并基点,也不会把工作区中的未提交正文当作历史正文。commit 不能与这两个参数混用。

只审查 Git 暂存区或未暂存改动

提交前只看已暂存内容,或只想确认工作区里还没暂存的修改:

{"changeScope":"staged"}

staged 比较 HEAD 与索引(相当于 git diff --cached):右侧是已暂存内容,工作区里尚未 git add 的修改不作为变更内容,也不会作为变更正文发送给模型。把值换成 "unstaged" 则比较索引与工作区(相当于 git diff):左侧是已暂存内容,仅作为旧侧基线,右侧是工作区文件。省略 changeScope 时默认仍是 HEAD 到工作区的净变化。
这两个范围只用于 Git 工作副本,不能与 commit、baseRevision、targetRevision、SVN 参数或 reviewMode:"project" 同时使用。未跟踪文件仍默认排除;worktree / unstaged 下用 selectedPaths 显式选择后才会纳入。预览和报告都会标明实际比较的是哪两个内容。

staged 下显式上下文、自动依赖、调用方候选和规则文件仍按工作区当前内容读取,可能包含尚未暂存的修改;预览会列出这些文件。

审查 SVN 单个 revision

例如审查 r7315 引入的净变化,即 r7314 → r7315:

使用代码审查插件预览 SVN r7315(与 r7314 比较)。
允许为这次预览读取当前工作副本对应的远端仓库固定版本。
先展示来源、范围和模型,不发送源码给审查模型,等我确认再执行。不要更新工作副本。

{"svnRevision":"7315","svnAllowNetwork":true}

必须在 SVN 工作副本根目录运行。插件从该工作副本对应的仓库 URL 读取固定版本,不要求先把工作副本更新到 r7315,也不会执行 update。远端认证不可用时会明确报错,不会改用本地文件冒充历史版本。

审查 SVN revision 区间

预览 SVN r7300 到 r7315 两个版本端点的净变化。
允许读取当前工作副本对应远端仓库的固定版本,自动补充同版本依赖。
先展示范围和来源,等我确认后执行,不修改或更新工作副本。

{"svnBaseRevision":"7300","svnTargetRevision":"7315","svnAllowNetwork":true,"autoContext":true}

这是两个版本端点的比较,不是逐一审查区间内的每个提交。revision 使用带引号的十进制数字,不写 r7315、HEAD 或日期;同一路径比较要求旧版本小于新版本;不同分支可使用相同 revision(见下一节)。svnRevision 与区间参数不能同时使用,也不能混用 Git 版本参数。

svnAllowNetwork:true 只允许读取本次工作副本对应仓库的固定版本,不授权更新、合并或任意远端 URL。本地 file: 仓库通常无需此参数。

比较 SVN 两个分支

跨分支、有效继承属性和独立基线替换从正式版 v0.80.1 提供。请先确认当前 DSH 加载的版本;仅更新仓库不会升级宿主插件。

{"svnBaseRevision":"7315","svnTargetRevision":"7315","svnBasePath":"branches/release","svnTargetPath":"trunk","svnAllowNetwork":true,"autoContext":true}

分支路径相对于当前 SVN 仓库根,不是本地目录或任意 URL。旧、新两侧分别固定 URL、peg 与 operative revision;同 revision 可以比较不同分支。只能在同仓库 UUID 内比较;嵌套重叠根和不明确来源拒绝,不能推断 merge 提交归属。

查看有效继承 mergeinfo

{"svnRevision":"7315","svnAllowNetwork":true,"svnEffectiveMergeinfo":true}

显式允许读取选中节点及最近祖先的合并属性,额外读取受共享预算限制;工作副本模式也可使用该开关并保持离线。空属性屏蔽继承,祖先证据不完整、混合 BASE 或不安全来源显示 unknown;结果仅为属性导航,不证明相关 revision 已经审核。

审查未提交替换

{"selectedPaths":["src/module","src/module/old.cpp","src/module/new.cpp"],"svnReplacementBaseRevision":"7314","svnReplacementAllowNetwork":true}

替换比较的旧侧是你显式选择的目标 URL 固定历史节点,不是本地 BASE,也不证明它就是被删除节点的原始 revision。目录后代必须独立选入;只选父目录不能算后代均已批准。远端读取使用独立许可,默认不访问。没有可确认旧来源时明确拒绝,不读取复制源冒充旧节点。

加入业务要求、规则和调用方

只预览 src/api.ts 的改动;业务要求是“请求失败时必须释放连接”。
把 src/types.ts 作为辅助上下文,使用 review-rules.md 的项目规则,并在 src/clients 目录中寻找引用该变更文件的代码。先展示读取范围,等我确认。

{
"selectedPaths": ["src/api.ts"],
"contextPaths": ["src/types.ts"],
"rulePaths": ["review-rules.md"],
"callerScopePaths": ["src/clients"],
"businessRequirement": "请求失败时必须释放连接" }

这些文件和目录需要实际存在,路径相对于所选仓库:

- contextPaths:手动加入辅助文件,不代表该文件本身完成了主审。SVN 工作副本的未变更文件须通过离线正常节点/属性及来源检查;标准、固定宽度及受支持的复合自定义关键字经过 BASE 核验后可用于上下文;关键字名可由空格、制表符或换行分隔,格式内空格使用 %_。引号配置、未知格式及特殊或不可确认来源仍明确拒绝,已选择的可审查变更复用快照。
- autoContext:true:自动补充最多三层文本依赖,不是全仓扫描或编译器分析。
- callerScopePaths:在明确指定的非根目录中寻找字面引用。预览可能扫描该目录内不匹配的候选正文;只有捕获的匹配上下文随执行发送模型。SVN 受支持的关键字候选经 BASE 核验后支持,扫描及核验正文共同计费;不支持配置明确失败,不保证找到全部调用方。
- rulePaths:最多四个 UTF-8 Markdown 或文本规则文件,不能同时列为上下文。
- businessRequirement:帮助确定审查目标,本身不是缺陷证据。
Git / SVN 历史审查也能用这些参数;依赖和调用方按对应版本读取,不回退到当前工作区。只想提供旧版辅助文件时,用 oldContextPaths,例如 {"svnRevision":"7315","svnAllowNetwork":true,"oldContextPaths":["src/old-helper.ts"]}。它不能用于工作副本模式。

一个工作区中有多个仓库

假设会话工作目录下有 project-a、project-b 两个仓库:

只预览工作区中 project-a 仓库的 src/api.ts 改动,不读取 project-b。先展示范围再等我确认。

{"repositoryPath":"project-a","selectedPaths":["src/api.ts"]}

repositoryPath 相对于会话工作目录,必须指向一个实际仓库根目录;其余文件路径再相对于该仓库。每个仓库分别预览和执行,不使用绝对路径、.. 或链接目录。

长任务:后台预览、审查与取回结果

全项目或慢仓库建议使用后台工具,不让一次外层调用等待整个项目。仍先预览,再由你确认外发;启动返回 jobId 不等于审核完成。

1. 调用 code_review_start,phase 设为 preview,previewArgs 填原预览参数(例如 reviewMode=project)。
2. 用 code_review_status 和 jobId 查询;完成后读取 resultSummary 中的预览范围、模型和 previewId。
3. 展示预览,确认后调用 code_review_start,phase 设为 execute,传 previewId 与 confirmed=true。
4. 持续调用 code_review_wait 等待进度变化或终态,不因启动返回任务 ID 就结束用户请求。可展示阶段与「处理数/总数」,不分批汇报问题;抓取阶段分母未知则不显示虚假百分比。等待返回仍 running 就继续等待,不重新启动。任务结束后取回并统一交付一份最终报告。查询审查任务;offset/limit 分页取回检查点、文件状态和发现;单个检查点内的大清单用 checkpointIndex 指定其零基索引,再用 offset/limit 取回内部全部条目。可调用 code_review_cancel 取消。

报告保存在宿主配置档的 data/dsh-code-review/jobs 目录;没有配置档环境时使用用户主目录 .dsh 下的数据目录,不写入业务仓库。内容可能含源码片段,应按源码敏感级别保护。本次启动调用结束不自动取消后台任务;明确取消、停用插件或宿主退出会停止它。

重启后可按原 jobId 读回保存记录,原运行标记 interrupted,不自动继续外发。recovery 给出已观察文件/窗口与未完成路径;它不是完整分母或新授权,补审必须重新预览确认。新预览的 runtime 包含实际加载版本和模块位置,排查不同工作区时分别核对,不根据另一台机器推断。

变更审查的独立文件链默认最多 2 条并行;配置 changesConcurrency 为 1~4(1 回退串行),跨文件综合等待相关前置主审结束。配置 maxRetrievalRounds 为 0~50,默认为 3,限制每阶段检索请求回合数(不是成功读取次数;非法请求也会消耗回合)(0 只允许最终答复)。配置不是 preview 参数,不改变模型或来源授权;并发仍共享同一份读取/调用预算,额度不足时完成顺序可能影响哪些任务未完成,不能保证与串行逐项结果相同。服务商限流时应降低并发。复核可预取批准快照中候选锚点附近的同侧原文,仍允许追加反证读取并逐字校验;不复用主审结论或其他会话凭据。完整变更计划可容纳时仅生成一次再分发到窗口,否则保留原分窗口计划并在预览估算中体现。

大文件超出单次输入时按原行号分段。精确差异算不出时使用明确标注的包络,可能包含未变行,不声称精确归因。完整结束但 JSON 语法无效时会按当前阶段 schema 最多请求两次明确纠正,记录额外调用;检索请求非法时整批不执行并明确纠正,回填采用可追溯的滚动工作集、必要时延后重复窗口正文,不虚构证据。主审与复核默认各最多 3 轮检索;到限后只允许最终答复,保留未完成范围,不把已用完预算当成审核通过。不会给错误输出补括号、猜字段或当成无缺陷。

显式续审与私有模型工件

需要补审时,在新预览中传入 resumeFromJobId,例如 {"resumeFromJobId":"原执行任务的真实jobId"};仍须展示新范围、重新确认并通过当前宿主权限。只复用同一会话、工作目录、模型路由/思考设置下,完整快照、配置和运行时身份均匹配的已完成且符合复用条件的文件链;项目模式还绑定对应批次。来源或配置变化不做猜测复用。未完成阶段重新执行,旧发现标记 priorRun,不伪造本轮读取凭据、模型调用或覆盖。

后台审查会在上述宿主任务目录的 artifacts 子目录留存有界模型工件,包括失败/取消时已捕获的文本或工具参数;不含 reasoning。它们可能含源码,应按源码保护,不会自动加入提示词、当作已确认发现或在普通状态报告公开。默认单工件 1 MiB、每任务原文总量 8 MiB、最多 4096 条记录;截断由工件标记,存储超限明确返回遗漏标记和无源码诊断。读取绑定原会话、目录、服务商、模型和思考设置。需要查看时,Agent 必须先提示「可能把源码/模型原文带入当前对话」,取得你的明确同意,再调用 code_review_artifacts({jobId,confirmed:true});可用 offset/limit 分页,默认一次 1 条、最多 100 条。返回内容标为 sourceBearing:true、untrusted:true,不是批准证据;普通 status 不返回工件原文。目录/文件使用 0700/0600 权限模式及原子写入;Windows 模式位不等于额外 ACL 保证。

多个会话同时审查

可以同时打开多个 DSH Agent 会话:会话 A 审项目 A,会话 B 审项目 B,也可以分别审查同一项目。各会话的预览、执行锁、模型路由、取消和预算独立;A 正在执行不会让 B 收到全局 busy。一个会话不能同时启动两个独立审查任务,但任务内部可按配置并行;不能拿另一个会话的 previewId 执行。宿主停用插件会结束全部服务,单次取消只影响当前请求。

审查整个项目当前代码

在项目仓库根目录创建会话,发送:

使用code_review_preview,全项目模式审查当前已跟踪代码,包括没有改动的文件。
先列出全部文件、排除项和分批范围,告诉我模型和预算;等我确认再执行。不要修改代码。

{"reviewMode":"project"}
这不是 HEAD 到工作区的差异:模型检查当前已有缺陷,不要求问题由最近提交引入。默认仍是 reviewMode:"changes" 的变更审查。

项目模式接受 reviewMode、repositoryPath、可选 selectedPaths 和显式续审参数 resumeFromJobId,不与历史 revision、autoContext、规则或调用方参数混用。默认全部跟踪节点;不读取未跟踪/忽略文件、子模块、外部仓库及链接目标。目录只作清单记录,源码按批次审查;跨批次不宣称完整调用图或全程序语义分析。

未指定选择时,清单上限 10000 节点,Git 索引输出上限 2 MiB。Git 显式 selectedPaths 只查询所选精确文件,不先枚举全仓,因此大仓库可用小范围预览;空数组不枚举索引,目录与通配符不会展开。此时 inventoryScope:"selected"、inventoryComplete:false、selectionComplete:false,totalTrackedNodes:null 表示全仓总数未知,inventoryNodes 仅为所选清单数;只绑定所选索引及正文,未选文件的变化不使该局部快照失效。单次选择运行时最多 1000 节点(公开工具参数显式列表最多 200 项)/16 MiB,12 节点一批,单文件 256 KiB;超限必须重新预览。SVN 仍枚举本地已观察清单,显式选择不绕过清单上限,稀疏/外部/链接及不支持属性显示限制,不证明远端完整覆盖。SVN 单次采集共享 8 MiB 元数据保护;Git 所选索引单次查询最多 64 KiB、合计 2 MiB。不按命令条数、插件秒表或模型调用次数中断;耗时受宿主/模型提供方限制,用户可随时取消。

全项目审查默认最多 8 个独立批次并行,每批内主审、检索、复核仍按依赖顺序执行;预览和报告的 execution.batchConcurrency 显示实际配置。插件配置 projectConcurrency 可设为 1~8,设 1 回退串行;遇到模型提供方并发限制或 429,应降低并发。该设置不是 preview 参数,不扩大来源或共享模型调用预算,也不减少模型调用量或承诺 token 成本下降。仅一个批次时不会获得批间加速;实际提速受提供方吞吐、批次均衡及检查点写入影响。

对外只交付一份统一最终报告,给出总数、completed、excluded、blocked、pending、去重后的发现及未完成综合阶段;内部批次快照仅供证据追溯,不需要用户拼接报告。completed 只表示所选捕获文件已处理,不代表代码正确;排除与阻断从不算完成。所绑定的代码或清单变化会拒绝旧预览,运行后无法复核则标记 outdated。

工具调用流程(给需要精确指定参数的人)

普通使用者只需上面的对话请求,不必手工构造 ID。需要精确控制时,让 Agent 按下列顺序调用:

1. 调用 code_review_preview,参数可以是 {} 或上面的 JSON 示例。
2. 展示返回的仓库、模型、文件与限制,保留返回的 previewId。此时还没有完成审查。
3. 用户确认后,调用 code_review_execute:

{"previewId":"替换为本次预览真实返回的ID","confirmed":true}

不要把示例 ID 原样执行,也不要在 execute 中重新传文件和版本参数。要改范围,重新 preview。reviewRounds 可在预览时指定为 1~3(默认 1),表示独立审查次数,会增加模型调用量,不是模型的思考强度设置。

如何判断报告是否完成

| 状态 | 含义 | 你应该做什么 |
| completed | 相应阶段完成,不表示代码绝对正确 | 阅读问题、复核结果和限制 |
| partial | 只完成部分工作 | 检查未完成文件、证据不足或预算限制 |
| failed | 执行失败,不是审核通过 | 根据诊断处理后重新预览 |
| cancelled | 审查被取消 | 需要时重新发起 |

每个候选问题会保留位置、触发条件、影响和复核结果。复核可能支持、反驳、无法确定或未完成;引用原文匹配也不等于缺陷一定成立。没有发现问题不证明没有缺陷,读取过上下文也不等于审查了整个项目。

模型结果传输与读取预算恢复

生产入口启用原生结果工具 submit_review_result,只接收结构化结果,不执行模型工具产生的文件操作;同次调用仍兼容文本结果。底层适配器的原生模式默认关闭,由生产服务显式启用。只有原生模式允许提取开头完整、平衡且字节不变的 JSON 后面的明确自然语言尾注;多 JSON、含糊尾部、损坏 JSON 仍拒绝,不补字段或猜身份。原生模式的预览与发送前校验使用同一 UTF-8 测量:输入、阶段契约、格式指引和序列化工具 schema 均纳入,不把字节估算当 token 或费用保证。

已启用的模型桥接对完整结束但 JSON 无效的响应最多请求两次明确纠正(共最多三次调用),不会修补损坏 JSON;取消、提供方错误、不完整结束或输出超限不作此类重试。主审响应中的文件身份、严重性、必填字段或行证据校验失败时,最多请求一次完整响应纠正,仍按原快照、输入及调用预算严格验证。每次额外调用和纠正事件都会计数记录,恢复失败仍标为失败,不代表发现了缺陷。

全项目模式可将行号错位的证据重新定位到同文件当前侧的唯一精确文本;不跨文件、跨版本或模糊匹配,原候选保留供审计,窗口范围仍须通过校验。模型会收到共享检索预算余量;预算耗尽或请求超过余量时仅给一次不再检索的最终答复机会,不扩大读取权限。预算受限的文件仍列为未完成,已有有效候选保留,不会因返回空 findings 就算审查通过。

常见问题

| 遇到的问题 | 处理方法 |
| Agent 没有调用代码审查工具,只给了普通文字分析 | 明确要求调用 code_review_preview;若工具不可用,检查插件是否启用并已加载到当前会话 |
| 找不到仓库 / 选错仓库 | 检查会话工作目录;多仓库时用 repositoryPath 指定子仓库根目录 |
| 新文件没有出现 | 用 selectedPaths 显式选择未跟踪文件;路径相对于仓库 |
| 预览过期、文件已变化、模型已变化 | 重新预览,核对新范围后再确认,不复用旧 ID |
| SVN 历史提示需要网络许可 | 确认可以访问仓库后,预览参数增加 svnAllowNetwork:true |
| SVN 登录、权限或版本不存在 | 检查 SVN 本身的访问权限和版本号;不要把密码写进对话或仓库 URL |
| 文件被阻断或报告 partial | 阅读具体原因;缩小变更批次、补充允许的上下文,或处理真实冲突后重新预览。不能把排除文件视为通过 |
| 想只审查 Git 暂存区或只审查未暂存改动 | 预览参数设置 changeScope:"staged"(HEAD → 索引)或 changeScope:"unstaged"(索引 → 工作区);默认仍是 HEAD 到工作区的净变化 |

支持范围与安全边界

- 执行会把批准范围内的代码、上下文、所选规则及业务要求发送给当前模型提供方;敏感项目请先检查预览和模型。常见凭据路径过滤不能保证源码没有秘密。
- 插件遵循 DSH 工具权限;确认预览不等于绕过宿主权限。不执行项目代码、构建脚本或模型生成的 shell 命令。
- Git 支持工作区净变化、暂存区/未暂存范围、单提交、两版本比较。SVN 支持工作副本和固定历史端点;尚未完整支持所有 SVN 状态。
- SVN 根目录属性可预览;同仓库复制新增以空目标旧侧审查,复制来源只作信息;移动的新增/删除分别覆盖。目录后代须逐项纳入,选择父目录不自动批准所有后代。
- SVN 标准、固定宽度和受支持的复合关键字展开,以及工作副本变更/自动依赖/命中调用方、固定历史变更及上下文的换行元数据保留原文证据;不以规范化结果证明行为等价。自定义/固定宽度关键字、未提交替换、冲突、特殊节点、切换/外部工作副本及跨仓库比较等仍有限制。同仓库跨分支与独立基线替换需要下文列出的显式参数。已提交固定历史替换与未提交替换的支持不同,详见 SVN 支持矩阵。
- 源码可混用 UTF-8(含 BOM)与 GBK/CP936;无 BOM 时优先严格 UTF-8,失败才尝试完整合法 GBK 字节序列,原有带 BOM 的 UTF-16 仍支持。BOM 声明损坏不回退;不支持 GB18030 四字节扩展或单文件混杂编码。两种编码都合法的无 BOM 字节优先按 UTF-8 解释,自动识别不保证还原原作者意图;不转码写回,原始字节哈希、换行与证据行号保留,规则文件仍限 UTF-8。
- 二进制、不能解码的文件、普通源码路径中的链接和超限内容会明确阻断;已跟踪的 SVN 链接只审查 link 目标 记录,不读取目标正文,不静默截断后声称完成。文本导航不证明语义绑定、执行可达或完整调用覆盖。

调用效率与预算

业务分组在文件链启动前独立完成,不以先跑完第一个文件作引导。适合的 2~4 个文件可合并为一次组主审:必须是精确变更、完整正文且可容纳的非项目模式成员,响应逐个返回原文件身份并通过各自校验。窗口化、超预算或不适合的组在发送前回退单文件;专门跨文件交互阶段及独立复核仍保留,组主审不等于跨文件证据已证明。可合并的风险假设是可选信息,缺失/无效会记录限制,不为它单独追加调用。

变更模式默认优先保留主文件全文,仅附带有导入/调用等关系的完整上下文对象(序列化合计最多16KiB或输入上限四分之一,取较小值);其余批准来源保留版本目录按需读取,不表示不存在或已核查。完整正文,或经过精确新旧编辑、坐标和原文核对且覆盖全部编辑的单批窗口,可将风险问题合入首轮主审。多批窗口、包络差异和项目审查仍保留独立规划;保留独立候选复核和跨窗口/跨文件综合,不以丢弃窗口换取速度。报告中的合并问题不是独立风险规划或已验证条件。

模型搜索的精确命中可同轮附带批准来源原文,每阶段最多2次额外读取尝试、每次最多24行;占用原共享额度并预留4次操作/16KiB输出,不猜测另侧坐标,不增加检索轮数。配置 focusPrimaryContext:false、enableSearchSeeds:false 可分别关闭上下文聚焦和搜索命中附读;无检索能力时不会隐藏正文。

共享读取预算按本次可审文件数有界缩放,预览的 execution.readerBudget 显示具体值;所有阶段共用、不逐文件刷新。生产编排在根上限内按主审规模及综合/复核单元权重预留最低额度,未用份额释放;最低份额取整可能为零,不保证每个阶段都有新读额度。同一批准快照的相同操作结果可复用,calls 计实际结果生成、缓存命中另计;每次交付仍计序列化字节,复核回执重新签发,跨快照不复用。必要证据不足仍保留未完成范围,不以提前返回当作完成。配置 riskPlanningMode:"separate"、readerBudgetPolicy:"fixed" 可回退原规划和固定读取额度,这些是插件配置,不是preview参数。更多额度不保证更快或完整覆盖;不建议用提高并发掩盖冗余调用。

诊断显示实际加载版本、阶段及调用目的计数、读取余量,并区分单阶段检索轮数和共享读取额度。新增无源码的JSON纠正原因、协议/审查格式纠正计数及未合并规划原因;纠正计数以实际纠正调用为准;这些诊断不含原响应、源码片段或提供方错误文本,与下面说明的私有模型工件分开。primary-initial 是检索链初始调用,不只包含主审阶段。累计调用耗时可能并发重叠,不能当作总耗时或纯提供方耗时。离线调用数减少不代表实际审核必然同比提速,不能用更快返回partial冒充审核完成。

规模限制

| 项目 | 默认上限 |
| 变更文件 | 200 个 |
| 单文件 | 256 KiB |
| 全部快照 | 4 MiB |
| 额外上下文 | 手动与自动来源共 20 个文件 |
| 单次模型输入 | 约 96 KiB |
| 内部时间/总调用次数 | 不设默认截止;遵循宿主与用户取消 |

大变更可按保留原行号的差异窗口分批分析;无法容纳的部分会明确标为未完成。建议先按功能或模块选择一小批文件。详细读取和时间预算见 开发与发布指南。

版本、许可与其他文档

最新安装包见 npm 和 GitHub Releases。发布或安装成功不代表真实模型的误报率、漏报率已得到证明。

许可:非商业源码公开许可证。公司内部商业项目、收费服务和商业交付需要另行取得书面授权。 详见 LICENSE。

- 版本变化:各版本带来的变化。
- 本次发布说明:本版功能与限制。
- SVN 支持矩阵:SVN 具体状态、限制和验证证据。
- 开发与发布指南:维护者使用的测试、打包与发布流程。
- 核心能力对照 / 参考源码对照:维护计划与参考来源。
- 评测说明:样本、试跑观察及其限制。
预览分享卡片长什么样 ↓f-e-n-g-0531/dsh-code-review
分享 · DeepSeek Harness Hub
f-e-n-g-0531/dsh-code-review

在 DeepSeek HarnessDSH的 Agent 对话里审查 Git / SVN…

回到顶部