voice-diagram-comment/.claude/skills/setting-up-comment-tool/SKILL.md
snc 6cba1f1351 initial commit
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 21:22:21 +09:00

295 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: setting-up-comment-tool
description: 音声図解コメントツールの初期セットアップVercel・Neon・Gemini APIキーを対話的にガイドするスキル。「セットアップして」「セットアップの続きをして」「コメントツールをセットアップして」「フィードバック機能を設定して」「音声図解コメントツールを使えるようにして」と依頼された際、および「コメントが保存されません」などセットアップ起因のトラブル調査を求められた際に使用する。
---
# Setting Up Comment Tool
図解に対するコメント機能テキスト引用・ピン・音声を使えるようにする初期セットアップ。Vercelホスティング・Neon Postgresデータベース・Gemini APIキー音声解析の設定を対話的にガイドする。
**実行するのは1回だけ。** セットアップ完了後は、図解を作ってsurge.shにデプロイするだけで自動的にコメント機能が付く。
## 用語の定義
- **ツールフォルダ**: このツール本体(`package.json` の name が `voice-diagram-comment-tool` のフォルダ)。`npm` / `vercel` コマンドはすべてここで実行する
- **リポジトリルート**: `.claude` フォルダがある階層。`fb-tool-url.txt` / `fb-api-token.txt` はここに保存する(デプロイスクリプトがここから読むため)
## Step 0: ツールフォルダの特定
1. ワークスペースのルートに `package.json` があり、name が `voice-diagram-comment-tool` なら、ルートがツールフォルダ(単体利用)
2. なければ、ワークスペース内から name が `voice-diagram-comment-tool``package.json` を探す(別リポジトリに組み込んだ利用。フォルダ名は通常 `voice-diagram-comment`
3. 見つからない場合、以下を伝えて終了:
> ツール本体のフォルダが見つかりません。「voice-diagram-comment」音声図解コメントツールフォルダがこのリポジトリ内にあるか確認してください。
## 前提確認
### Node.js
```bash
node --version
```
バージョン番号が表示された → 次に進む。
`command not found``.claude/skills/creating-visual-explainers/references/node-install-guide.md` の手順でインストールを案内する。
### Vercel CLI
```bash
vercel --version
```
バージョン番号が表示された → 次に進む。
`command not found` → 以下を実行:
```bash
npm install -g vercel
```
## ワークフロー
以降のコマンドは、明記がない限り**ツールフォルダで実行する**。
### Step 1: 依存関係のインストール
```bash
npm install
```
### Step 2: Vercelにログイン
```bash
vercel login
```
ブラウザが開く。以下を伝える:
> ブラウザでVercelのログイン画面が開きます。
> アカウントを持っていない場合は「Sign Up」から無料アカウントを作成してください。
> メールアドレスまたはGitHubアカウントで登録できます。
> ログインが完了したら、ターミナルに戻ってください。
### Step 3: Vercelに初回デプロイ
先にデプロイしてVercelプロジェクトを作成する環境変数の設定にはプロジェクトが必要なため
自動命名に任せると名前の衝突などで不正になることがある。最初にプロジェクト名を明示してリンクする:
```bash
vercel link --yes --project voice-diagram-comment-tool
```
(同名プロジェクトが既にある等でエラーになったら、`voice-comment-tool-2` のように名前を変えて再実行する)
続いて本番デプロイ:
```bash
vercel --yes --prod
```
デプロイが完了すると以下の2つのURLが出力される。両方を控えておく:
- **Inspect URL**: `https://vercel.com/{slug}/{project}/...` 形式Step 6 で使う)
- **Production URL**: `https://xxx.vercel.app` 形式最終的なツールURL
この時点では環境変数が未設定なのでツールはまだ動かない。そのまま次に進む。
### Step 4: APIトークンの生成と設定
APIを保護するためのトークンを生成し、Vercelの環境変数に設定する。
```bash
openssl rand -hex 16
```
**WindowsPowerShellの場合:**
```powershell
[System.Guid]::NewGuid().ToString("N")
```
表示された文字列がトークン。これを環境変数として設定する:
```bash
echo "生成したトークン" | vercel env add API_TOKEN production
```
「生成したトークン」は実際に生成した値に置き換える。`vercel env add` が対話式プロンプトを出さずに値を受け取るよう、パイプで渡す。
同じトークンを**リポジトリルート**の `fb-api-token.txt` に保存する1行、トークンのみ
### Step 5: Gemini APIキーの設定
音声フィードバック喋った内容をAIが聞き取って図解にピンを配置する機能に使うAPIキーを設定する。
ユーザーに以下を案内する:
> 音声フィードバックには Google の Gemini というAIを使います。無料のAPIキーを発行しましょう。
>
> 1. ブラウザで https://aistudio.google.com/apikey を開く
> 2. Googleアカウントでログイン
> 3. 「APIキーを作成」Create API keyをクリック
> 4. 表示されたキー(`AIza...` で始まる文字列)をコピー
> 5. コピーしたキーをこのチャット欄に貼り付けてください
>
> 無料枠の範囲で使えます。クレジットカードの登録は不要です。
キーを受け取ったら設定する:
```bash
echo "受け取ったAPIキー" | vercel env add GEMINI_API_KEY production
```
**注意**: 受け取ったAPIキーは環境変数の設定にだけ使う。ファイルに書き出したり、チャットの返答で復唱したりしない。
### Step 6: データベースの追加
Step 3 の Inspect URL からデプロイID部分末尾のランダム文字列を削り、`/stores` を付けて Storage ページの直接URLを組み立てる。
例: Inspect URL が `https://vercel.com/your-projects/voice-diagram-comment-tool/abc123xyz` なら
`https://vercel.com/your-projects/voice-diagram-comment-tool/stores`
ユーザーにブラウザでの操作を案内する。以下の `{StorageページURL}` を組み立てたURLに置き換えて伝える:
> コメントを保存するデータベースを追加します。ブラウザで以下のURLを開いてください。
>
> {StorageページURL}
>
> ページが開いたら、以下の操作をしてください。
>
> 1. 「Create Database」をクリック
> 2. 「Neon Postgres」を選択
> 3. プランは「Free」を選択無料、クレジットカード不要
> 4. 「Create」をクリック
> 5. 次の画面で:
> - 「Search Projects」からプロジェクトを選択
> - 「Custom Prefix」の欄を `DATABASE` に変更
> - 「Connect」をクリック
>
> 完了したら教えてください。
### Step 7: 環境変数の取得とマイグレーション
```bash
vercel env pull .env.local
```
テーブルを作成:
```bash
npm run db:migrate
```
`Migration complete.` と表示されれば成功。
### Step 8: 再デプロイ
環境変数を反映するため、もう一度デプロイする。
```bash
vercel --prod
```
### Step 9: URLを保存する
ツールの**固定URL**`https://プロジェクト名.vercel.app` 形式。通常は `https://voice-diagram-comment-tool.vercel.app`)を、**リポジトリルート**の `fb-tool-url.txt` に書き出す。URLのみを1行で保存する。
**注意**: `vercel --prod` の出力に表示されるランダム文字列入りのURL例: `https://voice-diagram-comment-tool-a1b2c3-xxx.vercel.app`は保存しない。デプロイ固有URLはVercelの保護機能により外部から読めないことがある。
保存したら、公開ページから widget.js に到達できることを確認する:
```bash
curl -s -o /dev/null -w "%{http_code}" "$(cat fb-tool-url.txt)/widget.js"
```
**WindowsPowerShellの場合:**
```powershell
(Invoke-WebRequest "$((Get-Content fb-tool-url.txt).Trim())/widget.js").StatusCode
```
`200` ならOK。`404` や `401` が返る場合は、Vercelダッシュボードのプロジェクト → Settings → Domains に表示されているドメインを確認し、そのURLで `fb-tool-url.txt` を保存し直して再確認する。
### Step 10: 音声解析APIの通し検証
widget.js は静的ファイルなので、これだけではAPIサーバーレス関数が動いている保証にならない。無音の音声データを実際に `/api/voice-analyze` へ送り、Gemini まで通ることを確認する。
まず、16kHz・モラル・1秒の無音WAVを生成してbase64化し、リクエストボディを組み立てる**リポジトリルート**で実行):
```bash
node -e '
const sr = 16000, dataLen = sr * 2; // 16bit mono 1秒
const b = Buffer.alloc(44 + dataLen);
b.write("RIFF", 0); b.writeUInt32LE(36 + dataLen, 4); b.write("WAVE", 8);
b.write("fmt ", 12); b.writeUInt32LE(16, 16); b.writeUInt16LE(1, 20); b.writeUInt16LE(1, 22);
b.writeUInt32LE(sr, 24); b.writeUInt32LE(sr * 2, 28); b.writeUInt16LE(2, 32); b.writeUInt16LE(16, 34);
b.write("data", 36); b.writeUInt32LE(dataLen, 40);
const body = {
audioBase64: b.toString("base64"),
mimeType: "audio/wav",
targets: [{ index: 0, text: "テスト", heading: "テスト", isHeading: true }],
};
require("fs").writeFileSync("/tmp/fb-voice-check.json", JSON.stringify(body));
'
```
**WindowsPowerShellの場合**: 上と同じ `node -e` スクリプトを実行し、出力先だけ `$env:TEMP + "\\fb-voice-check.json"` に読み替える(`node -e` はWindowsでも動く
続いて、APIトークンを付けてPOSTする:
```bash
curl -s -w "\n%{http_code}" -X POST "$(cat fb-tool-url.txt)/api/voice-analyze" \
-H "Authorization: Bearer $(cat fb-api-token.txt)" \
-H "Content-Type: application/json" \
--data @/tmp/fb-voice-check.json
```
結果の判定:
- **HTTP 200 で `{"results":[]}`**(無音なので空配列)→ 音声解析まで通しで動いている。セットアップ成功
- **HTTP 404** → APIルートがデプロイされていない。Vercelのビルド設定の問題エラー対応の「音声の解析に失敗しました」を参照
- **`Gemini エラー` を含む応答** → Geminiのモデル名またはAPIキーの問題エラー対応の「Gemini エラー (404)」を参照)
- **HTTP 403** → `fb-api-token.txt` の値と Vercel の `API_TOKEN` が食い違っている。Step 4 をやり直す
### Step 11: 完了報告
リポジトリルートに `fb-tool-url.txt``fb-api-token.txt` があることを確認し、以下を伝える:
```
セットアップ完了
あなたのコメントツール URL:
https://xxx.vercel.app
以降「図解を作って」と伝えるだけで、コメント機能付きの図解が公開されます。
公開した図解では、3通りの方法でフィードバックできます:
- テキストをマウスで選択してコメント
- 好きな場所にピンを刺してコメント
- マイクに向かって喋るだけAIが該当箇所にピンを自動配置
APIはトークンで保護されています。図解のデプロイ時に自動で埋め込まれるため、
追加の操作は不要です。
```
`fb-tool-url.txt` / `fb-api-token.txt` / `.env.local` はGitにコミットしないこのフォルダの `.gitignore` で除外済み。別リポジトリに組み込んでいる場合は、そのリポジトリの `.gitignore` にも追加するよう案内する)。
## エラー対応
エラーメッセージをそのまま見せず、何が起きていて何をすれば解決するかを平易に説明する。
- **`vercel: command not found`** → `npm install -g vercel` を実行
- **`DATABASE_URL is not set`** → Step 6のデータベース追加が完了しているか確認。完了していれば `vercel env pull .env.local` を再実行
- **マイグレーション失敗** → ツールフォルダの `.env.local``DATABASE_URL` が含まれているか確認
- **音声フィードバックで「GEMINI_API_KEY が未設定です」** → Step 5が完了しているか `vercel env ls` で確認し、設定後に `vercel --prod` で再デプロイ
- **「音声の解析に失敗しました」** → まず `/api/voice-analyze` が404を返していないか確認する`curl -s -o /dev/null -w "%{http_code}" -X POST "$(cat fb-tool-url.txt)/api/voice-analyze"` — 404以外APIは存在する。404ならAPIルートがデプロイされていない。原因はVercelのビルド設定: `vercel.json``buildCommand` を直接書くとVercelがNext.jsを認識できず、APIが生成されない。ツールフォルダの `vercel.json``{"framework": "nextjs"}` のみで、`package.json` に `vercel-build` スクリプトがあることを確認し、`vercel --prod` で再デプロイする
- **「Gemini エラー (404)」** → 指定中のGeminiモデルが新規APIキーでは利用不可になっている例: `gemini-2.5-flash` は新規ユーザーに提供終了)。`echo "gemini-flash-latest" | vercel env add GEMINI_MODEL production` で環境変数を設定し、`vercel --prod` で再デプロイする(ツールが最新版なら既定値が `gemini-flash-latest` のためこのエラーは起きない)
- **「コメントが保存されません」と相談された** → 順に切り分ける: ①Step 9の到達確認widget.js が200か②`vercel env ls` で `DATABASE_URL``API_TOKEN` が production にあるか ③マイグレーション済みか(`vercel env pull .env.local` → `npm run db:migrate`)④環境変数を後から足した場合は `vercel --prod` で再デプロイしたか
## 依存
- ツールフォルダの `package.json` — 依存関係と `db:migrate` スクリプト
- ツールフォルダの `scripts/migrate.ts` — DBマイグレーションスクリプト
- `.claude/skills/creating-visual-explainers/references/node-install-guide.md` — Node.jsインストール手順
- `.claude/skills/creating-visual-explainers/scripts/deploy-diagram.sh``fb-tool-url.txt` / `fb-api-token.txt` の読み取り側