ru について
RU は、複数の GitHub リポジトリの同期と AI 支援作業を管理する Bash コマンドラインツールです。並列更新に加え、レビューの調整や未コミット変更のエージェント処理を行います。
主な機能
- 01複数リポジトリを並列同期
- 02リポジトリの状態を JSON で出力
- 03Issue と PR のレビューを計画・適用
- 04エージェントで未コミット変更を処理
- 05品質チェックとシークレット検査を実行
- 06ドライランと再開に対応
活用シーン
- 01多数の GitHub リポジトリを最新に保つ
- 02エージェントレビュー対象の Issue と PR を優先付け
- 03未コミット変更があるリポジトリでコミットを準備
- 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-20 | PR:+20、課題:+10、ドラフト PR:-15 |
| ラベル | 0-50 | security/critical:+50、bug/urgent:+30 |
| 経過日数(バグ) | 0-50 | 60 日超:+50、30 日超:+30 |
| 最近の更新 | 0-15 | 3 日未満:+15、7 日未満:+10 |
| 停滞度 | -20 | 最近レビュー済み:-20 |
優先度レベル:CRITICAL(≥150)、HIGH(≥100)、NORMAL(≥50)、LOW(<50)
セッションドライバー
| ドライバー | 説明 | 最適な用途 |
|---|---|---|
auto | 利用可能な最適なものを自動検出 | デフォルト |
ntm | Named 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/yarn | npm test | npm run lint |
| Cargo(Rust) | cargo test | cargo clippy |
| Go | go test ./... | golangci-lint run |
| Python | pytest | ruff check |
| Makefile | make test | make 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_TOKEN | GitHub トークン | (gh CLI から取得) |
トラブルシューティング
よくある問題
| 問題 | 対処方法 |
|---|---|
gh: command not found | brew install gh && gh auth login |
gh: auth required | gh auth login または GH_TOKEN を設定します |
Cannot fast-forward | --rebase を使用するか、先にプッシュします |
dirty working tree | 変更をコミットするか、--autostash を使用します |
diverged_from_upstream | git 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 |
| DCG | RU は DCG のサンドボックス保護内で実行されます |