# GoldAutoTrade 打包提示词 — 每次构建前使用

> 将此提示词全文发送给 AI 助手，确保打包完整无遗漏。
> 每次代码变更后、构建前运行。

---

## 任务：执行 GoldAutoTrade 完整打包

### 第一步：预检 — 运行完整性验证脚本

```bash
python scripts/verify_build_parity.py
```

预期输出：`RESULT: PASS`

如果 FAIL，逐项修复：
- `MISSING: src.xxx` → 在 `build_backend_windows.spec` 的 `hiddenimports` 中追加 `'src.xxx'`
- `MISSING: config/xxx.json` → 检查文件是否在 `config/` 目录（`bundle_config_dir` 已整体打包 `config/`）
- `datas source not found` → 文件路径错误或已删除，修正或移除

### 第二步：新增模块扫描 — 识别本次变更中新增的 Python 模块

检查以下目录中是否有**本次新增的 .py 文件**（文件名不在上一次打包的 spec 中）：

| 检查目录 | 如果新增 | 操作 |
|---------|---------|------|
| `src/learning/` | 新 .py 文件 | 追加 `'src.learning.新模块名'` 到 hiddenimports |
| `src/` (根) | 新 .py 文件 | 追加 `'src.新模块名'` 到 hiddenimports |
| `bridge/` | 新 .py 文件 | 检查是否在 try/except 中被导入 → 如果是，追加到 hiddenimports |
| 项目根目录 | 新 .py 文件（如 `skill_trading_memory.py`） | 检查是否被其他模块在 try/except 中导入 → 如果是，追加到 hiddenimports |
| `config/` | 新 .json 文件 | 无需操作（`bundle_config_dir` 整体打包） |
| `data/` | 新运行时数据文件 | 如果打包时需要预置，追加到 datas |
| `strategies/` | 新 .py + .manifest.json | 无需操作（`strategies/` 整体打包） |

**关键判断规则**：
- `src/`、`bridge/`、`signal_generators/`、`strategies/` 等目录通过 `datas` 整体捆绑 → 目录下的 .py 文件会自动包含
- 但如果在 **try/except** 内被导入，PyInstaller 无法检测 → 必须追加到 `hiddenimports`
- 项目根目录的 .py 文件（不在捆绑目录内）如果在 try/except 内被导入 → 必须追加到 `hiddenimports`

### 第三步：配置文件检查

确认以下文件存在于项目中且会被打包：

| 文件 | 打包方式 | 验证 |
|------|---------|------|
| `app_config.json` | datas 声明 + 首次运行自动复制 | `grep app_config.json build_backend_windows.spec` |
| `config/` (全部 .json) | `bundle_config_dir` → 过滤敏感文件 → 整体打包 | `ls config/*.json` |
| `VERSION` | datas 声明 | `grep VERSION build_backend_windows.spec` |
| `config_manager.py` | 入口 `gui_backend.py` 自动发现 | 无需操作 |
| `frozen_path.py` | hiddenimports 声明 | `grep frozen_path build_backend_windows.spec` |

### 第四步：执行打包

```bash
# Windows 打包
pyinstaller build_backend_windows.spec --clean --noconfirm

# 验证输出
ls dist/GoldAutoTrade/GoldAutoTradeEngine.exe
ls dist/GoldAutoTrade/src/learning/trading_brain.py
ls dist/GoldAutoTrade/config/risk_governor_rules.json
ls dist/GoldAutoTrade/app_config.json
```

### 第五步：打包后验证

