SpectraRust/scripts/specf2r.sh
fmq e2c1a4580a feat: F2R 重构全部完成 + 自动化脚本改进
Phase 1 翻译 (完成):
- TLUSTY 350 函数 100% 翻译
- SYNSPEC 168 函数 100% 翻译
- ~495 Rust 模块

Phase 2 集成 (完成):
- TLUSTY RESOLV 7 个 TODO 全部清除
- TLUSTY Runner IJALI 频率选择实现
- OPFRAC ioniz.dat 解析完整实现
- SYNSPEC Runner 编排流程连接完成
- SYNSPEC RESOLV OPAC→RTE→OUTPRI 调用链完整

Phase 3 验证 (完成, 修复 8 处 bug):
- INITIA: compute_hydrogen_level_bounds 索引混合修复
- INILIN: GAMR0/GS0/GW0 展宽公式修复, 经典 VdW 公式修复
- INIBL0: CNM 常数 2.997925e18→e17 修复
- OPAC: Lyman IJ=2 修正缺失修复
- RTE: minv3 矩阵求逆符号错误修复

自动化脚本改进:
- specf2r.sh: 添加 429 限流退避、完成检测、同步等待
- SKILL.md: 三阶段工作流 + 状态文件系统
- references/: Phase 1/2/3 独立参考文档

新增:
- src/bin/synspec.rs: SYNSPEC 可执行文件入口
- .f2r_phase/.f2r_tasks/.f2r_complete: 状态管理文件

编译: 0 错误 | Clippy: 0 错误 | 测试: voigt 28 + eldens 5 通过

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 14:54:53 +08:00

100 lines
3.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# --- 配置变量 ---
WORK_DIR="/home/dckj/SpectraRust"
CMD_PATH="/usr/bin/claude"
CMD_PROMPT="使用 codegraph-guide skill 继续执行重构任务。"
# 状态文件
PHASE_FILE="${WORK_DIR}/.f2r_phase"
COMPLETE_FILE="${WORK_DIR}/.f2r_complete"
RATE_LIMIT_FILE="${WORK_DIR}/.f2r_rate_limit"
TASKS_FILE="${WORK_DIR}/.f2r_tasks"
# 日志文件路径
LOG_FILE="${WORK_DIR}/logs/claude_$(date +%Y%m%d_%H%M%S).log"
# --- 1. 环境检查 ---
if [ ! -d "$WORK_DIR" ]; then
echo "❌ 错误: 工作目录不存在: $WORK_DIR"
exit 1
fi
if [ ! -x "$CMD_PATH" ]; then
echo "❌ 错误: 命令不存在或不可执行: $CMD_PATH"
exit 1
fi
# --- 2. 完成检测 ---
if [ -f "$COMPLETE_FILE" ]; then
echo "✅ 重构已标记为完成 ($(cat "$COMPLETE_FILE")),跳过。"
echo "如需重新启动,请删除 ${COMPLETE_FILE}"
exit 0
fi
# --- 3. 429 限流退避 ---
if [ -f "$RATE_LIMIT_FILE" ]; then
LIMIT_UNTIL=$(cat "$RATE_LIMIT_FILE" 2>/dev/null)
if [ -n "$LIMIT_UNTIL" ]; then
# 将 "2026-06-08 09:10:18" 格式转换为 epoch
RESET_EPOCH=$(date -d "$LIMIT_UNTIL" +%s 2>/dev/null)
NOW_EPOCH=$(date +%s)
if [ -n "$RESET_EPOCH" ] && [ "$NOW_EPOCH" -lt "$RESET_EPOCH" ]; then
REMAINING=$(( (RESET_EPOCH - NOW_EPOCH) / 60 ))
echo "⏳ API 限流中,还需等待 ${REMAINING} 分钟(重置于 ${LIMIT_UNTIL}),跳过。"
exit 0
else
# 已过重置时间,清除标记
rm -f "$RATE_LIMIT_FILE"
echo "🔓 限流已重置,继续执行。"
fi
fi
fi
# --- 4. 检查并发进程 ---
RUNNING_PIDS=$(pgrep -f "claude.*--print" 2>/dev/null)
if [ -n "$RUNNING_PIDS" ]; then
echo "⚠️ 检测到已有调度任务在运行 (PID: $RUNNING_PIDS),退出脚本。"
exit 1
fi
# --- 5. 启动进程 ---
cd "$WORK_DIR" || exit 1
nohup "$CMD_PATH" --permission-mode bypassPermissions --print "$CMD_PROMPT" \
< /dev/null > "$LOG_FILE" 2>&1 &
CURRENT_PID=$!
# --- 6. 等待完成并分析结果 ---
# --print 模式是同步的wait 等它结束
wait "$CURRENT_PID" 2>/dev/null
EXIT_CODE=$?
# --- 7. 后处理:检测 429 和完成标记 ---
if [ -f "$LOG_FILE" ]; then
# 检测 429 限流
if grep -q "429" "$LOG_FILE" 2>/dev/null; then
# 提取重置时间(格式:已达到 5 小时的使用上限。您的限额将在 2026-06-08 09:10:18 重置)
RESET_TIME=$(grep -oP '限额将在 \K[\d-]+ [\d:]+' "$LOG_FILE" 2>/dev/null | head -1)
if [ -n "$RESET_TIME" ]; then
echo "$RESET_TIME" > "$RATE_LIMIT_FILE"
echo "🔴 检测到 429 限流,重置时间: ${RESET_TIME},已记录到 ${RATE_LIMIT_FILE}"
fi
fi
# 检测模型不存在错误
if grep -q "模型不存在" "$LOG_FILE" 2>/dev/null; then
echo "❌ 模型不存在错误,暂停 30 分钟。"
echo "$(date -d '+30 minutes' '+%Y-%m-%d %H:%M:%S')" > "$RATE_LIMIT_FILE"
fi
# 统计日志大小用于诊断
LOG_SIZE=$(wc -c < "$LOG_FILE")
echo "✅ 会话完成 | PID: $CURRENT_PID | 退出码: $EXIT_CODE | 日志: ${LOG_SIZE} 字节"
echo " 日志路径: $LOG_FILE"
else
echo "❌ 无日志文件生成"
fi
exit 0