Files
pangolin/ci/check-codegen-drift.sh
wangjia 3fb645ed40 refactor(signing): 原生侧签名标识符改由 signing.env codegen 生成(单一真相源)
承接 scripts/signing.env(shell 单源):Xcode/Swift 侧的 Team ID/Bundle ID/App Group
等无法 source 变量、只能字面量,故用 codegen 保持单源。

- 新增 scripts/gen-signing.mjs:从 signing.env 读 3 基值,用**结构化正则**(匹配
  `DEVELOPMENT_TEAM = X`/app group 形状等,不含任何旧字面值)回填 16 个原生文件的
  标识符;--check 为 drift 模式。因不含旧值,codegen 自身无痕、未来再迁账号仍生效。
- ci/check-codegen-drift.sh 追加签名 drift 闸(gen-signing.mjs --check)。
- 全量迁到美国身份:Team 44WULXM6SV / 实体 Yanmei AI LLC / Bundle com.yanmeiai.pangolin
  (+.PacketTunnel)/ App Group macOS 原生 44WULXM6SV.com.yanmeiai.pangolin、iOS
  group.com.yanmeiai.pangolin。清理注释/ORGANIZATIONNAME 等 Apple 侧残留痕迹。
- CLAUDE.md 同步新身份 + 指向 signing.env 单源。

验证:plutil lint 6 份 entitlements/plist 全 OK;macOS/iOS pbxproj `xcodebuild -list`
可解析、Runner build settings 解析为新 Team/Bundle;gen-signing.mjs --check 幂等 0 drift;
完整 codegen drift 闸(token/l10n/proto-i18n/signing)全绿。

注:未动 Android 包名 com.pangolin.pangolin_vpn(Play 身份、自签、非 Apple 账号痕迹,
改动影响大另议)与 Windows/桌面少量元数据串。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEVUXAbFT6bF1Qw27RHWoD
2026-09-06 20:14:30 +08:00

68 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# check-codegen-drift.sh — codegen 漂移检查(支柱 2:契约单源 / token 单源)。
#
# design/prototype/tokens.css 是唯一 token 真相源,client/lib/pangolin_tokens.gen.dart
# 由 design/codegen/gen_flutter_tokens.mjs 生成、勿手改(CLAUDE.md 铁律)。本检查重新
# 生成一遍,若生成物与已提交版本不一致 → 漂移:要么改了 CSS 没重生成,要么手改了
# 生成物。两者都会让"单源"失效、契约悄悄分叉。
#
# 依赖: node(零依赖纯脚本) + git。CI 在 node:20 镜像内跑(含 git/bash)。
# 发现漂移 → 非零退出码(CI fail)。
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_ROOT"
# docker 内挂载目录 owner 与进程 uid 不一致时 git 会拒绝;本地是 owner 时此行无副作用。
git config --global --add safe.directory "$REPO_ROOT" 2>/dev/null || true
GEN="client/lib/pangolin_tokens.gen.dart"
echo "→ 重新生成 Flutter token (design/codegen/gen_flutter_tokens.mjs) ..."
node design/codegen/gen_flutter_tokens.mjs
if ! git diff --quiet -- "$GEN"; then
echo "❌ codegen 漂移:$GEN 与 design/prototype/tokens.css 不一致。" >&2
echo " 原因:改了 CSS 真相源却没重生成,或手改了生成物(铁律:勿手改 *.gen.dart)。" >&2
echo " 修复:node design/codegen/gen_flutter_tokens.mjs 后提交生成物。" >&2
echo " ── diff(前 40 行)──" >&2
git --no-pager diff -- "$GEN" | head -40 >&2
exit 1
fi
echo "✅ codegen 无漂移:token 生成物与 CSS 真相源一致。"
# ── l10n 单源:design/i18n/strings.json → client/lib/l10n/strings_*.dart ──
# gen 为纯 node 确定性输出(不跑 dart format),故本段与 token 段一样零 dart 依赖。
L10N_GEN="client/lib/l10n"
echo "→ 重新生成 l10n (design/codegen/gen_l10n_dart.mjs) ..."
node design/codegen/gen_l10n_dart.mjs
if ! git diff --quiet -- "$L10N_GEN"/strings_*.dart; then
echo "❌ l10n 漂移:strings_*.dart 与 design/i18n/strings.json 不一致。" >&2
echo " 原因:改了 strings.json 却没重生成,或手改了生成物(勿手改 strings_*.dart)。" >&2
echo " 修复:node design/codegen/gen_l10n_dart.mjs 后提交生成物。" >&2
echo " ── diff(前 40 行)──" >&2
git --no-pager diff -- "$L10N_GEN"/strings_*.dart | head -40 >&2
exit 1
fi
echo "✅ l10n 无漂移:strings_*.dart 与 strings.json 单源一致。"
# ── 原型 i18n 单源:strings.json + alias + overlay → 两份 HTML 的 I18N 块 ──
# --check 只比对 marker 块(unrelated HTML 编辑不误报);再跑 key resolution 验收。
echo "→ 校验原型 I18N 块 (design/codegen/gen_proto_i18n.mjs --check) ..."
if ! node design/codegen/gen_proto_i18n.mjs --check; then
echo "❌ 原型 I18N 漂移:改了 strings.json/alias/overlay 却没重生成原型块。" >&2
echo " 修复:node design/codegen/gen_proto_i18n.mjs 后提交。" >&2
exit 1
fi
echo "→ 校验原型 data-i18n key 全 resolve (check-proto-i18n.mjs) ..."
node design/prototype/tools/check-proto-i18n.mjs
echo "✅ 原型 i18n 无漂移:I18N 块与单源一致、data-i18n 全 resolve。"
# ── 签名身份单源:scripts/signing.env → 原生文件字面量(pbxproj/entitlements/plist/swift) ──
# 迁账号/改 Bundle ID 只改 signing.env,跑 gen-signing.mjs 回填;此闸防「改了 env 没重生成」
# 或「手改了原生里的 Team/Bundle/App Group」导致签名标识符与单源分叉。
echo "→ 校验签名标识符与 scripts/signing.env 一致 (scripts/gen-signing.mjs --check) ..."
node scripts/gen-signing.mjs --check
echo "✅ 签名标识符无漂移:原生字面量与 signing.env 单源一致。"