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>
This commit is contained in:
fmq
2026-06-08 14:54:53 +08:00
co-authored by Claude Opus 4.8
parent 0dfe6facd6
commit e2c1a4580a
350 changed files with 10935 additions and 2704 deletions
+72 -38
View File
@@ -1,65 +1,99 @@
#!/bin/bash
# --- 配置变量 ---
WORK_DIR="/home/fmq/program/SpectraRust"
CMD_PATH="/home/fmq/.claude/local/claude"
CMD_ARGS="--permission-mode bypassPermissions --print '/codegraph-guide 继续执行重构任务。禁止询问,禁止总结报告,禁止跳过复杂模块。'"
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
# --- 新增:检查是否已有 claude 进程在运行 ---
echo "正在检查是否有 claude 进程在运行..."
# 使用 ps aux 列出所有进程,然后 grep 查找 'claude',再用 grep -v grep 排除掉 grep 命令本身
if ps aux | grep '[c]laude' > /dev/null; then
echo "⚠️ 检测到 claude 进程已在运行,退出脚本。"
# 可选:显示正在运行的进程信息
ps aux | grep '[c]laude'
# --- 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
# --- 2. 启动进程 ---
# 切换到工作目录
# --- 5. 启动进程 ---
cd "$WORK_DIR" || exit 1
# 执行命令
# nohup 保证退出终端后进程不挂
# < /dev/null 防止进程读取终端输入导致挂起
# > "$LOG_FILE" 2>&1 将标准输出和错误输出都重定向到日志文件
nohup "$CMD_PATH" $CMD_ARGS < /dev/null > "$LOG_FILE" 2>&1 &
nohup "$CMD_PATH" --permission-mode bypassPermissions --print "$CMD_PROMPT" \
< /dev/null > "$LOG_FILE" 2>&1 &
CURRENT_PID=$!
# --- 3. 验证启动结果 ---
# 短暂休眠,给进程一点初始化时间,以便捕获即时崩溃(如缺少动态库)
sleep 0.5
# --- 6. 等待完成并分析结果 ---
# --print 模式是同步的,wait 等它结束
wait "$CURRENT_PID" 2>/dev/null
EXIT_CODE=$?
# 检查进程是否仍然存活
if kill -0 "$CURRENT_PID" 2>/dev/null; then
echo "启动成功!"
echo "PID: $CURRENT_PID"
echo "日志路径: $LOG_FILE"
exit 0
else
echo "❌ 启动失败! 进程已意外退出。"
echo "--- 错误日志预览 ---"
# 如果日志文件存在,打印其内容
if [ -f "$LOG_FILE" ]; then
cat "$LOG_FILE"
else
echo "(无日志文件生成)"
# --- 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
exit 1
# 检测模型不存在错误
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