jpskill.com
🛠️ 開発・MCP コミュニティ

debug-connection

CLIとFigJamプラグイン間のWebSocket接続で、図の同期エラーや接続失敗が発生した場合に、その原因を特定し問題を解決するSkill。

📜 元の英語説明(参考)

Debug WebSocket connection issues between CLI and FigJam plugin. Use when diagrams aren't syncing or connection fails.

🇯🇵 日本人クリエイター向け解説

一言でいうと

CLIとFigJamプラグイン間のWebSocket接続で、図の同期エラーや接続失敗が発生した場合に、その原因を特定し問題を解決するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o debug-connection.zip https://jpskill.com/download/16764.zip && unzip -o debug-connection.zip && rm debug-connection.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/16764.zip -OutFile "$d\debug-connection.zip"; Expand-Archive "$d\debug-connection.zip" -DestinationPath $d -Force; ri "$d\debug-connection.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して debug-connection.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → debug-connection フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

WebSocket接続のデバッグ

アーキテクチャ

┌─────────────┐     WebSocket      ┌─────────────────┐    postMessage    ┌─────────────────┐
│  CLI serve  │ ◄───────────────► │  Plugin UI      │ ◄───────────────► │  Plugin Main    │
│  (Bun)      │   ws://...:3456   │  (ui.ts)        │                   │  (code.ts)      │
└─────────────┘                   └─────────────────┘                   └─────────────────┘
     │                                   │                                     │
     │ File watcher                      │ Browser APIs                        │ Figma API
     │ YAML parsing                      │ WebSocket client                    │ Canvas rendering
     └───────────────────────────────────┴─────────────────────────────────────┘

よくある問題と解決策

1. 接続拒否

症状: プラグインが "Connecting..." を無限に表示する

確認:

# CLI serve は実行されていますか?
ps aux | grep "figram serve"

# ポートが利用可能か確認 (デフォルト: 3456)
lsof -i :3456

解決策: bun run packages/cli/src/index.ts serve diagram.yaml で CLI を起動してください。

2. 接続が切断される

症状: 最初は動作するが、同期が停止する

確認:

  • プラグイン UI のコンソールで WebSocket のクローズイベントを確認してください。
  • CLI のターミナルでエラーメッセージを確認してください。

解決策: YAML のパースエラーがアップデートをブロックしていないか確認してください。

3. パッチが適用されない

症状: 接続されているが、キャンバスが更新されない

デバッグ手順:

  1. CLI の出力でパッチの生成を確認してください。
  2. プラグイン UI のコンソールで受信したメッセージを確認してください。
  3. プラグイン Main のコンソールでレンダリングエラーを確認してください。

4. YAML パースエラー

症状: CLI が検証エラーを表示する

解決策: YAML の構文とスキーマへの準拠を検証してください。

5. シークレットの不一致

症状: 接続は確立されるが、すぐに閉じられる

確認: --secret フラグの値が CLI とプラグインで一致していることを確認してください。

6. JSON インポートエラー

症状: インポートダイアログにエラーアラートが表示される

確認:

  • JSON はオブジェクトである必要があります。
  • DSL JSON は versiondocId、および nodes 配列が必要です。
  • IR JSON は versiondocId、および nodes オブジェクトが必要です。

解決策: アラートに表示される検証エラーを修正してください (パス + メッセージ)。

デバッグツール

CLI 側

# 詳細な出力で実行
DEBUG=* bun run packages/cli/src/index.ts serve diagram.yaml

# カスタムポートを指定
bun run packages/cli/src/index.ts serve diagram.yaml --port 8080

# 認証あり
bun run packages/cli/src/index.ts serve diagram.yaml --secret mysecret

プラグイン UI 側

  1. プラグイン UI を右クリック → Inspect
  2. コンソールで WebSocket イベントを確認してください。
  3. Network タブで WS フレームを確認してください。

プラグイン Main 側

  1. Figma Desktop → Plugins → Development → Open console
  2. レンダリングエラーを確認してください。

WebSocket プロトコル

プラグイン → CLI メッセージ

// 接続開始
interface HelloMessage {
  type: "hello";
  docId: string;
  secret?: string;  // サーバーが認証を必要とする場合
}

// フル同期のリクエスト (例: 再接続後)
interface RequestFullMessage {
  type: "requestFull";
  docId: string;
}

CLI → プラグイン メッセージ

// ドキュメント全体の同期
interface FullMessage {
  type: "full";
  rev: number;        // 現在のリビジョン番号
  ir: IRDocument;     // 完全に正規化されたドキュメント
}

// 差分アップデート
interface PatchMessage {
  type: "patch";
  baseRev: number;    // 期待される現在リビジョン
  nextRev: number;    // 適用後の新しいリビジョン
  ops: PatchOp[];     // 適用するオペレーション
}

// エラー通知
interface ErrorMessage {
  type: "error";
  message: string;
}

パッチオペレーション

type PatchOp =
  | { op: "upsertNode"; node: IRNode }
  | { op: "removeNode"; id: string }
  | { op: "upsertEdge"; edge: IREdge }
  | { op: "removeEdge"; id: string };

簡単な診断

# 1. CLI serve を起動 (デフォルトポート: 3456)
bun run packages/cli/src/index.ts serve examples/diagram.yaml

