Files
dingtalk-workspace-cli/docs
chichuan d1c8c903f6 fix(drive): 修复 --latest 的字段泄露、不完整扫描误报与别名互斥缺口
修复 PR #885 review 提出的三个问题,均已实机复现确认真实存在。

1. [P1] 内部排序字段 sortTime 泄露进输出契约
sortTime 无条件写入每个 BFS 项,却只在 latest>0 && depth==1 时随装饰字段一起剥除,
于是普通 --depth 2 与 depth>1 --latest 的输出都带上它,违反设计文档「不新增业务字段」。
改为只在 latest>0 时写入,并在 emitDriveDepthResult 发射前无条件删除(含 SIGINT 路径),
与 depth==1 的整体剥除解耦。

2. [P1] 扫描不完整仍以退出码 0 产出「全局 Top-N」
拒绝产出的防线只看 truncated,递归途中目录读取失败只进 errors[] 并继续执行。BFS 序与
修改时间无关,未读全的区域完全可能含更新文件,这种集合上的 Top-N 不是全局最新。改为
latest>0 时 truncated 或 errors[] 非空一律拒绝产出(新 token LATEST_SCAN_INCOMPLETE,
与 LATEST_SCAN_TRUNCATED 同 code,便于消费方区分「范围太大」与「读不到」);errors[]
不再进 stdout,失败目录数与首个失败详情因此搬进错误消息。不可恢复错误(token 过期 /
网络不可达)在 latest 下不吐 partial,原样上抛根因错误。不带 --latest 的路径行为不变
(partial + truncated:true + errors[] + 退出码 0),有独立护栏测试;SIGINT 路径不动
(退出码 130 已显式标记结果不完整)。

3. [P2] RegisterCrossProductAliases 自动注册的隐藏别名逃过互斥校验
校验手写枚举 limit/max 与 cursor/next-token,漏掉自动注册的 --page-size(limit 语义组)
与 --page-token(cursor 语义组):--latest 3 --page-size 1 此前退出 0 并静默忽略该 flag。
改为从注册表按语义组取别名(新增只读查询 crossProductAliasPeers),报错点名用户实际传入
的那个 flag 而非语义组主名。string 型按值判定(保住 Agent 的 --cursor "$CURSOR" 首页空值
模板)、其余按 Changed 判定,与改造前 flagOrFallback / Changed 逐字等价,只把覆盖面扩到
全部别名。

本 PR 之外的一处主动扩围(单列说明,便于单独判断):validateDriveListDepth 有完全相同的
枚举缺口。--depth 2 --limit 50 今天已报错,而 --depth 2 --page-size 50 静默忽略、
--depth 2 --page-token X 更糟(用户以为在续页,游标实际被丢掉)。共享 helper 后是一行
改动;已确认无代码以编程方式 Set 这些别名、无文档示例这样组合,行为变化面只是「静默忽略
→ 明确报错」。

测试:sortTime 不泄露(带/不带 latest 两侧)、目录失败与不可恢复错误下拒绝产出且 stdout
为空、对应的 latest=0 partial 护栏、用真实 newDriveCommand 构造的别名互斥回归(--latest
与 --depth 两侧共 14 组)、空值游标模板不误伤、crossProductAliasPeers 单测。
文档同步:设计文档 §3.2/§4/§5/§6/§7、两份 skill 镜像、flag 帮助文案与 CHANGELOG。
2026-08-06 12:14:55 +08:00
..