fix(deploy-drift): 结论区那行命令跑不起来(node → bash)+ 写明判据 ① 的量纲

两处,都在 `deploy/check-deploy-drift.mjs`:

1. 结论区打印的修复命令是 `node deploy/redeploy-plugin.sh <host>`,
   而它是 **bash** 脚本 —— 照抄的人会拿到
   `SyntaxError: Invalid or unexpected token`(脚本第 2 行 `#` 被当 JS 解析)。
   这个坑的源头就是这一行:pi 在 2026-09-14 那轮部署请求里抄的就是它打印的输出,
   抄错不是阅读问题,是判据自己印错了。改成 `bash …`。

2. 判据 ① 的注释写明它比的是**仓库工作区当前内容**,不是 git HEAD。
   实证(同一天):`plugins/pi-mail-bridge/src/pool.mjs` 里一行未提交的
   `let missingSessionCount = 0;`(模块顶层、无人读)被 17:20 那次
   **从脏工作区做的**快照原样带进了生产,而判据 ① 当时报的是「逐字节一致」——
   工作区与快照确实一致,只是两者都不等于 HEAD。
   判据没错,是量纲只覆盖「仓库→快照」这一跳,覆盖不到「HEAD→工作区」那一跳;
   想连那一跳一起判得单独比 `git diff --stat`。

(那条死代码本身已由 pi 的补丁 A 从工作区删掉,pool.mjs 工作区已回到 HEAD 内容;
下次部署后 `current/src/pool.mjs` 里的它才消失 —— 在此之前判据 ① 会因此报一处
pool.mjs 漂移,那是"待部署",不是新问题。)
This commit is contained in:
2026-09-14 19:24:44 +08:00
parent f0884d03be
commit 5c22daf51b

View File

@ -238,7 +238,15 @@ function checkHost(spec) {
if (!existsSync(repoDir)) return fail('仓库插件目录存在', repoDir), result;
if (!existsSync(linkPath)) return fail('已部署(current 存在)', `未部署:${linkPath}`), result;
// ① 内容:快照 vs 仓库(四个宿主同一套)
// ① 内容:快照 vs **仓库工作区当前内容**(四个宿主同一套)
//
// ★ 比的是工作区**当前**内容,不是 git HEAD —— 仓库脏(未提交的改动)时
// 这条判据照样会绿。实证(2026-09-14):`pool.mjs` 里有一行未提交的
// `let missingSessionCount = 0;`(模块顶层、无人读),被 17:20 那次
// 「从脏工作区做的」快照原样带进了生产,而这条判据当时报的是「逐字节一致」
// —— 工作区与快照确实一致,只是两者都不等于 HEAD。判据没错,是它的**量纲**
// 只覆盖「仓库→快照」这一跳,覆盖不到「HEAD→工作区」那一跳。
// 想连那一跳一起判,得单独比 `git diff --stat`,别指望这一条。
const d = diffTrees(collectFiles(repoDir), collectFiles(linkPath));
const { runtimeDrift, docDrift } = diffSummary(d);
if (runtimeDrift === 0) {
@ -567,7 +575,7 @@ function main() {
for (const c of layout) console.log(` ${c.ok ? '通过' : '失败'} ${c.name}${c.note ? ' — ' + c.note : ''}`);
const stale = results.filter(r => r.stale);
console.log(`\n 结论:${stale.length === 0 ? '四个宿主都在跑当前代码' : `${stale.length} 个宿主需要重新部署/重启`}`);
for (const r of stale) console.log(` ✗ ${r.host}:node deploy/redeploy-plugin.sh ${r.host}`);
for (const r of stale) console.log(` ✗ ${r.host}:bash deploy/redeploy-plugin.sh ${r.host}`);
}
process.exit(results.some(r => r.stale) || layoutBad.length ? 1 : 0);
}