---
name: sync-air-cargo
description: 将 aerologic-app 项目中未提交的变更（已修改、新增、已删除、包括未跟踪的文件）以文件级 cp/rm 方式同步到同级目录下的 air-cargo 项目——两者是同一份源码的两个独立 git 仓库副本，分别推送到不同的远程地址。只做文件复制/删除，不对内容做任何二次编辑或转换。每当用户提到"同步到 air-cargo"、"同步到另一个仓库/项目"、"推送/复制到 cargo 项目"、"两个项目要保持一致"，或者在 aerologic-app 里改完代码后问要不要同步/推送到另一个仓库时，应主动使用此 skill，而不是手动逐个 cp 文件。
---

# 同步变更到 air-cargo

## 背景

`aerologic-app` 和同级目录下的 `air-cargo` 是同一份项目源码的两个独立 git 仓库副本，目录结构完全一致，分别推送到不同的远程仓库地址。日常开发只在 `aerologic-app` 中进行，完成后需要把未提交的变更原样同步一份到 `air-cargo`，再由用户在 `air-cargo` 里自行提交、推送。

同步的判定完全基于 `git status`：在 `aerologic-app` 里，工作区中存在的文件（无论是修改、新增还是未跟踪）就复制覆盖到 `air-cargo` 对应路径；工作区中已不存在的文件（即被删除的）就在 `air-cargo` 里删除对应路径。这样天然覆盖了修改/新增/删除/未跟踪/重命名（重命名会被当作"删除旧路径 + 新增新路径"处理）等所有情况，不需要逐个状态码去分支判断。

**只同步工程项目本身的文件**：`CLAUDE.md` 以及 `.claude/` 目录（包括其下的 `skills/`、`commands/`、`settings.local.json`、`mcp.json` 等）属于 Claude Code 的工具配置/记忆，两个仓库各自独立维护，不属于"项目源码"，因此始终排除在同步范围之外，不会被复制也不会被删除。脚本会在输出里单独列出"已忽略，不参与同步"的清单，方便核对。

## 使用方法

脚本位于 `scripts/sync.sh`，用法：

```bash
bash scripts/sync.sh [SOURCE_DIR] [TARGET_DIR] [preview|apply]
```

- `SOURCE_DIR` 默认为当前目录（一般就是 aerologic-app 项目根目录）
- `TARGET_DIR` 默认为 `SOURCE_DIR` 同级的 `air-cargo` 目录，一般不需要手动指定
- 第三个参数默认 `preview`（只打印清单，不做任何改动），传 `apply` 才会真正执行复制/删除

### 步骤

1. **先预览**，让用户看到将要发生什么：
   ```bash
   bash /Users/kid/Development/Fusion/Projects/aerologic-app/.claude/skills/sync-air-cargo/scripts/sync.sh
   ```
   输出会分别列出"待复制/覆盖"和"待删除"的文件清单。

2. **用 `AskUserQuestion` 工具向用户确认**，不要只是在文字里问一句让用户打字回复。这是一个会覆盖 `air-cargo` 中已有文件、且删除操作不可逆的操作，必须先把预览清单（待复制、待删除的文件数量和列表）放进问题描述里，让用户能一眼看到影响范围，选项至少包含"确认同步"和"取消"。得到确认后才能继续执行 `apply`（这遵循整体规则：覆盖性/破坏性操作需要用户确认，不要因为 skill 本身能直接跑就跳过确认）。

3. **用户确认后执行同步**：
   ```bash
   bash /Users/kid/Development/Fusion/Projects/aerologic-app/.claude/skills/sync-air-cargo/scripts/sync.sh . /Users/kid/Development/Fusion/Projects/air-cargo apply
   ```
   执行完会输出"复制/更新 N 个文件，删除 M 个文件"的汇总。

4. **同步之后不要自动 commit/push**。脚本只做文件复制，`air-cargo` 那边的 `git add` / `commit` / `push` 由用户自行决定和操作——两个仓库指向不同的远程地址，提交推送这类会影响远程共享状态的操作应始终由用户主导确认。

## 注意事项

- 脚本只识别 git 能感知到的变更（`git status` 看得到的），`.gitignore` 忽略的文件（如构建产物 `build/`、`.gradle/`）不会被同步，这也是符合预期的——不应该把本地构建缓存同步过去。
- 如果 `air-cargo` 里对应路径本身也有未提交的本地修改，会被直接覆盖覆盖掉，预览阶段要留意这一点并提醒用户。
