diff --git a/.agents/workflows/sync-upstream.md b/.agents/workflows/sync-upstream.md new file mode 100644 index 00000000..3dbe90ae --- /dev/null +++ b/.agents/workflows/sync-upstream.md @@ -0,0 +1,102 @@ +--- +description: 从上游 (origin/main) 同步更新,保留 Antigravity 自定义改动 +--- + +# 前置检查 + +// turbo +1. 查看当前状态和上游差异 +```bash +cd /Users/win/2025/aitool/MiniGravity/sub2api +git fetch origin +git log --oneline HEAD..origin/main +``` + +如果上游没有新 commits,停止(无需同步)。 + +# 执行同步 + +2. 确保工作区干净 +```bash +git status +``` +如果有未提交的改动,先 `git stash`。 + +// turbo +3. 备份当前自定义 patches +```bash +mkdir -p /tmp/antigravity-patches +git format-patch origin/main..HEAD -o /tmp/antigravity-patches/ +echo "已备份 $(ls /tmp/antigravity-patches/*.patch 2>/dev/null | wc -l) 个 patch 到 /tmp/antigravity-patches/" +``` + +4. 执行 rebase(把自定义 commits 移植到最新 upstream 上) +```bash +git rebase origin/main +``` + +如果有冲突,根据下方"冲突解决指南"处理,然后 `git rebase --continue`。 + +// turbo +5. 编译验证 +```bash +cd /Users/win/2025/aitool/MiniGravity/sub2api/backend && go build ./... +``` + +6. 推送 +```bash +git push origin main --force-with-lease +``` + +--- + +# 冲突解决指南 + +## 高频冲突文件及处理策略 + +### `backend/internal/repository/http_upstream.go` +**我方改动**:在 `Do()` 和 `DoWithTLS()` 中新增了 Node.js TLS 代理路由逻辑。 +**策略**:保留上游对函数签名/连接池的改动,确保我方在函数开头新增的 `isNodeTLSProxyEnabled()` 判断块被保留。 +```bash +# 查看冲突 +git diff backend/internal/repository/http_upstream.go +# 关键:确保以下两个块被保留(来自 ours): +# 1. Do() 中的 Node.js proxy 路由 (~L128-137) +# 2. DoWithTLS() 中的 Node.js proxy 路由 (~L180-187) +# 3. isNodeTLSProxyEnabled() / shouldRouteViaNodeProxy() / doViaNodeTLSProxy() 函数 +``` + +### `backend/internal/config/config.go` +**我方改动**:在 `GatewayConfig` struct 新增了 `NodeTLSProxy`、`InstanceSalt`、`FingerprintDefaults` 三个字段。 +**策略**:上游通常只在 struct 末尾添加新字段,我方也是添加字段,基本不冲突。 +```bash +# 确保以下字段存在于 GatewayConfig struct 中 +grep -n "NodeTLSProxy\|InstanceSalt\|FingerprintDefaults" backend/internal/config/config.go +``` + +### `backend/internal/service/identity_service.go` +**我方改动**: +- 更新了 `defaultFingerprint` 的版本号 +- 新增 `ApplyDefaultFingerprintOverrides()` 函数 +- 新增 `NewIdentityServiceWithSalt()` 函数 +- 在 `IdentityService` struct 加 `instanceSalt` 字段 +**策略**:上游通常不改 defaultFingerprint,直接 Accept Ours 这部分。 + +### `backend/internal/pkg/claude/constants.go` +**我方改动**:更新 Claude CLI 版本常量(CLI_VERSION / SDK_VERSION)。 +**策略**:直接保留我方版本号(更新的)。 + +### `backend/cmd/server/wire_gen.go` +**我方改动**:可能因 Wire 依赖注入改变。 +**策略**:先接受 Theirs,然后重新运行 `go generate ./cmd/server/` 重新生成。 + +--- + +# 零冲突文件(永远不会冲突) + +以下目录是我方全新添加,upstream 没有,永远不会冲突: +- `tools/node-tls-proxy/` — Node.js TLS 代理 +- `tools/firewall/` — iptables 防火墙规则 +- `tools/sora-curl-cffi-sidecar/` — Sora curl_cffi sidecar +- `deploy/docker-compose.tls-proxy.yml` — TLS 代理 compose +- `deploy/build-push-tls-proxy.sh` — 构建推送脚本 diff --git a/tools/maintenance/save-patches.sh b/tools/maintenance/save-patches.sh new file mode 100755 index 00000000..ba861d44 --- /dev/null +++ b/tools/maintenance/save-patches.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# save-patches.sh — 将 Antigravity 自定义改动导出为 patch 文件 +# 用法: ./tools/scripts/save-patches.sh [输出目录] +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +OUTPUT_DIR="${1:-$REPO_ROOT/tools/patches}" +UPSTREAM="origin/main" + +cd "$REPO_ROOT" + +# 检查是否有新的 upstream commits +DIVERGED=$(git log --oneline "$UPSTREAM"..HEAD 2>/dev/null | wc -l | tr -d ' ') +if [ "$DIVERGED" -eq 0 ]; then + echo "[save-patches] 没有领先 upstream 的 commits,无需保存。" + exit 0 +fi + +mkdir -p "$OUTPUT_DIR" + +# 导出 patches +git format-patch "$UPSTREAM"..HEAD --output-directory "$OUTPUT_DIR" --no-stat + +COUNT=$(ls "$OUTPUT_DIR"/*.patch 2>/dev/null | wc -l | tr -d ' ') +echo "[save-patches] ✅ 已导出 $COUNT 个 patch 到 $OUTPUT_DIR/" +echo "" +echo "恢复方法(在全新 upstream checkout 上):" +echo " git am $OUTPUT_DIR/*.patch" +echo " # 或逐一应用:" +echo " for p in $OUTPUT_DIR/*.patch; do git am \"\$p\" || git am --skip; done" diff --git a/tools/maintenance/sync-upstream.sh b/tools/maintenance/sync-upstream.sh new file mode 100755 index 00000000..dfc58133 --- /dev/null +++ b/tools/maintenance/sync-upstream.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +# sync-upstream.sh — 从 upstream (origin/main) 同步更新,保留自定义改动 +# 用法: ./tools/scripts/sync-upstream.sh +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +UPSTREAM="origin/main" + +cd "$REPO_ROOT" + +echo "========================================" +echo " Antigravity Fork — Upstream Sync Tool" +echo "========================================" +echo "" + +# Step 1: 检查工作区 +if ! git diff --quiet || ! git diff --staged --quiet; then + echo "❌ 工作区有未提交的改动,请先 git stash 或 git commit" + git status --short + exit 1 +fi + +# Step 2: Fetch +echo "[1/4] Fetching upstream..." +git fetch origin + +# Step 3: 检查是否有新 commits +NEW=$(git log --oneline HEAD.."$UPSTREAM" 2>/dev/null | wc -l | tr -d ' ') +if [ "$NEW" -eq 0 ]; then + echo "✅ 已是最新,无需同步。" + exit 0 +fi + +echo "" +echo "上游有 $NEW 个新 commits:" +git log --oneline HEAD.."$UPSTREAM" +echo "" + +# Step 4: 备份当前 patches +PATCH_DIR="/tmp/antigravity-patches-$(date +%Y%m%d-%H%M%S)" +echo "[2/4] 备份自定义 patches 到 $PATCH_DIR ..." +mkdir -p "$PATCH_DIR" +git format-patch "$UPSTREAM"..HEAD -o "$PATCH_DIR/" --no-stat +BACKED=$(ls "$PATCH_DIR"/*.patch 2>/dev/null | wc -l | tr -d ' ') +echo " 已备份 $BACKED 个 patch" + +# Step 5: Rebase +echo "" +echo "[3/4] 执行 rebase (git rebase $UPSTREAM)..." +echo " 如果出现冲突,请参考 .agents/workflows/sync-upstream.md 中的冲突解决指南" +echo "" +if ! git rebase "$UPSTREAM"; then + echo "" + echo "❌ Rebase 出现冲突!" + echo "" + echo "请按以下步骤处理:" + echo " 1. 查看冲突文件: git diff --name-only --diff-filter=U" + echo " 2. 解决冲突(参考 .agents/workflows/sync-upstream.md)" + echo " 3. git add <解决的文件>" + echo " 4. git rebase --continue" + echo "" + echo "备份的 patches 在: $PATCH_DIR" + exit 1 +fi + +# Step 6: 编译验证 +echo "[4/4] 编译验证..." +if ! (cd "$REPO_ROOT/backend" && go build ./... 2>&1); then + echo "" + echo "❌ 编译失败!rebase 后有破坏性改动需要修复。" + echo "备份的 patches 在: $PATCH_DIR" + exit 1 +fi + +echo "" +echo "✅ 同步完成!" +echo "" +echo "自定义改动(我方 commits)已成功移植到最新 upstream 上。" +echo "请运行以下命令推送:" +echo " git push origin main --force-with-lease" +echo "" +echo "备份路径(可删除): $PATCH_DIR"