multiAI Summary Pending
debug-connection
Debug WebSocket connection issues between CLI and FigJam plugin. Use when diagrams aren't syncing or connection fails.
231 stars
Installation
Claude Code / Cursor / Codex
$curl -o ~/.claude/skills/debug-connection/SKILL.md --create-dirs "https://raw.githubusercontent.com/aiskillstore/marketplace/main/skills/7nohe/debug-connection/SKILL.md"
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/debug-connection/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How debug-connection Compares
| Feature / Agent | debug-connection | Standard Approach |
|---|---|---|
| Platform Support | multi | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Debug WebSocket connection issues between CLI and FigJam plugin. Use when diagrams aren't syncing or connection fails.
Which AI agents support this skill?
This skill is compatible with multi.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# 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**:
```bash
# 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
```bash
# 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
```typescript
// 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
```typescript
// 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
```typescript
type PatchOp =
| { op: "upsertNode"; node: IRNode }
| { op: "removeNode"; id: string }
| { op: "upsertEdge"; edge: IREdge }
| { op: "removeEdge"; id: string };
```
## Quick Diagnostic
```bash
# 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)
│ │
```