Skip to content

Commit 0fc84ea

Browse files
mizchiclaude
andcommitted
docs: add usage guide with Why bit philosophy and workflow examples
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 9453c7d commit 0fc84ea

2 files changed

Lines changed: 540 additions & 0 deletions

File tree

docs/usage-guide-ja.md

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
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

Comments
 (0)