@feng0531/dsh-code-review 0.85.8 → 0.85.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/DEVELOPMENT.md +6 -0
- package/README.md +1 -0
- package/RELEASE-NOTES.md +8 -10
- package/package.json +1 -1
- package/src/content.mjs +22 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
本文件介绍对使用者有意义的变化。安装与参数见 [README](README.md),本次发布正文见 [发布说明](RELEASE-NOTES.md)。历史提交和安装包保留在 [GitHub Releases](https://github.com/f-e-n-g-0531/dsh-code-review/releases);本文不把开发日志当作功能介绍。
|
|
4
4
|
|
|
5
|
+
## 0.85.9 — UTF-8 与 GBK 源码兼容
|
|
6
|
+
|
|
7
|
+
- 源码读取增加严格 GBK/CP936 回退,支持同一批准快照中混用 UTF-8 与 GBK 文件;沿用 UTF-8 优先和 BOM 声明,保留原始字节哈希、行号与换行,不转码写回。
|
|
8
|
+
- 原有带 BOM 的 UTF-16 兼容不变;非法字节、GB18030 四字节序列及二进制保护不放宽,规则文件和 VCS 元数据仍遵循原编码协议。
|
|
9
|
+
|
|
5
10
|
## 0.85.8 — 变更审查重复工作与调度修复
|
|
6
11
|
|
|
7
12
|
- 变更模式独立文件链默认两路受控并发(可配置 1~4),分组只初始化一次,交互综合等待相关前置主审;报告按原顺序归并,取消和致命检查点错误排空在途任务。
|
package/DEVELOPMENT.md
CHANGED
|
@@ -50,6 +50,12 @@
|
|
|
50
50
|
|
|
51
51
|
执行 `node --test test/model-diagnostics.test.mjs test/model-json-correction.test.mjs test/model-protocol-diagnostics.test.mjs test/dsh-model.test.mjs` 可验证本地纠正、失败归类和脱敏;宿主检查另覆盖真实 ToolRuntime 的纠正和服务失败事件,均为受控离线模型,不证明真实服务失败率下降。
|
|
52
52
|
|
|
53
|
+
## 源码编码
|
|
54
|
+
|
|
55
|
+
统一 `content.decode/readLocal` 支持 UTF-8 与 GBK/CP936:BOM 是权威声明,原有 UTF-16 LE/BE BOM 保持兼容;无 BOM 时严格 UTF-8 优先,失败才校验完整 GBK 单/双字节结构再用 fatal 解码,防止原生 `gbk` 别名意外接受 GB18030 四字节序列。不能确定原作者对合法歧义字节的编码意图,不按单行拼接或修复乱码;已存在的 U+FFFD 不猜测还原。返回的 `encoding` 如实为 `gbk`,`hash/bytes` 属于原始源字节;reader/证据文本哈希仍属解码文本,两者不能互换。CRLF 和代码文件从不转码写回,原始文件限制与解码后 UTF-8 输入/内存预算均保持。
|
|
56
|
+
|
|
57
|
+
Git 路径和索引、SVN XML、规则文件与 SVN 链接记录仍按各自 UTF-8 协议校验,不因源码兼容而放宽;固定宽度关键字映射仍须独立核验,不支持的混杂编码或映射会明确阻断。
|
|
58
|
+
|
|
53
59
|
## 审查预算
|
|
54
60
|
|
|
55
61
|
除 README 中的文件和输入上限外:
|
package/README.md
CHANGED
|
@@ -313,6 +313,7 @@ Git / SVN 历史审查也能使用这些参数;依赖和调用方按对应版
|
|
|
313
313
|
- Git 支持工作区净变化、暂存区/未暂存范围、单提交、两版本比较。SVN 支持工作副本和固定历史端点;**尚未完整支持所有 SVN 状态**。
|
|
314
314
|
- SVN 根目录属性可预览;同仓库复制新增以空目标旧侧审查,复制来源只作信息;移动的新增/删除分别覆盖。目录后代须逐项纳入,选择父目录不自动批准所有后代。
|
|
315
315
|
- SVN 标准、固定宽度和受支持的复合关键字展开,以及工作副本变更/自动依赖/命中调用方、固定历史变更及上下文的换行元数据保留原文证据;不以规范化结果证明行为等价。自定义/固定宽度关键字、未提交替换、冲突、特殊节点、切换/外部工作副本及跨仓库比较等仍有限制。同仓库跨分支与独立基线替换需要下文列出的显式参数。已提交固定历史替换与未提交替换的支持不同,详见 [SVN 支持矩阵](SVN-SUPPORT-MATRIX.md)。
|
|
316
|
+
- 源码可混用 UTF-8(含 BOM)与 GBK/CP936;无 BOM 时优先严格 UTF-8,失败才尝试完整合法 GBK 字节序列,原有带 BOM 的 UTF-16 仍支持。BOM 声明损坏不回退;不支持 GB18030 四字节扩展或单文件混杂编码。两种编码都合法的无 BOM 字节优先按 UTF-8 解释,自动识别不保证还原原作者意图;不转码写回,原始字节哈希、换行与证据行号保留,规则文件仍限 UTF-8。
|
|
316
317
|
- 二进制、不能解码的文件、普通源码路径中的链接和超限内容会明确阻断;已跟踪的 SVN 链接只审查 `link 目标` 记录,不读取目标正文,不静默截断后声称完成。文本导航不证明语义绑定、执行可达或完整调用覆盖。
|
|
317
318
|
|
|
318
319
|
## 规模限制
|
package/RELEASE-NOTES.md
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
# v0.85.
|
|
1
|
+
# v0.85.9 发布说明
|
|
2
2
|
|
|
3
3
|
使用方式见 [README](README.md),详细变化见 [变更记录](CHANGELOG.md),发布门禁见 [开发说明](DEVELOPMENT.md)。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 同时审查 UTF-8 与 GBK 源码
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
- `maxRetrievalRounds` 默认 3、范围 0~50,变更与项目模式的配置、预览和执行保持一致。到限只允许最终答复,仍明确 partial/uncertain 和未完成范围,不把限额耗尽视为审核通过。
|
|
11
|
-
- 增加提供方实际调用的阶段、时长和字节统计,不记录源码或推理正文;明确最终源码复核阶段,修复终态耗时继续增长及 blocked 状态被暂时显示为 pending 的问题。
|
|
7
|
+
- 同一批准快照可混用 UTF-8(含 BOM)与 GBK/CP936 文件。统一源码解码入口覆盖 Git/SVN 工作副本、历史版本、项目审查及所选上下文;中文检索、主审与独立复核使用同一解码文本。原有带 BOM 的 UTF-16 LE/BE 兼容不变。
|
|
8
|
+
- 无 BOM 时优先严格 UTF-8,失败才尝试完整合法 GBK 字节序列;BOM 是权威声明,损坏的 Unicode 不降级为 GBK。严格拒绝 GB18030 四字节扩展、残缺 GBK 序列及原有二进制控制字符,不用替换字符掩盖解码失败。
|
|
9
|
+
- 不转码写回,不规范化换行;原始源字节哈希和长度保留,检索/证据哈希仍属于解码文本,两者明确区分。相同文本由 GBK 转为 UTF-8 仍使快照身份变化,旧快照凭据不可继续使用。
|
|
12
10
|
|
|
13
11
|
## 验证与边界
|
|
14
12
|
|
|
15
|
-
本地 Windows 完整测试
|
|
13
|
+
本地 Windows 完整测试 840 项:836 通过、4 项平台限定跳过、0 失败。新增 16 项编码、真实本地 Git/SVN 和审查证据回归,覆盖暂存区/未暂存范围、工作副本/固定历史/项目模式、中文、CRLF、原始字节身份、不写回及同文本转码后的授权失效。正式发布须通过冻结标签同一提交的 Ubuntu/Windows × Node.js 22/24 四组 CI、版本化隔离安装,以及原始 Actions 包、npm 与 GitHub Release 工件一致性门禁;远端结果以对应 CI 与发布工作流为准。
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
UTF-8 优先是确定性策略,不保证识别原作者意图:两种编码都合法的无 BOM 字节按 UTF-8 解释;单文件混杂编码不受支持,也不猜测修复已存在的乱码或 U+FFFD。原始文件大小和解码后 UTF-8 输入/内存预算均保持,内容可能因展开后超限而阻断。
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
Git 路径/索引、SVN XML、规则文件、SVN 链接记录仍遵循各自原编码协议,不因源码兼容而放宽;不支持的关键字/混杂编码映射仍明确阻断。发布不自动安装、升级或重启 DSH;更新并重新加载插件后生效。
|
package/package.json
CHANGED
package/src/content.mjs
CHANGED
|
@@ -9,11 +9,31 @@ export function relativePath(value) {
|
|
|
9
9
|
if (typeof value !== 'string' || !value || /[\\:\0]/.test(value) || path.posix.isAbsolute(value) || value.split('/').some(p => !p || p === '.' || p === '..' || p.toLowerCase() === '.git' || p.toLowerCase() === '.svn')) throw new Error('Unsafe repository path');
|
|
10
10
|
return value;
|
|
11
11
|
}
|
|
12
|
+
// Native WHATWG gbk decoders may also accept GB18030 four-byte sequences.
|
|
13
|
+
// Constrain fallback to GBK/CP936 bytes rather than silently broadening support.
|
|
14
|
+
function isGbk(bytes) {
|
|
15
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
16
|
+
const lead = bytes[i];
|
|
17
|
+
if (lead <= 0x80) continue; // ASCII plus CP936's single-byte euro sign.
|
|
18
|
+
const trail = bytes[++i];
|
|
19
|
+
if (lead < 0x81 || lead > 0xfe || trail === undefined || trail < 0x40 || trail > 0xfe || trail === 0x7f) return false;
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
|
|
12
24
|
export function decode(bytes) {
|
|
13
|
-
let encoding = 'utf-8', body = bytes;
|
|
25
|
+
let encoding = 'utf-8', body = bytes, text;
|
|
26
|
+
const utf8Bom = bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf;
|
|
14
27
|
if (bytes[0] === 255 && bytes[1] === 254) { encoding = 'utf-16le'; body = bytes.subarray(2); }
|
|
15
28
|
else if (bytes[0] === 254 && bytes[1] === 255) { encoding = 'utf-16be'; body = bytes.subarray(2); }
|
|
16
|
-
|
|
29
|
+
try { text = new TextDecoder(encoding, { fatal: true }).decode(body); }
|
|
30
|
+
catch (error) {
|
|
31
|
+
// A declared BOM is authoritative; corrupt Unicode must not be reinterpreted.
|
|
32
|
+
// BOM-less valid UTF-8 wins ambiguous byte sequences. No replacement decoding.
|
|
33
|
+
if (encoding !== 'utf-8' || utf8Bom || !isGbk(bytes)) throw error;
|
|
34
|
+
encoding = 'gbk';
|
|
35
|
+
text = new TextDecoder(encoding, { fatal: true }).decode(bytes);
|
|
36
|
+
}
|
|
17
37
|
if (/[\x00-\x08\x0e-\x1f]/.test(text)) throw new Error('Binary content');
|
|
18
38
|
return { text, hash: hash(bytes), encoding, bytes: bytes.length };
|
|
19
39
|
}
|