153 lines
4.7 KiB
Bash
153 lines
4.7 KiB
Bash
|
|
#!/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"
|