```bash
# 1. 结构完整性
python -c "
import os
required = [
    'dist/GoldAutoTrade/src/learning/trading_brain.py',
    'dist/GoldAutoTrade/src/learning/feature_extractor.py',
    'dist/GoldAutoTrade/src/learning/pattern_miner.py',
    'dist/GoldAutoTrade/src/learning/lesson_learner.py',
    'dist/GoldAutoTrade/src/learning/brain_scheduler.py',
    'dist/GoldAutoTrade/src/learning/dashboard.py',
    'dist/GoldAutoTrade/src/kelly_sizer.py',
    'dist/GoldAutoTrade/src/strategy_reflector.py',
    'dist/GoldAutoTrade/config/risk_governor_rules.json',
    'dist/GoldAutoTrade/config/strategy_rules_v3.json',
    'dist/GoldAutoTrade/config/personas/ai_strategy_developer.json',
    'dist/GoldAutoTrade/app_config.json',
    'dist/GoldAutoTrade/VERSION',
    'dist/GoldAutoTrade/GoldAutoTradeEngine.exe',
]
for f in required:
    status = 'OK' if os.path.exists(f) else 'MISSING'
    print(f'  [{status}] {f}')
"

# 2. 运行测试
python -m pytest tests/ -q --ignore=tests/test_runtime_health_dashboard.py
```

### 验收标准

- [ ] `verify_build_parity.py` 返回 PASS
- [ ] `pyinstaller` 构建无错误退出
- [ ] 打包产物中所有 required 文件存在
- [ ] 所有测试通过
- [ ] `dist/GoldAutoTrade/` 目录结构完整

---

## 常见遗漏模式（防漂移）

| 遗漏模式 | 原因 | 预防 |
|---------|------|------|
| 新增 `src/learning/xxx.py` 但忘了 hiddenimports | 新模块在 try/except 中导入 | 第二步扫描 |
| 新增根目录 .py 被 try/except 导入 | PyInstaller 不分析根目录 | 第二步扫描 |
| `app_config.json` 未打包 | 不在任何 datas 目录内 | 第三步检查 |
| config_manager 首次运行不复制新文件 | frozen 模式逻辑未更新 | 第三步检查 |
| `data/` 下新增目录未创建 | 子目录不在 `_sub` 列表中 | 检查 config_manager `get_app_dir()` 的 `_sub` 列表 |

---

## AI 助手执行指南

收到此提示词后，逐步骤执行：

### 阶段一：预检与构建（缓存安全）

```bash
# 1. 强制清理所有缓存
taskkill /F /IM GoldAutoTradeEngine.exe
cd e:/gold_autotrade_source

# 清理 Python 字节码缓存
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
find . -name "*.pyc" -delete 2>/dev/null

# 清理 PyInstaller 临时目录
rm -rf %TEMP%/_MEI* 2>/dev/null
rm -rf %LOCALAPPDATA%/pyinstaller 2>/dev/null

# 清理构建缓存
rm -rf build

# 2. 使用缓存安全脚本构建（推荐）
python scripts/clean_build.py --distpath dist_vN

# 或手动 PyInstaller（确保 --clean 标志）
python -m PyInstaller build_backend_windows.spec --clean --noconfirm --distpath dist_vN
```

> ⚠️ **关键**: 必须清理 `__pycache__` 和 `%TEMP%/_MEI*` 目录。PyInstaller 会缓存已编译的 `.pyc` 文件，源码修改后如果不清理缓存，EXE 可能包含旧代码。`scripts/clean_build.py` 自动执行所有清理步骤并验证构建时效性。

### 阶段二：复制用户文件到 dist + 本地验证

```bash
# 复制用户必需文件到 dist 根目录
cp README.txt dist_vN/GoldAutoTrade/
cp bridge/GoldAutoTradeBridgeEA.mq5 dist_vN/GoldAutoTrade/
cp 启动.bat dist_vN/GoldAutoTrade/

# 本地验证（必须通过才能继续）
start "" "e:\gold_autotrade_source\dist_vN\GoldAutoTrade\GoldAutoTradeEngine.exe"
sleep 90
netstat -ano | grep 18790 | grep LISTENING || (echo "FAIL: port not listening" && exit 1)
curl -s -o NUL -w "HTTP: %{http_code}\n" http://127.0.0.1:18790/api/status | grep 200 || (echo "FAIL: API not 200" && exit 1)
echo "Local verification PASSED"
taskkill /F /IM GoldAutoTradeEngine.exe
```

### 阶段三：打包 ZIP + 计算 SHA256

