mcpField
R
ru

ru

github.com/dicklesworthstone開発7352 回インストール8 週間前に更新
リポジトリ

ru について

RU は、複数の GitHub リポジトリの同期と AI 支援作業を管理する Bash コマンドラインツールです。並列更新に加え、レビューの調整や未コミット変更のエージェント処理を行います。

主な機能

  1. 01複数リポジトリを並列同期
  2. 02リポジトリの状態を JSON で出力
  3. 03Issue と PR のレビューを計画・適用
  4. 04エージェントで未コミット変更を処理
  5. 05品質チェックとシークレット検査を実行
  6. 06ドライランと再開に対応

活用シーン

  1. 01多数の GitHub リポジトリを最新に保つ
  2. 02エージェントレビュー対象の Issue と PR を優先付け
  3. 03未コミット変更があるリポジトリでコミットを準備
  4. 04JSON で一括処理の結果を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dicklesworthstone/agent_flywheel_clawdbot_skills_and_integrations --skill ru

インストール後、Claude Code で/ruを入力して読み込まれたか確認します。

詳細

RU - Repo Updater

数十から数百もの GitHub リポジトリを同期するための、包括的な Bash CLI です。基本的な同期に加えて、RU には AI 支援によるコードレビューシステムと、プロジェクトディレクトリ全体にわたって未コミットの変更を自動的に処理するエージェントスイープ機能が含まれています。

これが必要な理由

47 以上のリポジトリ(個人プロジェクト、フォーク、依存関係)を扱う場合、手動で同期を続けるのは面倒です。しかし、同期は始まりにすぎません。RU は AI コーディングエージェントを連携させ、課題のレビュー、PR の処理、大規模な未コミット作業のコミットも行います。

解決する問題:

  • 各リポジトリで手動で cd ~/project && git pull を実行する
  • 更新の見落としが蓄積し、マージコンフリクトになる
  • ダーティなリポジトリがコミットされないまま放置される
  • リポジトリ全体で課題や PR が積み上がる
  • リポジトリをまたいで作業する AI エージェントの連携手段がない

重要な概念

Git Plumbing、Porcelain ではなく

RU は Git Plumbing コマンドのみを使用し、人間が読める出力を解析することはありません。

# WRONG: Locale-dependent, version-fragile
git pull 2>&1 | grep "Already up to date"

# RIGHT: Machine-readable plumbing
git rev-list --left-right --count HEAD...@{u}
git status --porcelain
git rev-parse HEAD
ストリームの分離

人間が読む出力は stderr に、データは stdout に出力されます。

ru sync --json 2>/dev/null | jq '.summary'
# Progress shows in terminal, JSON pipes to jq
グローバルな cd は使用しない

すべての Git 操作で git -C を使用します。作業ディレクトリは変更しません。

基本コマンド

同期(主な用途)
# Sync all configured repos
ru sync

# Parallel sync (much faster)
ru sync -j8

# Dry run - see what would happen
ru sync --dry-run

# Resume interrupted sync
ru sync --resume

# JSON output for scripting
ru sync --json 2>/dev/null | jq '.summary'
ステータス(読み取り専用の確認)
# Check all repos without modifying
ru status

# JSON output
ru status --json
リポジトリ管理
# Initialize configuration
ru init

# Add repos to sync list
ru add owner/repo
ru add https://github.com/owner/repo
ru add owner/repo@branch as custom-name

# Remove from list
ru remove owner/repo

# List configured repos
ru list

# Detect orphaned repos (in projects dir but not in list)
ru prune           # Preview
ru prune --delete  # Actually remove
ru prune --archive # Move to archive directory
診断
ru doctor      # System health check
ru self-update # Update ru itself

AI 支援レビューシステム

RU には、リポジトリ全体にわたる AI 支援コードレビューを管理するための、強力なレビューオーケストレーションシステムが含まれています。

2 段階のレビューワークフロー

フェーズ 1:検出(--plan)

  • すべてのリポジトリを対象に、GitHub でオープンな課題と PR を照会します
  • ラベル分析と経過日数に基づいて項目の優先度をスコアリングします
  • 安全にレビューできるよう、分離された Git ワークツリーを作成します
  • ターミナルマルチプレクサーで Claude Code セッションを起動します

フェーズ 2:適用(--apply)

  • 検出フェーズで提案された変更をレビューします
  • 品質ゲート(ShellCheck、テスト、リンター)を実行します
  • 承認された変更を任意でプッシュします(--push)
# Discover and plan reviews
ru review --plan

# After reviewing AI suggestions
ru review --apply --push
優先度スコアリングアルゴリズム
要素ポイントロジック
種類0-20PR:+20、課題:+10、ドラフト PR:-15
ラベル0-50security/critical:+50、bug/urgent:+30
経過日数(バグ)0-5060 日超:+50、30 日超:+30
最近の更新0-153 日未満:+15、7 日未満:+10
停滞度-20最近レビュー済み:-20

