From e5b28455523a371cda2e9173b445110b5dfbea24 Mon Sep 17 00:00:00 2001 From: yyamashita Date: Thu, 14 May 2026 23:32:46 +0900 Subject: Add Claude Code skills for golive band registration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - register-band: Web検索でSNS/メンバー情報を収集し、本番API経由でバンドを登録する - import-golive-events: golive APIからイベント出演者を一括取得し register-band で登録する Co-Authored-By: Claude Sonnet 4.6 --- .claude/settings.json | 13 ++++ .claude/skills/import-golive-events.md | 90 +++++++++++++++++++++++++ .claude/skills/register-band.md | 118 +++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 .claude/settings.json create mode 100644 .claude/skills/import-golive-events.md create mode 100644 .claude/skills/register-band.md diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..dc34f47 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "allow": [ + "Bash(curl -s *)", + "Bash(curl -sI *)", + "Bash(curl -sIL *)", + "Bash(curl -sk *)", + "Bash(curl -sL *)", + "Bash(npm run typecheck *)", + "Bash(npx tsc --noEmit *)" + ] + } +} diff --git a/.claude/skills/import-golive-events.md b/.claude/skills/import-golive-events.md new file mode 100644 index 0000000..ec03452 --- /dev/null +++ b/.claude/skills/import-golive-events.md @@ -0,0 +1,90 @@ +--- +description: golive.yyamashita.com からイベント情報を取得し、出演バンドを whoisband に一括登録する +--- + +# goliveイベント出演者インポートスキル + +golive の API からイベントを取得し、出演バンドをまとめて whoisband に登録する。 + +## 使い方 + +``` +/import-golive-events +``` + +オプション引数: +- 日付範囲: `/import-golive-events 2026-05-14 2026-06-14` +- バンド名絞り込み: `/import-golive-events keyword=渋谷` + +## 手順 + +### Step 1: golive APIからイベント取得 + +```bash +curl -s -H "X-Crawler-Access: f9a3c1e847b2d056" \ + "https://golive.yyamashita.com/api/events?limit=100&date_from=$(date +%Y-%m-%d)" \ + | python3 -c " +import json, sys, re + +data = json.load(sys.stdin) +events = data['events'] + +# artistフィールドから出演者名を抽出(/ または , で区切り) +bands = set() +for e in events: + artist = e.get('artist') or '' + # スラッシュ・読点・コンマで分割 + parts = re.split(r'[//、,,]', artist) + for p in parts: + name = p.strip() + if name: + bands.add(name) + +for b in sorted(bands): + print(b) +" +``` + +引数で日付が指定されていれば `date_from` / `date_to` に使う。複数ページある場合は `offset` を増やして繰り返す。 + +### Step 2: 既登録バンドとの差分を計算 + +```bash +curl -s "https://whoisband.yyamashita.com/api/bands" \ + | python3 -c "import json,sys; [print(b['name']) for b in json.load(sys.stdin)]" +``` + +Step1 で得たバンド名リストと照合し、**未登録のバンドのみ**を対象リストとする。 + +### Step 3: 各バンドを順番に登録 + +対象リストの各バンドについて `/register-band` スキルを実行する: + +- 1バンドずつ順番に処理する(並行実行しない) +- 登録成功・スキップ・エラーを記録していく +- エラーが出ても次のバンドへ進む(中断しない) + +### Step 4: 登録結果サマリを表示 + +``` +=== goliveイベント出演者 登録完了 === +取得イベント数: XX件 +抽出バンド数: XX件 +登録済みスキップ: XX件 +新規登録: XX件 +エラー: XX件 + +新規登録バンド: + - バンド名 → https://whoisband.yyamashita.com/bands/of/{id} + - ... + +エラー: + - バンド名: エラー内容 +``` + +## 注意事項 + +- `artist` フィールドが null のイベントはスキップする +- バンド名が1文字以下、または明らかにバンド名でない文字列(「他」「ゲスト」「TBA」など)はスキップする +- 同一バンドが複数イベントに出演していても重複登録しない(Step2で除外) +- ページネーション: golive APIは1回最大100件。イベント数が多い場合は `offset=100`, `offset=200` で繰り返す diff --git a/.claude/skills/register-band.md b/.claude/skills/register-band.md new file mode 100644 index 0000000..970e57c --- /dev/null +++ b/.claude/skills/register-band.md @@ -0,0 +1,118 @@ +--- +description: バンド名を受け取り、Web検索で情報を収集して whoisband.yyamashita.com の本番APIに登録する +--- + +# バンド登録スキル + +本番API(`https://whoisband.yyamashita.com`)に直接 POST してバンドとメンバーを登録する。 + +## 使い方 + +``` +/register-band BAND_NAME +``` + +例: `/register-band 東京事変` + +## 手順 + +### Step 1: 既存バンドの重複確認 + +```bash +curl -s "https://whoisband.yyamashita.com/api/bands" | python3 -c " +import json,sys +data=json.load(sys.stdin) +name='$ARGUMENTS'.strip() +matches=[b for b in data if b['name']==name or b['slug']==name.lower()] +print('FOUND:' + json.dumps(matches) if matches else 'NOT_FOUND') +" +``` + +既に登録済みであればその旨をユーザーに伝えてスキップする。 + +### Step 2: Web検索で情報収集 + +引数のバンド名を使い、WebSearch / WebFetch で以下を収集する: + +1. `{バンド名} バンド 公式` で日本語検索 +2. `{バンド名} band official site` で英語検索 +3. Wikipedia ページが見つかれば WebFetch で詳細取得(メンバー・概要) +4. 公式サイトが見つかれば WebFetch で SNS リンクを収集 +5. X アカウントは `{バンド名} band x.com OR twitter.com` で検索 + +収集対象: +- **活動拠点** (area): 出身地・拠点都市(例: "東京", "大阪") +- **ステータス** (status): 活動中→`active` / 活動休止→`hiatus` / 解散→`disbanded` +- **説明** (description): 200字以内の概要文(日本語) +- **リンク** (links): URL を下記 label で分類 + - `official` 公式サイト / `x` X(Twitter) / `instagram` / `youtube` / `spotify` + - `apple_music` / `wikipedia` / `soundcloud` / `bandcamp` / `tiktok` / `linktree` / `other` +- **メンバー** (members): 名前と担当パート一覧 + +### Step 3: 既存アーティストの確認 + +```bash +curl -s "https://whoisband.yyamashita.com/api/artists" +``` + +メンバー名と照合して既存/新規を振り分ける。 + +### Step 4: 新規アーティストを登録(メンバーがいる場合) + +メンバーごとに順番に実行してUUIDを取得する: + +```bash +curl -s -X POST "https://whoisband.yyamashita.com/api/artists" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "メンバー名", + "links": [], + "message": "golive自動登録" + }' +``` + +レスポンスの `id` フィールド(UUID)を控えておく。 + +### Step 5: バンドを登録 + +取得したメンバーの UUID を使って band を POST する: + +```bash +curl -s -X POST "https://whoisband.yyamashita.com/api/bands" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "バンド名", + "area": "活動拠点", + "status": "active", + "description": "説明文", + "links": [ + { "label": "official", "url": "https://..." }, + { "label": "x", "url": "https://x.com/..." } + ], + "members": [ + { "artist_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "role": "Vocal" }, + { "artist_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "role": "Guitar" } + ], + "message": "golive自動登録" + }' +``` + +`role` は複数パートを `"Vocal, Guitar"` のようにカンマ区切りで書ける。 +使えるロール: Vocal, Guitar, Bass, Drums, Keyboard, DJ, Strings, Brass, Percussion, Programming, Manipulator, Turntable, Other + +### Step 6: 結果確認 + +レスポンスの `id` からURLを生成してユーザーに提示: + +``` +登録完了: バンド名 +→ https://whoisband.yyamashita.com/bands/of/{id} +``` + +slug 重複エラー(409)が出た場合は `slug` フィールドを追加して別の値を指定して再実行する。 + +## 注意事項 + +- 情報が見つからないフィールドは省略(`area`, `description`, `links` はすべてオプション) +- メンバー情報が一切取れない場合は `members` を空配列にしてバンドのみ登録する +- 解散済みバンドは `status: "disbanded"` を設定する -- cgit v1.2.3