red-bucket スキル
このスキルは、AIエージェントが red-bucket サーバーと対話するためのガイドとなります。red-bucket は、codex、claude、agents、openclaw 間でのオンザフライのクロスハーネス形式翻訳を特徴とし、user/bucket 名前空間で整理されたAIエージェントアセット(スキル、MCP設定、CLAUDE.md や AGENTS.md などの指示、サブエージェント、プラグイン)のハブです。
エージェントガードレールと不変条件
- 認証: すべての書き込み操作とユーザーが所有するプライベートバケットへのアクセスには
Authorization: Bearer <token>が必要です。公開バケットの読み取りは匿名で行われ、ヘッダーは不要です。 - 認証情報の安全性: パスワード、APIトークン、シークレットを出力、ログ、またはユーザートランスクリプトに漏洩させないでください。
- プライベートバケットの404不変条件: 認証されていない発信者または非所有者からのプライベートバケットまたはそのサブリソースへのリクエストは、必ずHTTP
404 Not Foundを返さなければなりません(403 Forbiddenは不可)。非所有者はプライベートバケットが存在するかどうかを区別できません。 - クォータと制限:
- デフォルトのバケットクォータ: ユーザーあたり5バケット(超過するとコード
bucket_quota_exceededとともに403を返します)。 - バケットストレージ制限: バケットあたり10MB(超過するとコード
bucket_storage_exceededとともに413を返します)。
- デフォルトのバケットクォータ: ユーザーあたり5バケット(超過するとコード
- APIスコープ: すべてのエンドポイントは
/api/v1/配下にあります。
三つの名前ルール
以下の3つの操作を決して混同したり混在させたりしないでください。
copy(POST /api/v1/users/{username}/buckets/{bucket}/copies): 読み取り可能なソースバケットからアセットを複製し、出所履歴を保持して自身の宛先バケットに配置します。InstallRecordJSONオブジェクトを返します。install-script(GET /api/v1/users/{username}/buckets/{bucket}/install-script): ローカルファイルシステムにダウンロードして翻訳されたアセットを配置する実行可能なシェルスクリプトテキストを返します。translated fetch(GET .../translated): 指定されたターゲットハーネスに対してオンザフライで変換された、生の翻訳済みバイトまたはZIPアーカイブをフェッチします。
インストールと発見
1. エージェントスキルのインストール (npx skills を使用)
このスキルをエージェント環境にインストールするには:
# エージェントアクセス用のグローバルインストール
npx skills add 370025263/red-bucket --skill red-bucket -g -y
# インストールせずに利用可能なスキルを一覧表示
npx skills add 370025263/red-bucket --list
2. バンドルされたクライアント: scripts/rb.mjs
このスキルには独自のクライアントが付属しています。必要なのは Node 18+ のみ で、他には何も必要ありません — sh、curl、unzip、jq、npm install は不要です。HTTP呼び出しを手作りするよりもこちらを優先してください。既にオリジンの正規化、ファイルパーミッション、アトミック書き込みを正しく行っています。
node <skill-dir>/scripts/rb.mjs login --client claude
node <skill-dir>/scripts/rb.mjs status
node <skill-dir>/scripts/rb.mjs logout
node <skill-dir>/scripts/rb.mjs install alice/tools --target claude
node <skill-dir>/scripts/rb.mjs create alice/tools --visibility private --description "my kit"
node <skill-dir>/scripts/rb.mjs upload alice/tools ./my-skill --type skill --harness claude --path skills/my-skill
login はリンクを出力し、--wait 秒間(デフォルト20)ブラウザを待機します。シェルツールにタイムアウトがある場合は問題ありません。タイムアウト時は終了コード0で終了し、保留中のコードを認証ファイルの隣にある pending.json に保持して、その旨を通知します。ユーザーに承認するよう伝え、その後 login または status を再度実行してください。トークンが収集され、保存されます。最初のコードが有効な間は2番目のコードは発行されないため、プロセスを強制終了してやり直すことで「再試行」しないでください。
install はカレントディレクトリに書き込みます。--dest DIR または $RED_BUCKET_DEST で別の場所に配置できます。--origin URL または $RED_BUCKET_URL でセルフホストサーバーを指定できます。サインインしていれば、プライベートバケットも同じコマンドで動作し、保存された認証情報を使用します。
create と upload は公開側です。upload はローカルディレクトリ内のすべてのファイルを1つのアセットとして送信します。テキストファイルはテキストとして、その他はbase64として、--path(デフォルトはディレクトリ名)をルートとします。--type はアセットの種類(skill、mcp、instructions、subagent、plugin)で、--harness は 記述された ハーネスを指定します — サーバーはそこから翻訳します。サーバーはアセットを検証し、クライアントは異議があった内容を正確に出力します。例: validation failed: SKILL.md: SKILL.md missing。どちらもサインインが必要です。手作りの POST .../assets ボディよりもこれらを優先してください。以下の生エンドポイントは契約であり、クライアントはツールです。
3. このスキルなしでバケットをインストールする
Accept: text/plain を使用した GET .../install-script?target=<harness> は、自己完結型のNodeプログラムを返します。ボディを rb-install.mjs として保存し、node rb-install.mjs を実行します。同じNodeのみの依存関係、同じ RED_BUCKET_URL / RED_BUCKET_DEST のオーバーライドです。
(プライベートバケットの場合、貼り付け可能な公開プログラムはありません。代わりに Authorization: Bearer <token> を使用して GET .../translated をフェッチするか、サインイン中に rb.mjs install を使用してください。)
サインインとトークンの保存場所
公開バケットの読み取りには何も必要ありません。書き込みを行うすべての操作 — バケットの作成、アセットのアップロード、イシューやプルリクエストのオープン — にはベアラートークンが必要です。
ユーザーに red-bucket パスワードを決して尋ねないでください。 以下のブラウザハンドオフを使用してください。エージェントがトークンを取得するための唯一の承認方法です。
トークンの保存場所
$RED_BUCKET_AUTH 設定されている場合、その正確なファイル
%APPDATA%\red-bucket\auth.json Windows上
${XDG_CONFIG_HOME:-~/.config}/red-bucket/auth.json それ以外のすべての場所
最初にそこを確認してください。このオリジンの有効なエントリがすでに存在する場合は、それを使用してください — 既に付与されているトークンを取得するために、ユーザーを再度ブラウザに送らないでください。
ディレクトリモード 0700、ファイルモード 0600。アトミックに書き込みます(同じディレクトリ内の一時ファイル、その後リネーム)。これにより、中断された書き込みで中途半端なファイルが残るのを防ぎます。形状は、オリジンでキー付けされているため、セルフホストサーバーと公開サーバーが共存できます:
{
"version": 1,
"hosts": {
"https://redbucket.store": {
"username": "stone91",
"token": "...",
"created_at": "2026-09-03T04:07:19Z",
"client": "claude"
}
}
}
IDの解決順序: $RED_BUCKET_TOKEN が設定されている場合はそれ、次に、通信しているオリジンとキーが一致するそのファイル内のエントリ、最後に匿名。Authorization: Bearer <token> として送信します。
キーとして使用する前にオリジンを正規化 してください。書き込み時も検索時も同様です。スキームとホストを小文字にし、末尾のスラッシュを削除し、スキームのデフォルトポートの場合はポートを削除します。これにより、https://RedBucket.store:443/ と https://redbucket.store は1つのキーとなり、3つにはなりません。これをスキップすると、既に持っているトークンを取得するためにユーザーをブラウザに戻し、重複したエントリを残すことになります。
ファイルが解析できない場合、または version が認識できない数値の場合、認証情報なしとして扱います — 匿名にフォールバックし、ファイルが壊れているように見えることをユーザーに伝えます。読み取れなかったファイルを削除または上書きしないでください。別のツールのトークンが含まれている可能性があります。
ファイル全体を1回で読み取り、変更、書き込みを行い、その間隔を短く保ちます。2つのハーネスが同時にサインインすると、両方とも読み取り、両方とも書き込みを行い、遅い方が他方のエントリを消去します。上記の一時ファイル→リネームは、破損した ファイルを防ぎますが、失われた更新は防ぎません。
トークンを決して出力せず、トランスクリプトにエコーせず、リポジトリに書き込まず、ユーザーがスクロールバックで表示できるシェルコマンドに配置しないでください。
トークンの取得: ブラウザハンドオフ
トークンはサーバーによって生成され、プロセスに直接渡されます。会話を経由することは決してありません。
1. 開始します。
POST /api/v1/auth/device
{"client": "claude"}
201 は device_code、user_code、verification_url_complete、expires_in (600) および interval (5) を返します。
device_code は秘密の半分です — プロセス内に留まります。user_code は人間が読む短い方です。
2. 人間にリンクを表示します。 次のように:
サインインまたはアカウント作成のためにこれを開いてください: https://redbucket.store/link/BQ7K-2M4X ページにコード BQ7K-2M4X が表示されるはずです。待機します。
ユーザーはブラウザで開き、まだサインインしていなければサインインし、クライアントに名前を付け、許可する内容をリストした1つの画面が表示されます。ユーザーは「承認」または「拒否」を押します。
3. ポーリング は interval 秒より速くしないでください:
POST /api/v1/auth/device/token
{"device_code": "..."}
{"status": "pending"}— 待機を続けます。{"status": "denied"}— ユーザーが拒否しました。停止し、その旨を明白に伝えます。{"status": "approved", "token": ..., "user": {...}}— 取得しました。404— コードの有効期限が切れたか、既に収集されました。最初からやり直すように提案します。device_code は1回限りです。2回目のポーリング成功は常に404です。
4. 上記のパスに保存 し、Signed in as <username>. とだけ表示します。
サインアウト
POST /api/v1/auth/logout をトークンと共に使用すると、サーバー側でそのトークンが1つ無効になります。次に、認証ファイルからそのホストのエントリを削除します。両方を行ってください。一方だけを行うと、サーバーに有効なトークンが残るか、ディスクに無効なトークンが残ります。
red-bucket MCPサーバーはありません
red-bucket の mcp は、バケットが保持できるアセットの種類であり、私たちが実行するサーバーではありません。このスキルが /api/v1/ と通信することが、クライアント統合のすべてです。接続するMCPエンドポイントを探さないでください。
ユーザー側のフローとAPI操作
1. ユーザー登録、ログイン、プロフィール
-
登録:
POST /api/v1/auth/register Content-Type: application/json { "username": "alice", "email": "[email protected]", "password": "strongpassword123" }- レスポンス:
201 Created、Location: /api/v1/users/aliceおよび公開Userオブジェクト(パスワードはArgon2idでハッシュ化、登録時にトークンは発行されません)。
- レスポンス:
-
ログイン:
POST /api/v1/auth/login Content-Type: application/json { "email": "[email protected]", "password": "strongpassword123" }- レスポンス:
200 OK、{"token": "<opaque_token>", "token_type": "bearer", "user": { ... }}を含む。
- レスポンス:
-
プロフィール取得 (
me):GET /api/v1/users/me Authorization: Bearer <token>- レスポンス:
200 OK、ユーザー詳細(email、bucket_quota、bucket_countを含む)を伴う。
- レスポンス:
2. テンプレートからバケットを作成
認証されたユーザーの名前空間の下にバケットを作成します:
POST /api/v1/users/{username}/buckets
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "dev-skills",
"visibility": "public",
"description": "一般的な開発エージェントスキル",
"template": "claude"
}
- 許可されるテンプレート:
codex、agents、claude、openclaw(省略するか空のバケット用)。このリストは増加します。GET /api/v1/templatesが最新のものです。 - 可視性:
publicまたはprivate(デフォルトはprivate)。 - レスポンス:
201 Created、Location: /api/v1/users/{username}/buckets/{name}およびBucketJSON を伴う。 - エラー:
403(5バケットを超える場合はbucket_quota_exceeded)、409(bucket_name_taken)。
3. アセットのアップロード
形式検証とクォータ適用を伴うアセットのアップロード:
POST /api/v1/users/{username}/buckets/{bucket}/assets
Authorization: Bearer <token>
Content-Type: application/json
{
"type": "skill",
"source_harness": "claude",
"path": "skills/calculator",
"files": [
{
"path": "SKILL.md",
"content_text": "---\nname: calculator\ndescription: 算術計算を実行\n---\n\n# 電卓スキル\n"
}
]
}
- アセットタイプ:
skill、mcp、instructions、subagent、plugin。 - ソースハーネス:
claude、codex、agents、openclaw。このリストは増加します。GET /api/v1/translation-matrixが最新のものです。このファイルにないからといって、ユーザーが指定したハーネスを拒否しないでください — サーバーに判断を任せてください。 - ファイルコンテンツは
content_text(UTF-8)またはcontent_base64として提供できます。 - レスポンス:
201 Created、Location: /api/v1/users/{username}/buckets/{bucket}/assets/{asset_id}を伴う。 - エラー:
413(バケットが10MBを超える場合はbucket_storage_exceeded)、422(特定のルールとパス違反を含むvalidation_failed)。
4. 匿名ブラウジングと翻訳済みフェッチ
-
バケットのブラウズ(公開/匿名):
GET /api/v1/users/{username}/buckets/{bucket} -
ファイルツリーとブロブのブラウズ:
GET /api/v1/users/{username}/buckets/{bucket}/tree GET /api/v1/users/{username}/buckets/{bucket}/blob/{*path} -
ターゲットハーネス用に翻訳されたバケット全体をフェッチ:
GET /api/v1/users/{username}/buckets/{bucket}/translated?target=codex- レスポンス:
200 OK(バイナリZIPアーカイブ、ヘッダーX-Red-Bucket-Lossy: true|false)。
- レスポンス:
-
単一アセットを翻訳してフェッチ:
GET /api/v1/users/{username}/buckets/{bucket}/assets/{asset_id}/translated?target=codex- レスポンス:
200 OK(生の翻訳済みバイトまたはZIPアーカイブ)。
- レスポンス:
5. インストールスクリプトの実行
ターゲットハーネス用に生成されたシェルインストールスクリプトを取得します:
GET /api/v1/users/{username}/buckets/{bucket}/install-script?target=claude
Accept: text/plain
- レスポンス:
200 OK、生のシェルスクリプトテキストを伴う。 - クライアント側で実行され、翻訳されたZIPアーカイブをダウンロードし、ファイルをローカルハーネスディレクトリに配置します。
6. アセットを自身のバケットにコピー(出所追跡)
ソースバケットからアセットを自身の宛先バケットにコピーします:
POST /api/v1/users/{username}/buckets/{dest_bucket}/copies
Authorization: Bearer <token>
Content-Type: application/json
{
"source_username": "bob",
"source_bucket": "public-skills",
"source_asset_id": 12,
"dest_path": "skills/calculator"
}
- レスポンス:
201 Created、Location: /api/v1/users/{username}/buckets/{dest_bucket}/copies/{copy_id}およびInstallRecordJSONオブジェクトを伴う。 - ソースアセットを検証し、10MBクォータを確認し、出所を記録します。
7. イシューとコメント
-
イシューの作成:
POST /api/v1/users/{username}/buckets/{bucket}/issues Authorization: Bearer <token> Content-Type: application/json { "title": "電卓スキル翻訳のバグ", "body": "翻訳時に算術式が正しく処理されない…" }- レスポンス:
201 Created、Location: /api/v1/users/{username}/buckets/{bucket}/issues/{issue_id}を伴う。
- レスポンス:
-
イシューのリスト:
GET /api/v1/users/{username}/buckets/{bucket}/issues -
コメントの追加:
POST /api/v1/users/{username}/buckets/{bucket}/issues/{issue_id}/comments Authorization: Bearer <token> Content-Type: application/json { "body": "この問題を調査します。" }
8. エラーレスポンス形式
すべてのエンドポイントは、エラー時に統一されたJSONボディを返します:
{
"error": {
"code": "validation_failed",
"message": "アセットの検証に失敗しました",
"details": [
{"rule": "required_file_missing", "path": "SKILL.md", "message": "必須ファイルが見つかりません"}
]
}
}
- エラーコード:
bucket_quota_exceeded、bucket_storage_exceeded、bucket_name_taken、validation_failed、unauthorized、not_found、conflict。 - HTTPステータスコードはセマンティックな意味と一致します:
400(不正なリクエスト)、401(認証なし)、403(禁止)、404(見つかりません)、409(競合)、413(ペイロードが大きすぎる)、422(処理不可能なエンティティ)。
ベストプラクティス
- バンドルされたクライアント (
rb.mjs) を優先する: 手作りのHTTP呼び出しよりも、オリジンの正規化、アトミック書き込み、ファイルパーミッションを正しく処理します。 - 認証情報の安全性: トークンを決して露出させず、安全なファイルベースのストレージを使用し、ブラウザハンドオフフローに従います。
- 三つの名前ルールに従う: ユーザーを混乱させる可能性があるため、
copy、install-script、translated fetchを混同しないでください。 - レート制限を尊重する: デバイスコードフローでは
intervalパラメータに従ってポーリングし、サーバーに過剰な負荷をかけないでください。 - ファイルの安全性: 不完全な書き込みを防ぐため、ファイル書き込みには常に一時ファイル→リネームのパターンを使用します。
- エラーの伝達: ユーザーに生のエラーコードとメッセージを表示し、対処法を提案します。
- 状態管理: フェッチ結果をキャッシュするか、リクエスト間でトークンを再利用して、不要なAPI呼び出しを減らします。
- 翻訳の認識:
translatedエンドポイントは可逆的である場合とそうでない場合があります。X-Red-Bucket-Lossyヘッダーをチェックして、変換中に情報が失われたかどうかを判断します。