You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug] scanCommands 误报:手册页/文档/同名目录被当成命令,缺失项被判成 external(实例 just → just.1) #31
Activity
KannaKuron commentedon Oct 16, 2026
感谢这份报告——根因分析、纯函数级复现和影响分层(显示层 / 判定层)都非常到位,已对照
main的src/toolchain.js确认属实:scanCommands的entry.replace(/\.[^./\\]+$/, '')确实会剥掉任意扩展名(make.1/tree.txt/jq.md全部误命中);gdu.d这类目录也参与匹配;classifyToolState在wingetOwned === false时只看hasCommand(if (hasCommand) return 'external'),所以「同名文档挡住安装入口」的判定层影响是真实的。非常欢迎你直接提 PR(含回归用例)。评审时我们会关注这几点,供参考:
{.exe,.cmd,.bat,.com}+ 无扩展名继续命中,这一个改动就能覆盖你报告的全部真实案例(just.1/make.1/tree.txt/jq.md/gdu.d的扩展名都不在白名单里,自动排除);io.readdir的契约是返回string[](不带 isFile 信息),要区分「无扩展名的目录」和「无扩展名的 MSYS 可执行文件」(fzf这种)需要给io加stat/Dirent能力并牵动调用方。建议本 PR 先只做扩展名白名单(纯函数改动、零 io 变更),目录区分留作后续——真正会被漏掉的只有「恰好与工具同名的无扩展名目录」这一种罕见形态;./..:Node 的readdirSync不返回这两项,防御性排除可以加但不强求;fzf)仍命中、字典序just.1<just.exe时首个可执行命中者的路径正确。判定层建议补一条classifyToolState({ hasCommand: false, wingetOwned: false })→missing的联动断言。另外提 PR 时请顺手在 CHANGELOG 加一条(仓库惯例:变更随版本提交)。我们会照常跑完整测试套件 + windows-latest CI 后合并发版。
fix: only executable PATH entries resolve as commands (issue KannaKur…
KannaKuron commentedon Oct 17, 2026
已随 PR #32 合并,并发布 v0.40.4(npmjs / npmmirror 双通道已同步)。
修复要点:
scanCommands新增可执行扩展名白名单{.exe,.cmd,.bat,.com}(无扩展名条目照旧命中,/usr/bin/make一类不受影响),手册页 / 文档 / 同名目录不再以同名词根冒充命令,也不再抢走 first-hit;判定层联动——被同名文档挡路的缺失命令恢复missing⇒ 一键安装入口重新出现。回归锁三层(含你实测的just.1排在just.exe之前的字典序场景)+classifyToolState联动断言;CI ubuntu+windows × Node 22/24 四矩阵绿。再次感谢高质量的「报告+修复」一体交付。升级到 0.40.4 后如果
just一行仍有异常,欢迎直接重开或追加 issue;无扩展名目录 vs MSYS 可执行文件的区分(Dirent)已记录为后续项。