優先度レベル:CRITICAL(≥150)、HIGH(≥100)、NORMAL(≥50)、LOW(<50)

セッションドライバー
ドライバー説明最適な用途
auto利用可能な最適なものを自動検出デフォルト
ntmNamed Tmux Manager との統合マルチエージェントのワークフロー
local直接 tmux セッションを使用シンプルなセットアップ
ru review --mode=ntm --plan
ru review -j 4 --plan  # Parallel sessions
コスト予算
ru review --max-repos=10 --plan
ru review --max-runtime=30 --plan  # Minutes
ru review --skip-days=14 --plan    # Skip recently reviewed
ru review --analytics              # View past review stats

エージェントスイープ(ダーティなリポジトリの自動処理)

ru agent-sweep コマンドは AI コーディングエージェントを連携させ、未コミットの変更があるリポジトリを自動的に処理します。

基本的な使い方
# Process all repos with uncommitted changes
ru agent-sweep

# Dry run - preview what would be processed
ru agent-sweep --dry-run

# Process 4 repos in parallel
ru agent-sweep -j4

# Filter to specific repos
ru agent-sweep --repos="myproject*"

# Include release step after commit
ru agent-sweep --with-release

# Resume interrupted sweep
ru agent-sweep --resume

# Start fresh
ru agent-sweep --restart
3 段階のエージェントワークフロー

フェーズ 1:計画(--phase1-timeout、デフォルト 300s)

  • Claude Code が未コミットの変更を分析します
  • ステージングするファイルを判断します(拒否リストを遵守)
  • 構造化されたコミットメッセージを生成します

フェーズ 2:コミット(--phase2-timeout、デフォルト 600s)

  • 計画を検証します(ファイルの存在、拒否リストへの準拠)
  • 承認されたファイルをステージングして、コミットを作成します
  • 品質ゲートを実行します
  • リモートへのプッシュを任意で行います

フェーズ 3:リリース(--phase3-timeout、デフォルト 300s、--with-release が必要)

  • 最後のタグ以降のコミット履歴を分析します
  • バージョンの更新種別(patch/minor/major)を判断します
  • Git タグを作成し、GitHub リリースも任意で作成します
実行モード
--execution-mode=agent  # Full AI-driven workflow (default)
--execution-mode=plan   # Phase 1 only: generate plan, stop
--execution-mode=apply  # Phase 2+3: execute existing plan
事前チェック

エージェントを起動する前に、各リポジトリを検証します。

チェックスキップ理由
Git リポジトリであることnot_a_git_repo
Git のメールアドレスが設定されていることgit_email_not_configured
シャロークローンではないことshallow_clone
リベースが進行中ではないことrebase_in_progress
マージが進行中ではないことmerge_in_progress
detached HEAD ではないことdetached_HEAD
アップストリームブランチがあることno_upstream_branch
アップストリームと分岐していないことdiverged_from_upstream
セキュリティ対策

ファイル拒否リスト - エージェントの出力にかかわらず、コミットしません。

カテゴリパターン
シークレット.env、*.pem、*.key、id_rsa*、credentials.json
ビルド成果物node_modules、__pycache__、dist、build、target
ログ/一時ファイル*.log、*.tmp、*.swp、.DS_Store
IDE ファイル.idea、.vscode、*.iml

シークレットスキャン:

--secret-scan=none   # Disable
--secret-scan=warn   # Warn but continue (default)
--secret-scan=block  # Block push on detection
終了コード
コード意味
0すべてのリポジトリを正常に処理しました
1一部のリポジトリで失敗しました(エージェントエラー、タイムアウト)
2品質ゲートの失敗(シークレット、テスト)
3システムエラー(ntm、tmux が見つかりません)
4引数が無効です
5中断されました(--resume を使用してください)

設定

XDG 準拠のディレクトリ構成
~/.config/ru/
├── config               # Main config file
└── repos.d/
    ├── public.list      # Public repos (one per line)
    └── private.list     # Private repos (gitignored)

~/.local/state/ru/
├── logs/
│   └── YYYY-MM-DD/
├── agent-sweep/
│   ├── state.json
│   └── results.ndjson
└── review/
    ├── digests/
    └── results/
リポジトリ一覧の形式
# ~/.config/ru/repos.d/public.list
owner/repo
another-owner/another-repo@develop
private-org/repo@main as local-name
https://github.com/owner/repo.git
レイアウトモード
レイアウトパスの例
flat/data/projects/repo
owner-repo/data/projects/owner_repo
full/data/projects/github.com/owner/repo
ru config --set LAYOUT=owner-repo
リポジトリごとの設定
# ~/.../your-repo/.ru-agent.yml
agent_sweep:
  enabled: true
  max_file_size: 5242880  # 5MB
  extra_context: "This is a Python project using FastAPI"
  pre_hook: "make lint"
  post_hook: "make test"
  denylist_extra:
    - "*.backup"
    - "internal/*"

ntm との連携

ntm(Named Tmux Manager)が利用可能な場合、RU はそのロボットモード API を使用します。

