[Bug] Windows 下 agent setup 无法识别仅大小写不同的重复配置路径
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 76/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- typescript
调研方向
先阅读 writeTarget() 和 assertDistinctConfigurationTargets(),然后找到现有的重复目标测试,以及调用它们的准备/写入流程。为 Windows 上不区分大小写的标识键和非 Windows 系统上区分大小写的标识键添加有针对性的覆盖;完成的标准是共享目标在创建文件或备份之前失败,同时原始 targetPath 保持不变。
由索引模型根据 Issue 内容生成。
描述
[Bug] Windows 下 agent setup 无法识别仅大小写不同的重复配置路径
问题描述
在 Windows 上,如果 CLAUDE_CONFIG_DIR 和 PI_CODING_AGENT_DIR 使用不同的字母大小写指向同一个目录,Claude Code 与 Pi 实际会使用同一个 settings.json,但当前的重复目标预检会把它们识别成两个不同路径。
当前 main 中,writeTarget() 使用 realpathSync() 生成目标路径;Windows 上该调用会保留调用方提供的路径大小写。随后 assertDistinctConfigurationTargets() 使用区分大小写的 Set<string> 判重,因此同一物理路径的不同大小写形式能够绕过预检。
最小复现
在 Windows 上准备一个包含合法 settings.json 的共享目录,让 CLAUDE_CONFIG_DIR 与 PI_CODING_AGENT_DIR 以不同大小写指向该目录,然后同时准备 Claude Code 和 Pi 的配置。
- 预期:按照现有测试契约,在创建文件或备份前报告重复配置目标。
- 实际:两个逻辑路径指向同一个物理文件,但因字符串大小写不同而绕过重复目标预检。
核验情况
我已经检索所有状态的 issue 和 PR,并检查开放 PR 涉及的文件,未发现等价报告、现有实现或正在进行的同文件修改。该问题可以使用 Windows 临时目录完全离线验证,不需要 API key、账号或网络。
建议修复方案
我建议保留 writeTarget() 生成的 targetPath 作为唯一真实读写路径,不修改它的大小写;另派生一个只用于判重的路径身份键:
function configurationTargetIdentity(
targetPath: string,
platform = process.platform,
): string {
const normalized = platform === 'win32'
? win32.normalize(targetPath)
: normalize(targetPath);
return platform === 'win32' ? normalized.toLowerCase() : normalized;
}
assertDistinctConfigurationTargets() 中的 Set 改为保存这个身份键,而不是直接保存 file.targetPath。这样 C:\Users\A\Config\settings.json 与 c:\users\a\config\SETTINGS.JSON 在 Windows 下会得到同一个比较键,并在任何写入或备份前触发现有的重复目标错误。
真实的 file.targetPath 仍用于读取、写入、错误提示和回滚,因此不会因为判重而改写用户路径,也不会引入第二份可变路径状态。准备阶段与写入前复检继续调用同一个 assertDistinctConfigurationTargets(),保证只有一套判重规则。
计划补充以下聚焦测试:
- 保留现有“完全相同路径必须在创建文件或备份前失败”的测试。
- 给纯身份函数传入
win32平台语义,验证盘符、目录名和文件名仅大小写不同的路径得到相同身份键;这样现有 Ubuntu CI 也能稳定覆盖 Windows 比较规则。 - 验证非 Windows 平台仍保持大小写敏感,避免改变其他平台行为。
- 在 Windows 本地执行端到端回归,确认不同大小写指向同一共享目录时,准备阶段直接失败且没有生成文件或备份。
本次范围只处理 Windows 大小写路径碰撞,不比较文件内容,不改变 Agent 配置格式、安装流程、认证、事务写入或回滚行为,也不扩展到硬链接等其他文件别名。
请问维护者是否同意由我提交这个 PR?在获得明确许可前,我不会开始实现。
- 主要语言
- TypeScript
- 星标
- 2.2k
- 派生
- 187
- 平均合并
- 9 小时 55 分钟
- 30 天内合并 PR
- 4
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
MiniMax-AI/cli 的其他 Issue
-
[Bug] 未登录时 mmx help 被认证检查拦截,无法查看公开文档链接可能重新可做 关联的 PR 已关闭且未合并。 未关闭
难度 2/5 1-3 小时 新手友好度 84/100
MiniMax-AI/cli#259 · 1 条评论 ·
维护者通常 1 天内回复
-
[Bug] --no-color 未去除请求状态栏的 ANSI 颜色可能重新可做 关联的 PR 已关闭且未合并。 未关闭
难度 2/5 1-3 小时 新手友好度 88/100
MiniMax-AI/cli#258 ·
维护者通常 1 天内回复
-
/compact command未关闭
难度 5/5 一周以上 新手友好度 25/100
MiniMax-AI/cli#275 ·
维护者通常 1 天内回复
-
[Security] Six confirmed vulnerabilities remain in latest main可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 5/5 一周以上 新手友好度 25/100
MiniMax-AI/cli#273 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 5/5 一周以上 新手友好度 25/100
MiniMax-AI/cli#260 ·
维护者通常 1 天内回复
相似的 Issue
-
area/dashboard kind/bug QA/dev-automation
难度 2/5 1-3 小时 新手友好度 65/100
rancher/dashboard#19379 · 2 条评论 ·
维护者通常 5 天内回复
-
perf(core): getComments() runs the approved count and the comment list as two sequential queries未关闭area/core bot:bug bot:working
难度 2/5 1-3 小时 新手友好度 76/100
emdash-cms/emdash#3905 · 2 条评论 ·
维护者通常 1 天内回复
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
难度 1/5 1 小时以内 新手友好度 90/100
lingdojo/kana-dojo#31728 · 1 条评论 · 5 个 reaction ·
维护者通常 1 天内回复
-
selective-claw: freshTailTurns=0 keeps ALL turns verbatim and summarizes none (slice(-0) === slice(0))可能已有人在做 @zjncs 今天认领。 未关闭component:tokenless
难度 2/5 1-3 小时 新手友好度 80/100
agentic-os-org/ANOLISA#6112 · 1 条评论 ·
维护者通常 1 天内回复
-
bug needs triage
难度 2/5 1-3 小时 新手友好度 75/100
rjsf-team/react-jsonschema-form#5439 ·
维护者通常 1 天内回复