```bash
cd e:/gold_autotrade_source
python -c "
import zipfile, os, hashlib
with zipfile.ZipFile('dist_vN/GoldAutoTrade_Release.zip','w',zipfile.ZIP_DEFLATED) as zf:
    for r,d,files in os.walk('dist_vN/GoldAutoTrade'):
        for fn in files:
            fp=os.path.join(r,fn); zf.write(fp,os.path.relpath(fp,'dist_vN'))
h=hashlib.sha256()
with open('dist_vN/GoldAutoTrade_Release.zip','rb') as f:
    while c:=f.read(65536): h.update(c)
print(f'SHA256: {h.hexdigest().upper()}')
print(f'Size: {os.path.getsize(\"dist_vN/GoldAutoTrade_Release.zip\")} bytes')
"
```

### 阶段四：上传到服务器

```bash
scp -i ~/.ssh/traed.pem -o StrictHostKeyChecking=no \
  e:/gold_autotrade_source/dist_vN/GoldAutoTrade_Release.zip \
  root@43.167.210.121:/var/www/goldauto.top/download/
```

### 阶段五：服务器部署（替换文件 + 更新 manifest + 清理）

```bash
ssh -i ~/.ssh/traed.pem root@43.167.210.121 '
FINAL="GoldAutoTrade-Trial-v1.0.14-Windows-x64.zip"
cp /var/www/goldauto.top/download/GoldAutoTrade_Release.zip "/var/www/goldauto.top/download/$FINAL"
cp /var/www/goldauto.top/download/GoldAutoTrade_Release.zip "/root/license_server/releases/$FINAL"

S=$(stat -c%s "/var/www/goldauto.top/download/$FINAL")
H=$(sha256sum "/var/www/goldauto.top/download/$FINAL" | cut -d" " -f1 | tr "[:lower:]" "[:upper:]")
echo "Deployed: $FINAL  Size: $S  SHA256: $H"

python3 -c "
import json
m=json.loads(open(\"/root/license_server/update_manifest.json\").read())
w=m[\"packages\"][\"trial\"][\"windows\"]
w[\"size\"]=$S
w[\"sha256\"]=\"$H\"
w[\"filename\"]=\"$FINAL\"
w[\"url\"]=\"/download/$FINAL\"
m[\"release_date\"]=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
m[\"packages\"][\"trial\"][\"release_date\"]=m[\"release_date\"]
open(\"/root/license_server/update_manifest.json\",\"w\").write(json.dumps(m,indent=2,ensure_ascii=False))
print(\"Manifest updated\")
"

# 清理临时上传文件
rm -f /var/www/goldauto.top/download/GoldAutoTrade_Release.zip
'
```

### 阶段六：同步部署本地运行

```bash
# 启动新版本
start "" "e:\gold_autotrade_source\dist_vN\GoldAutoTrade\GoldAutoTradeEngine.exe"

# 等待启动（90-120秒初始化）
sleep 90

# 验证
netstat -ano | grep 18790 | grep LISTENING
curl -s -o NUL -w "HTTP: %{http_code}\n" http://127.0.0.1:18790/api/status
```

### 阶段七：验证下载链接

```bash
curl -sIL "https://goldauto.top/download/GoldAutoTrade-Trial-v1.0.14-Windows-x64.zip" \
  | grep -E "HTTP|Content-Length"
```

### 阶段八：清理旧构建目录

```bash
# 保留当前 dist_vN，删除所有旧 dist_v* 目录
ls -d e:/gold_autotrade_source/dist_v* 2>/dev/null | grep -v dist_vN | xargs rm -rf
```

### 验收标准

- [ ] PyInstaller 构建无错误
- [ ] ZIP 生成成功，SHA256 已记录
- [ ] SCP 上传成功
- [ ] 服务器文件已替换，manifest 已更新
- [ ] 本地新版本启动，端口 18790 LISTENING
- [ ] `/api/status` 返回 200
- [ ] 下载链接 Content-Length 匹配
- [ ] 旧构建目录已清理
