debug-connection
npx machina-cli add skill aiskillstore/marketplace/debug-connection --openclawWebSocket 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:
- Check CLI output for patch generation
- Check Plugin UI console for received messages
- 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, andnodesarray - IR JSON requires
version,docId, andnodesobject
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
- Right-click plugin UI → Inspect
- Check Console for WebSocket events
- Check Network tab for WS frames
Plugin Main Side
- Figma Desktop → Plugins → Development → Open console
- 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)
│ │
Source
git clone https://github.com/aiskillstore/marketplace/blob/main/skills/7nohe/debug-connection/SKILL.mdView on GitHub Overview
This skill helps diagnose WebSocket connection problems between the Bun-based CLI server and the FigJam plugin UI/Main. It covers common failure modes that prevent diagrams from syncing, such as connection refusals, drops, patch application failures, YAML parse errors, and secret mismatches, so teams can restore reliable real-time updates.
How This Skill Works
The troubleshooting workflow analyzes the WebSocket bridge across CLI, Plugin UI, and Plugin Main. It checks the default port (3456), inspects WebSocket traffic and console logs on the UI and Main, and follows a structured set of checks from connection initiation to full document sync, including YAML validation and authentication if configured.
When to Use It
- Plugin shows Connecting... indefinitely (Connection Refused).
- Connections drop after initial sync (Connection Drops).
- Canvas does not update despite a connected state (Patches Not Applied).
- YAML syntax or schema errors block updates (YAML Parse Errors).
- Connection closes immediately after establishment (Secret Mismatch).
Quick Start
- Step 1: Start the CLI server: bun run packages/cli/src/index.ts serve diagram.yaml (default port 3456).
- Step 2: Open the plugin UI and use Inspect to check the Console and Network (WS frames) for activity.
- Step 3: If issues persist, run with verbose debugging: DEBUG=* bun run packages/cli/src/index.ts serve diagram.yaml --port 8080
Best Practices
- Ensure the CLI server is running and listening on the expected port (default 3456).
- Enable verbose debugging to surface WebSocket events (DEBUG=*).
- Inspect Plugin UI Console, Network tab, and Plugin Main console for errors and WS frames.
- Validate YAML syntax and schema before attempting a sync.
- Verify the --secret flag value matches between the CLI and the plugin.
Example Use Cases
- CLI serve is not running, causing the plugin to show a perpetual Connecting... state (Connection Refused).
- Patches are generated but the Plugin UI stops receiving updates (Canvas not updating).
- YAML parse errors appear in the CLI logs blocking updates (YAML Parse Errors).
- Connection established but immediately closed due to a secret mismatch (Secret Mismatch).
- JSON import shows validation errors; fix by ensuring JSON is an object with version, docId, and nodes.