|
| 1 | +# bit-relay 利用ガイド |
| 2 | + |
| 3 | +bit-relay を使ったリポジトリ共有・issue 管理・コラボレーションのステップバイステップガイドです。Git の基本知識を前提としています。 |
| 4 | + |
| 5 | +## Why bit |
| 6 | + |
| 7 | +Git プロトコルは本来、分散ストレージとして設計されている。しかし GitHub によって事実上の権威サーバーとなっている。これは安定したブランチを選ぶ上で実用上は便利だが、AI Agent の高速な生産性を前提とした開発サイクルとは噛み合っていない。もっと自由にブランチを作成して、自由に upstream を選べるべきだし、異なる目的で大量の fork が生まれてよいと思っている。 |
| 8 | + |
| 9 | +bit の作者としては、非中央集権であることに政治的な主張はない。ただ、開発ワークフローとしてそこに技術優位があると思っているだけだ。最終的には P2P で開発されたものは GitHub に sync されるのが運用上楽だと思うし、揮発性の P2P キャッシュはストレージとして使うには信頼性に欠ける。 |
| 10 | + |
| 11 | +bit + bit-relay は P2P のリレーサーバーとして実装されている。自律的な AI エージェントが bit プロトコルを前提に開発ノードに参加し、変更を broadcast して、各自が勝手に取り入れる — これが本来の分散ストレージとしての Git の姿だ。OSS の開発者のモデルで、指向性を与えられた自律的なエージェントが可能性を探索する。最終的に人間がその結果を確認して、選択的に取り入れる。このサイクルを高速化するために非中央集権的な Git が必要だ。 |
| 12 | + |
| 13 | +具体的には、`bit relay serve` されている間に P2P で誰かが変更した内容は、P2P ノード間で `.git/objects` と `refs/relay/incoming/...` に自動保存される(受け入れサイズ上限あり)。ユーザーや AI はローカルで好きな変更を cherry-pick すればよい。このモデルがうまくいけば、ブロックチェーンのように、もっとも有用なブランチが事実上の fast-forward として扱えるはずだ。 |
| 14 | + |
| 15 | +とはいえ、まだ簡単な fetch/clone/sync/PR の仕組みがあるだけで、実際にはもっと多くの機能が必要だろう: |
| 16 | + |
| 17 | +- 複数のリレーサーバー間の同期 |
| 18 | +- GitHub と PR/issue を共有する仕組み |
| 19 | +- クローズドなローカルホストリレー |
| 20 | +- リレーサーバーが数日間キャッシュを持ってバックアップする機能 |
| 21 | +- AI にこのサイクルを理解させるためのプロンプト |
| 22 | + |
| 23 | +現状は趣味レベルの PoC として開発しており、サポートしてくれる人や会社を募集している。不足しているものは多い — Git との完全な互換を保証するための手数、これを組み込むための SDK やドキュメント、そして実際にエージェントクラスターを運用する上での知見。 |
| 24 | + |
| 25 | +このコンセプトに未来を感じた人は、 https://x.com/mizchi まで連絡してほしい。 |
| 26 | + |
| 27 | +## 主要な概念 |
| 28 | + |
| 29 | +bit は Git にプラットフォーム非依存のコラボレーション機能を追加しています。ワークフローに入る前に、通常の Git + GitHub との違いを理解しておきましょう。 |
| 30 | + |
| 31 | +### bit — Git 実装 |
| 32 | + |
| 33 | +bit は MoonBit で書かれた Git 実装です。一部の未サポート機能(例: `--object-hash=sha256`)を除き、Git と互換性があります。既存の Git リポジトリをそのまま bit で扱え、その逆も可能です。 |
| 34 | + |
| 35 | +### hub — 分散型の Issue/PR 管理 |
| 36 | + |
| 37 | +GitHub のワークフローでは issue や PR は GitHub サーバー上に存在します。bit では、**リポジトリ内部**に Git notes(`refs/notes/bit-hub`)として保存されます。これにより: |
| 38 | + |
| 39 | +- issue や PR がリポジトリデータの一部となり、特定のホスティングに依存しない |
| 40 | +- 中央サーバーなしにピア間で同期できる |
| 41 | +- `bit issue init` で任意の git リポジトリにこのメタデータストアを初期化できる |
| 42 | + |
| 43 | +### relay — 共有のためのリレーサーバー |
| 44 | + |
| 45 | +bit-relay は 2 つの問題を解決する軽量リレーサーバーです: |
| 46 | + |
| 47 | +1. **NAT/ファイアウォール越しのリポジトリ共有**: `bit relay serve` でローカルリポジトリを relay 経由で公開し、他者が `bit clone` できる — ポート開放不要 |
| 48 | +2. **hub メタデータの同期**: `bit relay sync push/fetch` で issue/PR を relay 経由で配信・取得 |
| 49 | + |
| 50 | +``` |
| 51 | +┌──────────┐ ┌───────────┐ |
| 52 | +│ Alice │──relay serve────────│ │────clone────▶ Bob |
| 53 | +│ (ホスト) │──sync push──────▶ │ bit-relay │ │ |
| 54 | +│ │ │ (サーバー) │◀──sync fetch── │ |
| 55 | +└──────────┘ └───────────┘ |
| 56 | +``` |
| 57 | + |
| 58 | +コード(blob/tree/commit)は `serve`/`clone` で転送されます。hub メタデータ(issue/PR)は `sync push`/`sync fetch` で転送されます。これらは独立した操作です。 |
| 59 | + |
| 60 | +デフォルトの relay URL は本プロジェクトからデプロイされた公開インスタンスを指します。独自にデプロイすることも可能です — 詳細は [デプロイガイド](./scaling.md) を参照してください。 |
| 61 | + |
| 62 | +### sender — あなたの識別子 |
| 63 | + |
| 64 | +`sender` は relay 上でのあなたの識別名です(例: `alice`)。Ed25519 署名鍵と組み合わせることで、メッセージの発行者を証明します。GitHub 検証を行うと sender 名が GitHub ユーザー名と紐付き、`alice/my-repo` のような名前付きセッションが使えるようになります。 |
| 65 | + |
| 66 | +### session — 一時的な relay エンドポイント |
| 67 | + |
| 68 | +`bit relay serve` を実行すると、relay に**セッション**が作成されます。セッションはランダム ID(例: `AbCdEfGh`)または名前付きパス(例: `alice/my-repo`)で識別される一時的なエンドポイントです。`serve` コマンドの実行中のみ有効です。 |
| 69 | + |
| 70 | +## 前提条件 |
| 71 | + |
| 72 | +- **bit CLI** がインストール済み: |
| 73 | + ```bash |
| 74 | + curl -fsSL https://raw.githubusercontent.com/mizchi/bit-vcs/main/install.sh | bash |
| 75 | + ``` |
| 76 | +- 稼働中の **bit-relay** サーバー URL(例: `relay+https://relay.example.com`) |
| 77 | +- (任意)署名付き publish 用の **Ed25519 署名鍵** |
| 78 | + |
| 79 | +セットアップの確認: |
| 80 | + |
| 81 | +```bash |
| 82 | +bit --version |
| 83 | +curl https://relay.example.com/health |
| 84 | +# => {"status":"ok","service":"bit-relay"} |
| 85 | +``` |
| 86 | + |
| 87 | +## 1. 環境設定 |
| 88 | + |
| 89 | +### 環境変数 |
| 90 | + |
| 91 | +relay URL と sender ID を環境変数で設定します: |
| 92 | + |
| 93 | +```bash |
| 94 | +# relay URL(serve/sync コマンドのデフォルト値) |
| 95 | +export BIT_RELAY_URL=relay+https://relay.example.com |
| 96 | + |
| 97 | +# sender ID(あなたの識別名) |
| 98 | +export BIT_RELAY_SENDER=alice |
| 99 | + |
| 100 | +# (任意)署名鍵ファイルのパス |
| 101 | +export BIT_RELAY_SIGN_PRIVATE_KEY_FILE=~/.config/bit/relay-key.pem |
| 102 | +``` |
| 103 | + |
| 104 | +### 署名鍵の生成(任意) |
| 105 | + |
| 106 | +```bash |
| 107 | +# Ed25519 秘密鍵を生成 |
| 108 | +openssl genpkey -algorithm Ed25519 -out ~/.config/bit/relay-key.pem |
| 109 | + |
| 110 | +# 公開鍵を base64url 形式で取得 |
| 111 | +openssl pkey -in ~/.config/bit/relay-key.pem -pubout -outform DER \ |
| 112 | + | base64 | tr '+/' '-_' | tr -d '=' |
| 113 | +``` |
| 114 | + |
| 115 | +## 2. GitHub ユーザー名検証 |
| 116 | + |
| 117 | +relay が署名を要求する場合、署名鍵を GitHub アカウントと紐付けることで本人確認ができます。Ed25519 鍵と GitHub SSH 鍵の照合により身元を証明します。 |
| 118 | + |
| 119 | +```bash |
| 120 | +# 鍵を登録し GitHub SSH 鍵と照合 |
| 121 | +#(BIT_RELAY_SENDER と BIT_RELAY_SIGN_PRIVATE_KEY_FILE の設定が必要) |
| 122 | +bit relay sync push relay+https://relay.example.com |
| 123 | +``` |
| 124 | + |
| 125 | +検証完了後、relay セッションでランダム ID の代わりに名前付きパス(例: `alice/my-repo`)が使えるようになります。 |
| 126 | + |
| 127 | +## 3. リポジトリの初期化 |
| 128 | + |
| 129 | +git リポジトリを作成し、hub メタデータを初期化します: |
| 130 | + |
| 131 | +```bash |
| 132 | +# リポジトリを新規作成 |
| 133 | +mkdir my-project && cd my-project |
| 134 | +bit init |
| 135 | +echo "# My Project" > README.md |
| 136 | +bit add . |
| 137 | +bit commit -m "initial commit" |
| 138 | + |
| 139 | +# issue/PR トラッキングを初期化 |
| 140 | +bit issue init |
| 141 | +``` |
| 142 | + |
| 143 | +## 4. issue の作成 |
| 144 | + |
| 145 | +issue は対処すべき問題やタスクを宣言するものです: |
| 146 | + |
| 147 | +```bash |
| 148 | +# issue を作成(解決策ではなく、問題を記述する) |
| 149 | +bit issue create --title "ログインページで特殊文字入力時にクラッシュする" \ |
| 150 | + --body "パスワード欄に特殊文字を入力するとクラッシュが発生する" |
| 151 | + |
| 152 | +# issue 一覧の確認 |
| 153 | +bit issue list |
| 154 | +``` |
| 155 | + |
| 156 | +## 5. hub データを relay に push |
| 157 | + |
| 158 | +ローカルの hub メタデータ(issue, PR, note)を relay サーバーに送信します: |
| 159 | + |
| 160 | +```bash |
| 161 | +bit relay sync push relay+https://relay.example.com |
| 162 | +``` |
| 163 | + |
| 164 | +## 6. relay 経由でリポジトリを公開 |
| 165 | + |
| 166 | +リポジトリを relay 経由でリモート clone 可能にします: |
| 167 | + |
| 168 | +```bash |
| 169 | +bit relay serve relay+https://relay.example.com |
| 170 | +``` |
| 171 | + |
| 172 | +出力: |
| 173 | + |
| 174 | +``` |
| 175 | +Session registered: abc123 |
| 176 | +Clone URL: relay+https://relay.example.com/abc123 |
| 177 | +``` |
| 178 | + |
| 179 | +clone URL を共同作業者に共有してください。コマンドが実行中の間、セッションは有効です。 |
| 180 | + |
| 181 | +### オプション |
| 182 | + |
| 183 | +| オプション | 説明 | |
| 184 | +|-----------|------| |
| 185 | +| `--allow-remote-push` | リモートからの push を受け付ける(`refs/relay/incoming/` に保存) | |
| 186 | +| `--auto-fetch` | feature broadcast 検知時に自動 fetch | |
| 187 | +| `--repo <name>` | リポジトリ名を指定(名前付きセッションを有効化) | |
| 188 | + |
| 189 | +## 7. relay から clone |
| 190 | + |
| 191 | +共同作業者は公開されたリポジトリを clone できます: |
| 192 | + |
| 193 | +```bash |
| 194 | +bit clone relay+https://relay.example.com/abc123 |
| 195 | +cd abc123 |
| 196 | +``` |
| 197 | + |
| 198 | +## 8. relay から hub データを取得 |
| 199 | + |
| 200 | +clone 後、relay から hub メタデータ(issue, PR)を取得します: |
| 201 | + |
| 202 | +```bash |
| 203 | +bit relay sync fetch relay+https://relay.example.com |
| 204 | +``` |
| 205 | + |
| 206 | +取得後の確認: |
| 207 | + |
| 208 | +```bash |
| 209 | +# issue 一覧 |
| 210 | +bit issue list |
| 211 | + |
| 212 | +# PR 一覧 |
| 213 | +bit pr list |
| 214 | +``` |
| 215 | + |
| 216 | +## フルワークフロー: Alice と Bob |
| 217 | + |
| 218 | +### Alice(ホスト側) |
| 219 | + |
| 220 | +```bash |
| 221 | +# 1. リポジトリの作成と初期化 |
| 222 | +mkdir my-project && cd my-project |
| 223 | +bit init |
| 224 | +echo "# My Project" > README.md |
| 225 | +bit add . && bit commit -m "initial commit" |
| 226 | +bit issue init |
| 227 | + |
| 228 | +# 2. issue を作成 |
| 229 | +bit issue create -t "Unicode パスワードで認証が失敗する" \ |
| 230 | + -b "パスワードに Unicode 文字を含むユーザーがログインできない" |
| 231 | + |
| 232 | +# 3. hub データを relay に push |
| 233 | +bit relay sync push relay+http://localhost:8788 |
| 234 | + |
| 235 | +# 4. リポジトリを公開(実行中は維持) |
| 236 | +bit relay serve relay+http://localhost:8788 |
| 237 | +# => Clone URL: relay+http://localhost:8788/AbCdEfGh |
| 238 | +``` |
| 239 | + |
| 240 | +### Bob(クライアント側) |
| 241 | + |
| 242 | +```bash |
| 243 | +# 1. relay から clone |
| 244 | +bit clone relay+http://localhost:8788/AbCdEfGh |
| 245 | +cd AbCdEfGh |
| 246 | + |
| 247 | +# 2. hub をローカルで初期化 |
| 248 | +bit issue init |
| 249 | + |
| 250 | +# 3. relay から hub データを取得 |
| 251 | +bit relay sync fetch relay+http://localhost:8788 |
| 252 | + |
| 253 | +# 4. issue と PR を確認 |
| 254 | +bit issue list |
| 255 | +bit pr list |
| 256 | +``` |
| 257 | + |
| 258 | +## relay URL 形式 |
| 259 | + |
| 260 | +| 形式 | 動作 | |
| 261 | +|------|------| |
| 262 | +| `relay+https://host` | relay API を直接使用(TLS) | |
| 263 | +| `relay+http://host` | relay API を直接使用(非 TLS、ローカル開発用) | |
| 264 | +| `https://host/repo.git` | smart-http を試行、404 時に relay fallback | |
| 265 | + |
| 266 | +## トラブルシューティング |
| 267 | + |
| 268 | +- **"session not found"**: ホスト側の `bit relay serve` が停止した可能性があります。ホストに再起動を依頼してください。 |
| 269 | +- **署名エラー**: `BIT_RELAY_SENDER` と `BIT_RELAY_SIGN_PRIVATE_KEY_FILE` が設定されているか確認するか、`RELAY_REQUIRE_SIGNATURE=false` で起動した relay を使用してください。 |
| 270 | +- **接続拒否**: relay URL が正しいか、サーバーが起動しているか確認してください(`curl <relay-url>/health`)。 |
0 commit comments