# 2. wscat で WebSocket をテスト (インストールされている場合)
wscat -c ws://localhost:3456

# 3. hello メッセージを送信
{"type":"hello","docId":"test"}

# 4. YAML が有効か確認
bun run packages/cli/src/index.ts build examples/diagram.yaml

メッセージフロー

Plugin                          CLI
  │                              │
  │──── HelloMessage ───────────►│  (docId, secret?)
  │                              │
  │◄──── FullMessage ───────────│  (rev, ir)
  │                              │
  │      [YAML file changes]     │
  │                              │
  │◄──── PatchMessage ──────────│  (baseRev, nextRev, ops)
  │                              │
  │      [Plugin reconnects]     │
  │                              │
  │──── RequestFullMessage ─────►│  (docId)
  │                              │
  │◄──── FullMessage ───────────│  (rev, ir)
  │                              │
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

WebSocket Connection Debugging

Architecture

┌─────────────┐     WebSocket      ┌─────────────────┐    postMessage    ┌─────────────────┐
│  CLI serve  │ ◄───────────────► │  Plugin UI      │ ◄───────────────► │  Plugin Main    │
│  (Bun)      │   ws://...:3456   │  (ui.ts)        │                   │  (code.ts)      │
└─────────────┘                   └─────────────────┘                   └─────────────────┘
     │                                   │                                     │
     │ File watcher                      │ Browser APIs                        │ Figma API
     │ YAML parsing                      │ WebSocket client                    │ Canvas rendering
     └───────────────────────────────────┴─────────────────────────────────────┘

Common Issues & Solutions

1. Connection Refused

Symptoms: Plugin shows "Connecting..." indefinitely

Check:

# Is CLI serve running?
ps aux | grep "figram serve"

# Check port availability (default: 3456)
lsof -i :3456

Solution: Start CLI with bun run packages/cli/src/index.ts serve diagram.yaml

2. Connection Drops

Symptoms: Works initially, then stops syncing

Check:

  • Plugin UI console for WebSocket close events
  • CLI terminal for error messages

Solution: Check for YAML parse errors blocking updates

3. Patches Not Applied

Symptoms: Connected but canvas doesn't update

Debug steps:

  1. Check CLI output for patch generation
  2. Check Plugin UI console for received messages
  3. Check Plugin Main console for rendering errors

4. YAML Parse Errors

Symptoms: CLI shows validation errors

Solution: Validate YAML syntax and schema compliance

5. Secret Mismatch

Symptoms: Connection established but immediately closed

Check: Ensure --secret flag value matches between CLI and plugin

6. JSON Import Errors

Symptoms: Import dialog shows an error alert

Check:

  • JSON must be an object
  • DSL JSON requires version, docId, and nodes array
  • IR JSON requires version, docId, and nodes object

Solution: Fix validation errors shown in the alert (path + message)

Debugging Tools

CLI Side

# Run with verbose output
DEBUG=* bun run packages/cli/src/index.ts serve diagram.yaml

# Specify custom port
bun run packages/cli/src/index.ts serve diagram.yaml --port 8080

# With authentication
bun run packages/cli/src/index.ts serve diagram.yaml --secret mysecret

Plugin UI Side

  1. Right-click plugin UI → Inspect
  2. Check Console for WebSocket events
  3. Check Network tab for WS frames

Plugin Main Side

  1. Figma Desktop → Plugins → Development → Open console
  2. Check for rendering errors

WebSocket Protocol

Plugin → CLI Messages

// Connection initiation
interface HelloMessage {
  type: "hello";
  docId: string;
  secret?: string;  // If server requires authentication
}

// Request full sync (e.g., after reconnection)
interface RequestFullMessage {
  type: "requestFull";
  docId: string;
}

CLI → Plugin Messages

// Full document sync
interface FullMessage {
  type: "full";
  rev: number;        // Current revision number
  ir: IRDocument;     // Complete normalized document
}

// Incremental update
interface PatchMessage {
  type: "patch";
  baseRev: number;    // Expected current revision
  nextRev: number;    // New revision after applying
  ops: PatchOp[];     // Operations to apply
}

// Error notification
interface ErrorMessage {
  type: "error";
  message: string;
}

Patch Operations

type PatchOp =
  | { op: "upsertNode"; node: IRNode }
  | { op: "removeNode"; id: string }
  | { op: "upsertEdge"; edge: IREdge }
  | { op: "removeEdge"; id: string };

Quick Diagnostic

# 1. Start CLI serve (default port: 3456)
bun run packages/cli/src/index.ts serve examples/diagram.yaml

# 2. Test WebSocket with wscat (if installed)
wscat -c ws://localhost:3456

# 3. Send hello message
{"type":"hello","docId":"test"}

# 4. Check YAML is valid
bun run packages/cli/src/index.ts build examples/diagram.yaml

Message Flow

Plugin                          CLI
  │                              │
  │──── HelloMessage ───────────►│  (docId, secret?)
  │                              │
  │◄──── FullMessage ───────────│  (rev, ir)
  │                              │
  │      [YAML file changes]     │
  │                              │
  │◄──── PatchMessage ──────────│  (baseRev, nextRev, ops)
  │                              │
  │      [Plugin reconnects]     │
  │                              │
  │──── RequestFullMessage ─────►│  (docId)
  │                              │
  │◄──── FullMessage ───────────│  (rev, ir)
  │                              │