GitHubを離れてBuzzとNostrへ移行する際に知っておくべきこと
TuBrief 편집팀
2026년 8월 24일
0
Computing/Software원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
中央集権的なリポジトリにコードをプッシュするやり方に違和感を覚える時期がやってくる。ポリシーは頻繁に変わり、自分のコードがどこで使われているのか分からない。1人のフリーランスや小規模チームにとって、データ主権は生存の問題だ。BuzzとNostrのNIP-34プロトコルは、単一企業に依存しない現実的な代替手段である。しかし、いざ移行しようとすると途方に暮れる。手順、コスト、セキュリティの問題を自力で解決しなければならない。
単に git push --mirror を実行しても、サーバー側で拒否されてしまう。GitHub内部の参照である refs/pull/* が原因だ。ターゲットサーバーは隠されたリファレンスを受け付けてくれない。競合なしにコードを移行するには、不要な参照を取り除き、明示的にプッシュする必要がある。
一時ディレクトリにベア・リポジトリを作成し、GitHub専用のリファレンスを削除した上で、Buzzのエンドポイントにプッシュしなければならない。大容量ファイルがある場合は、LFSオブジェクトも別途処理する必要がある。
`bash
#!/usr/bin/env bash
set -euo pipefail
GITHUB_REPO_URL="2"
TEMP_DIR=$(mktemp -d -t buzz-migration-XXXXXX)
trap 'rm -rf "$TEMP_DIR"' EXIT
git clone --mirror "TEMP_DIR/bare_repo.git"
cd "$TEMP_DIR/bare_repo.git"
git for-each-ref --format='%(refname)' refs/pull/ | while read -r ref; do
git update-ref -d "$ref"
done
git remote add buzz "$BUZZ_REMOTE_URL"
git push --force --prune buzz "+refs/heads/:refs/heads/" "+refs/tags/:refs/tags/"
ROOT_COMMIT=ROOT_COMMIT)"
`
このスクリプトを実行すると、コミット履歴が100%保持される。最初のコミットハッシュがプロジェクトの固有識別子となる。
| 比較項目 | GitHub | Buzz / Nostr NIP-34 |
|---|---|---|
| リポジトリ識別 | 中央サーバーDBレコード (org/repo) |
最初のコミットIDおよびNostrイベントID |
| 認証方式 | OAuth, PAT, SSH Key | secp256k1楕円曲線非対称署名 |
| パッチ交換 | GitHub専用API | NIP-34パッチイベント (kind: 1617) |
Nostrエコシステムでは、人間であろうとAIエージェントであろうと同一の暗号学的主体である。32バイトの公開鍵とシュノル署名でお互いを認証する。秘密鍵をコードに埋め込んだ瞬間、セキュリティ事故につながる。環境変数としてメモリ上にのみ保持するか、リモート署名者を使用する必要がある。
エージェントが送信したパッチが途中で改ざんされていないか確認するには、NIP-01シリアライズハッシュを検証しなければならない。
`python
import json
import hashlib
from coincurve import PrivateKey
def create_signed_agent_event(secret_key_hex: str, kind: int, content: str, tags: list) -> dict:
sk = PrivateKey.from_hex(secret_key_hex)
pubkey_hex = sk.public_key.format(compressed=True)[1:].hex()
created_at = 1710000000
serialized_data = json.dumps(
[0, pubkey_hex, created_at, kind, tags, content],
separators=(',', ':'),
ensure_ascii=False
)
event_id = hashlib.sha256(serialized_data.encode('utf-8')).hexdigest()
sig_hex = sk.schnorr_sign(bytes.fromhex(event_id), None, raw=True).hex()
return {
"id": event_id,
"pubkey": pubkey_hex,
"created_at": created_at,
"kind": kind,
"tags": tags,
"content": content,
"sig": sig_hex
}
def verify_agent_event(event: dict) -> bool:
preimage = [0, event["pubkey"], event["created_at"], event["kind"], event["tags"], event["content"]]
serialized = json.dumps(preimage, separators=(',', ':'), ensure_ascii=False)
computed_id = hashlib.sha256(serialized.encode('utf-8')).hexdigest()
return computed_id == event["id"]
`
機密性の高いコードのやり取りが必要な場合は、NIP-44 v2規格を使用してChaCha20で暗号化する。
エージェントにコーディングを任せると、自律修正ループに陥ってトークンを瞬く間に消費してしまう。失敗した記録が蓄積されるほどコンテキストは汚染され、コストは高騰する。これを防ぐには、プロキシレベルで制限をかける必要がある。
LiteLLMプロキシを手前に置き、仮想キー単位で日次予算と速度を制限する。
`bash
curl -X POST 'http://localhost:4000/key/generate'
-H 'Authorization: Bearer sk-master-key-1234'
-H 'Content-Type: application/json'
-d '{
"key_alias": "auto-coder-agent-01",
"max_budget": 5.0,
"budget_duration": "1d",
"tpm_limit": 50000,
"rpm_limit": 30,
"models": ["agent-code-model"]
}'
`
1日の予算が5ドルを超えると即座にエラーを返して停止する。設定ファイルでチーム全体の予算も一緒に締め付ける。
`yaml
model_list:
litellm_settings:
max_budget: 100.0
budget_duration: "30d"
default_team_settings:
`
コード全体をコンテキストに含める行為もやめるべきである。Tree-Sitterを使用して必要な関数シグネチャと変更されたハンクの周辺のみを切り出して送信することで、トークンの無駄遣いを減らすことができる。この方式を採用すると、不要なツール呼び出しが半分以上に減少する。