---
'@ux-team/tvu-design-system': patch
---

fix(consumer-audit): `audit-product-code` 在 pnpm 布局下静默不跑（假绿）

**影响所有用 pnpm 装本包、并按 `docs/CONSUMER_AUDIT_SETUP.md` / `templates/audit-workflow.yml`
把 `audit-product-code.mjs` 挂上自己 CI 的 consumer。**

该脚本用 `process.argv[1] === fileURLToPath(import.meta.url)` 判断"我是被直接执行还是被
import"。这两个值**解析 symlink 的程度不同**：`argv[1]` 是调用时写的那个路径（不解析），
`import.meta.url` 已经过 realpath。而 pnpm 的 `node_modules/@scope/pkg` **就是一条 symlink**
指向 `node_modules/.pnpm/…` —— 于是模板里教的那条命令

```
node node_modules/@ux-team/tvu-design-system/scripts/audit-product-code.mjs
```

会让 guard 判成"我是被 import 的"，**整条 CLI 不执行、退出码 0、零输出**。

逐字复现（同一棵源码树、同一份真违例）：走 symlink ⇒ `exit 0` / 零输出；绕开 symlink 用
真实路径 ⇒ `exit 1` 并点名 R15。⇒ **那些 CI 一直是绿的，而它一个文件都没扫过。**

修法 = 比较前把两侧各 realpath 一次（原始字符串相等仍走快路径；realpath 抛错时退回 false）。

⚠️ **升级后可能看到下游 CI 由绿转红** —— 那不是本次改动引入的违例，是此前**从未被扫出来的
存量**第一次可见。建议先本地跑一次 `--non-blocking` 看清单。

本次同时给它补上整脚本回归面（`tests/audit-product-code.test.ts`，18 条用例，覆盖三个进程
出口）：注入回旧判据后 **18/18 全红** ⇒ 若当初有这份测试，这个缺陷不会发生。
