Files
hakorune/tools/parallel-refactor-nyash.sh

153 lines
4.7 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -euo pipefail
# === Nyash特化版並列リファクタリング自動化 ===
# ChatGPT5のアイデアをNyashプロジェクト用にカスタマイズ
# === 設定 ===
TARGET_DIR="${1:-src}"
FILE_GLOB="${2:-'*.rs'}"
JOBS="${JOBS:-4}" # 控えめな並列数
BUILD_CMD="cargo build --release -j32" # Nyash標準ビルド
TEST_CMD="cargo test --lib" # 基本的なユニットテスト
FMT_CMD="cargo fmt" # Rustフォーマッタ
# Codex非同期実行通知機能付き
CODEX_CMD="./tools/codex-async-notify.sh"
# === 準備 ===
WORK_DIR="refactor-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$WORK_DIR"/{plans,logs,results}
cd "$WORK_DIR"
# 対象ファイル列挙(大きいファイル優先)
find "../$TARGET_DIR" -name "$FILE_GLOB" -type f -exec wc -l {} + |
sort -rn |
awk '$1 > 500 {print $2}' > target_files.txt # 500行以上のファイルのみ
echo "🎯 Target files: $(wc -l < target_files.txt)"
echo "📁 Work directory: $WORK_DIR"
# === Phase 1: 並列提案生成Codex利用===
echo "🚀 Phase 1: Generating refactoring proposals..."
# 各ファイルに対してCodexタスクを生成
i=0
while IFS= read -r file; do
((i++))
basename_file=$(basename "$file")
# タスク定義
if [[ "$file" == *"mir/"* ]]; then
# MIR関連は特別扱い
task="Refactor $file to support MIR-13 instruction set. Remove legacy instructions and unify with BoxCall/TypeOp"
elif [[ "$file" == *"vm"* ]]; then
# VM関連
task="Refactor $file: split into smaller modules if >1000 lines, improve readability"
else
# 一般的なリファクタリング
task="Refactor $file: extract functions/modules if >1000 lines, improve maintainability"
fi
# 非同期でCodex実行
echo "[$i] Starting: $basename_file"
$CODEX_CMD "$task" > "logs/codex-$i-$basename_file.log" 2>&1
# タスク記録
echo "$i|$file|$task" >> task_list.txt
# 少し間隔を空けるAPI制限対策
sleep 2
done < target_files.txt
echo "⏳ Waiting for all Codex tasks to complete..."
echo " Monitor: tail -f logs/codex-*.log"
# === Phase 2: 結果収集・検証(手動トリガー)===
cat > apply_results.sh << 'EOF'
#!/bin/bash
# Phase 2: 各提案を検証・適用
echo "🔍 Phase 2: Applying and verifying changes..."
# 現在のブランチを記録
ORIGINAL_BRANCH=$(git branch --show-current)
# 各Codex結果を処理
for log in logs/codex-*.log; do
[[ -e "$log" ]] || continue
# ログから情報抽出
task_id=$(basename "$log" | sed 's/codex-\([0-9]*\)-.*/\1/')
file_info=$(grep "^$task_id|" task_list.txt)
target_file=$(echo "$file_info" | cut -d'|' -f2)
echo "==> Processing: $target_file"
# 新しいブランチ作成
branch_name="refactor/$task_id-$(basename "$target_file" .rs)"
git checkout -b "$branch_name" "$ORIGINAL_BRANCH" 2>/dev/null || {
git checkout "$branch_name"
git reset --hard "$ORIGINAL_BRANCH"
}
# ここで手動で変更を適用する必要がある
echo " ⚠️ Please apply changes from: $log"
echo " Press Enter when done..."
read -r
# フォーマット
cargo fmt -- "$target_file" 2>/dev/null || true
# ビルドテスト
if cargo build --release -j32 >/dev/null 2>&1; then
echo " ✅ Build passed"
# 簡単なテスト
if cargo test --lib --quiet 2>/dev/null; then
echo " ✅ Tests passed"
# コミット
git add -A
git commit -m "refactor: $(basename "$target_file") - reduce complexity and improve structure" \
-m "- Applied MIR-13 instruction set changes" \
-m "- Extracted modules/functions as needed" \
-m "- Maintained API compatibility"
echo " ✅ Committed to branch: $branch_name"
else
echo " ❌ Tests failed - reverting"
git reset --hard
git checkout "$ORIGINAL_BRANCH"
git branch -D "$branch_name" 2>/dev/null
fi
else
echo " ❌ Build failed - reverting"
git reset --hard
git checkout "$ORIGINAL_BRANCH"
git branch -D "$branch_name" 2>/dev/null
fi
done
# 元のブランチに戻る
git checkout "$ORIGINAL_BRANCH"
echo "✅ Phase 2 complete!"
echo "📊 Results:"
git branch --list 'refactor/*' | wc -l | xargs echo " Successful refactors:"
echo " Review with: git branch --list 'refactor/*'"
EOF
chmod +x apply_results.sh
echo ""
echo "✅ Phase 1 complete! Codex tasks submitted."
echo ""
echo "📋 Next steps:"
echo " 1. Wait for Codex notifications in tmux"
echo " 2. Run: ./apply_results.sh"
echo " 3. Review and merge branches"
echo ""
echo "💡 Tips:"
echo " - Check logs: ls -la logs/"
echo " - Monitor tmux: tmux attach -t claude"