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>
100 lines
3.2 KiB
Bash
Executable File
100 lines
3.2 KiB
Bash
Executable File
#!/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
|