llvm-toolchain 的存在性检测成功后,Forge 没有获得实际 LLVM 版本:Windows 将 where 输出的文件路径列表填入版本字段,Linux 将 dpkg -s 输出的首行 Package: clang 填入版本字段。
llvm-toolchain
where
dpkg -s
Package: clang
2026-09-21 在当前 main 81d0f187faf6b33718c7f2e45de1492efa764364(项目版本 1.1.0)确认;最早引入版本未追溯。影响 status 及 install 预检查的版本展示,用户无法据此确认安装的是哪个 LLVM 版本。
81d0f187faf6b33718c7f2e45de1492efa764364
status
install
本次使用隔离的可控替身验证检测链路:替身 clang --version / llvm-config --version 输出 18.1.8;未安装真实 LLVM,不将此结果表述为真实 LLVM 安装失败。两个平台均返回 installed=true,命令退出码均为 0。
clang --version
llvm-config --version
以下 Linux 最小复现只模拟工具和包查询输出,不修改系统包或用户配置。FORGE 替换为上述提交编译出的二进制路径。
FORGE
FORGE=/absolute/path/to/bot-forge root=$(mktemp -d) mkdir -p "$root/bin" "$root/home" cat > "$root/bin/dpkg" <<'SH' #!/bin/sh [ "$1" = "-s" ] || exit 2 shift for pkg in "$@"; do printf 'Package: %s\nStatus: install ok installed\nVersion: 18.1.8\n\n' "$pkg" done SH cat > "$root/bin/clang" <<'SH' #!/bin/sh printf 'clang version 18.1.8\n' SH cat > "$root/bin/llvm-config" <<'SH' #!/bin/sh printf '18.1.8\n' SH chmod +x "$root/bin/dpkg" "$root/bin/clang" "$root/bin/llvm-config" cat > "$root/probe.toml" <<'TOML' catalog = "rust-dev" [profiles.llvm-test] components = ["llvm-toolchain"] TOML "$root/bin/clang" --version "$root/bin/llvm-config" --version env PATH="$root/bin:$PATH" HOME="$root/home" BOT_FORGE_HOME="$root/forge" \ "$FORGE" status llvm-test --config "$root/probe.toml" --format json echo "Exit: $?" env PATH="$root/bin:$PATH" HOME="$root/home" BOT_FORGE_HOME="$root/forge" \ "$FORGE" install llvm-test --config "$root/probe.toml" echo "Exit: $?"
Windows 对照:在隔离 PATH 下提供 clang.exe、llvm-nm.exe、llvm-config.exe 以及用于存在性检查的 libclang.dll 占位文件;三个 exe 为可控替身,版本查询输出 18.1.8。保持内置 Windows 检测配置不变,通过系统 where.exe 进行真实路径查询,再执行同样的 status / install 命令。没有运行 winget 或真实 DLL。
clang.exe
llvm-nm.exe
llvm-config.exe
libclang.dll
where.exe
存在性检查通过后,版本字段应包含实际查询得到的 LLVM 版本(本用例为 18.1.8)。如果配置仅提供存在性检查、无法确定版本,应明确显示版本未知,而不是把路径或包描述当作版本。
Linux 基线和 Forge 输出:
$ clang --version clang version 18.1.8 $ llvm-config --version 18.1.8 status --format json 中的工具对象: { "name": "llvm-toolchain", "installed": true, "version": "Package: clang", "required_version": null, "outdated": false, "installable": true } Exit: 0
Windows 的对应字段(路径以 <TEST_ROOT> 代替):
"installed": true "version": "<TEST_ROOT>\\bin\\clang.exe; <TEST_ROOT>\\bin\\llvm-nm.exe; <TEST_ROOT>\\bin\\llvm-config.exe; <TEST_ROOT>\\bin\\libclang.dll" "required_version": null "outdated": false Exit: 0
两平台安装预检查也显示相同的路径/包描述,并正常跳过已安装组件,退出 0;没有发生安装动作。
代码依据:内置 catalog 的 Linux 检测是 dpkg -s clang llvm libclang-dev binutils;Windows 是四次 where 查询,没有读取版本的命令。src/execution/install.rs 的 run_typed_check 保留各命令首行,tool_status_from_detection 再将该结果用作 version。因此 dpkg 后面的 Version 字段未参与版本展示,Windows 的结果则始终是路径。建议保留必要的存在性检查,另外通过版本命令获取版本,并将路径与版本分开表达。
dpkg -s clang llvm libclang-dev binutils
src/execution/install.rs
run_typed_check
tool_status_from_detection
本 issue 不声称默认配置存在版本升级判定错误:内置 llvm-toolchain 没有配置 required_version,本次也未将自定义版本约束场景作为证据。
问题概述
llvm-toolchain的存在性检测成功后,Forge 没有获得实际 LLVM 版本:Windows 将where输出的文件路径列表填入版本字段,Linux 将dpkg -s输出的首行Package: clang填入版本字段。2026-09-21 在当前 main
81d0f187faf6b33718c7f2e45de1492efa764364(项目版本 1.1.0)确认;最早引入版本未追溯。影响status及install预检查的版本展示,用户无法据此确认安装的是哪个 LLVM 版本。本次使用隔离的可控替身验证检测链路:替身
clang --version/llvm-config --version输出 18.1.8;未安装真实 LLVM,不将此结果表述为真实 LLVM 安装失败。两个平台均返回 installed=true,命令退出码均为 0。影响范围
复现步骤
以下 Linux 最小复现只模拟工具和包查询输出,不修改系统包或用户配置。
FORGE替换为上述提交编译出的二进制路径。FORGE=/absolute/path/to/bot-forge root=$(mktemp -d) mkdir -p "$root/bin" "$root/home" cat > "$root/bin/dpkg" <<'SH' #!/bin/sh [ "$1" = "-s" ] || exit 2 shift for pkg in "$@"; do printf 'Package: %s\nStatus: install ok installed\nVersion: 18.1.8\n\n' "$pkg" done SH cat > "$root/bin/clang" <<'SH' #!/bin/sh printf 'clang version 18.1.8\n' SH cat > "$root/bin/llvm-config" <<'SH' #!/bin/sh printf '18.1.8\n' SH chmod +x "$root/bin/dpkg" "$root/bin/clang" "$root/bin/llvm-config" cat > "$root/probe.toml" <<'TOML' catalog = "rust-dev" [profiles.llvm-test] components = ["llvm-toolchain"] TOML "$root/bin/clang" --version "$root/bin/llvm-config" --version env PATH="$root/bin:$PATH" HOME="$root/home" BOT_FORGE_HOME="$root/forge" \ "$FORGE" status llvm-test --config "$root/probe.toml" --format json echo "Exit: $?" env PATH="$root/bin:$PATH" HOME="$root/home" BOT_FORGE_HOME="$root/forge" \ "$FORGE" install llvm-test --config "$root/probe.toml" echo "Exit: $?"Windows 对照:在隔离 PATH 下提供
clang.exe、llvm-nm.exe、llvm-config.exe以及用于存在性检查的libclang.dll占位文件;三个 exe 为可控替身,版本查询输出 18.1.8。保持内置 Windows 检测配置不变,通过系统where.exe进行真实路径查询,再执行同样的status/install命令。没有运行 winget 或真实 DLL。预期结果
存在性检查通过后,版本字段应包含实际查询得到的 LLVM 版本(本用例为 18.1.8)。如果配置仅提供存在性检查、无法确定版本,应明确显示版本未知,而不是把路径或包描述当作版本。
实际结果
Linux 基线和 Forge 输出:
Windows 的对应字段(路径以 <TEST_ROOT> 代替):
两平台安装预检查也显示相同的路径/包描述,并正常跳过已安装组件,退出 0;没有发生安装动作。
代码依据:内置 catalog 的 Linux 检测是
dpkg -s clang llvm libclang-dev binutils;Windows 是四次where查询,没有读取版本的命令。src/execution/install.rs的run_typed_check保留各命令首行,tool_status_from_detection再将该结果用作 version。因此 dpkg 后面的 Version 字段未参与版本展示,Windows 的结果则始终是路径。建议保留必要的存在性检查,另外通过版本命令获取版本,并将路径与版本分开表达。本 issue 不声称默认配置存在版本升级判定错误:内置 llvm-toolchain 没有配置 required_version,本次也未将自定义版本约束场景作为证据。
运行环境与供应信息
安全、性能与恢复证据
附件与提交确认