機能目的
ntm --robot-spawn新しい tmux ペインに Claude Code セッションを作成します
ntm --robot-send長いメッセージを分割してプロンプトを送信します
ntm --robot-waitタイムアウト付きで、セッションが完了するまで待機します
ntm --robot-activityセッションの状態をリアルタイムで照会します
ntm --robot-status管理対象のすべてのセッションの状態を取得します
ntm --robot-interrupt長時間の処理を中断するために Ctrl+C を送信します

出力モード

JSON モード(--json)
ru sync --json 2>/dev/null
{
  "version": "1.2.0",
  "timestamp": "2025-01-03T14:30:00Z",
  "summary": {
    "total": 47,
    "cloned": 8,
    "updated": 34,
    "current": 3,
    "conflicts": 2
  },
  "repos": [...]
}
NDJSON 結果のログ記録
{"repo":"mcp_agent_mail","action":"pull","status":"updated","duration":2}
{"repo":"beads_viewer","action":"clone","status":"cloned","duration":5}
jq の例
# Get paths of all cloned repos
ru sync --json 2>/dev/null | jq -r '.repos[] | select(.action=="clone") | .path'

# Count by status
cat ~/.local/state/ru/logs/latest/results.ndjson | jq -s 'group_by(.status) | map({status: .[0].status, count: length})'

更新戦略

ru sync                        # Default: ff-only (safest)
ru sync --rebase               # Rebase local commits
ru sync --autostash            # Auto-stash before pull
ru sync --force                # Force update (use with caution)
戦略動作
ff-onlyファストフォワードのみ。分岐している場合は失敗します
rebaseローカルコミットをリモートの先頭にリベースします
merge必要に応じてマージコミットを作成します

品質ゲート

変更を適用する前に、RU は自動品質ゲートを実行します。

プロジェクト種別による自動検出:

プロジェクト種別テストコマンドリントコマンド
npm/yarnnpm testnpm run lint
Cargo(Rust)cargo testcargo clippy
Gogo test ./...golangci-lint run
Pythonpytestruff check
Makefilemake testmake lint
シェルスクリプト(なし)shellcheck *.sh

レート制限

RU には適応型の並列処理制御機能があります。

条件アクション
GitHub の残り枠が 100 未満並列処理数を 1 に減らします
GitHub の残り枠が 500 未満並列処理数を 50% 減らします
モデルの 429 を検出新しいセッションを 60 秒間一時停止します
エラー率が 50% 超サーキットブレーカーを作動させます

終了コード(同期)

コード意味
0成功 — すべてのリポジトリが同期済み、または最新です
1部分的な失敗 — 一部のリポジトリで失敗しました
2競合が存在します
3依存関係のエラー(gh が見つからない、認証に失敗)
4引数が無効です
5中断されました(--resume を使用してください)

環境変数

変数説明デフォルト
RU_PROJECTS_DIRリポジトリのベースディレクトリ/data/projects
RU_LAYOUTパスのレイアウトflat
RU_PARALLEL並列ワーカー数1
RU_TIMEOUTネットワークのタイムアウト(秒)30
RU_UPDATE_STRATEGYプル戦略ff-only
GH_TOKENGitHub トークン(gh CLI から取得)

トラブルシューティング

よくある問題
問題対処方法
gh: command not foundbrew install gh && gh auth login
gh: auth requiredgh auth login または GH_TOKEN を設定します
Cannot fast-forward--rebase を使用するか、先にプッシュします
dirty working tree変更をコミットするか、--autostash を使用します
diverged_from_upstreamgit fetch && git rebase origin/main
デバッグモード
# View latest run log
cat ~/.local/state/ru/logs/latest/run.log

# View specific repo log
cat ~/.local/state/ru/logs/latest/repos/mcp_agent_mail.log

# Run with verbose output
ru agent-sweep --verbose --debug
プリフライト失敗のデバッグ
# View why repos were skipped
ru agent-sweep --json 2>/dev/null | jq '.repos[] | select(.status == "skipped")'

インストール

# One-liner
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/repo_updater/main/install.sh | bash

# Verify
ru doctor

アーキテクチャに関する注意事項

  • 約17,700行のコードで構成された純粋な Bash で、git、curl、gh 以外の外部依存関係はありません
  • ワークスティーリングキューにより、アトミックなデキューで並列同期します
  • mkdir を使用したポータブルなロック機構(すべての POSIX システムで動作します)
  • パスのセキュリティ検証により、ディレクトリトラバーサル攻撃を防止します
  • ネットワーク操作では指数バックオフで再試行します

Flywheel との統合

ツール統合
Agent Mailリポジトリの更新時にエージェントへ通知し、レビューを調整します
BVリポジトリの同期を定期的な beads として追跡します
CASS過去の同期セッションとエージェントスイープのログを検索します
NTMセッションのオーケストレーションに使用するロボットモード API
DCGRU は DCG のサンドボックス保護内で実行されます

コメント