windsurf-webhooks-events
Provides a guide to building custom Windsurf extensions and integrating them with VS Code workspace events.
Install
mkdir -p .claude/skills/windsurf-webhooks-events && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8350" && unzip -o skill.zip -d .claude/skills/windsurf-webhooks-events && rm skill.zipInstalls to .claude/skills/windsurf-webhooks-events
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Build Windsurf extensions and integrate with VS Code extension API events.Key capabilities
- →Scaffold new extensions using the VS Code generator
- →Monitor workspace events like file saves and active editor changes
- →Capture terminal output for error or failure patterns
- →Configure custom extension settings via package.json
- →Package extensions into .vsix files for installation
- →Debounce event transmissions to external webhooks
How it works
The skill utilizes the VS Code Extension API to register listeners for workspace events, which are then processed and optionally transmitted to an external URL via fetch. Developers scaffold the project using the yo generator and define configuration properties in package.json to manage extension behavior.
Inputs & outputs
When to use windsurf-webhooks-events
- →Build custom editor extensions
- →Track workspace editor events
- →Integrate external tools via extensions
- →Develop custom IDE plugins
About this skill
Windsurf Extension Development & Events
Overview
Windsurf is built on VS Code and supports the full VS Code Extension API. Build custom extensions to track workspace events, integrate with external tools, and extend Cascade's capabilities. This skill covers extension development specific to the Windsurf environment.
Prerequisites
- Node.js 18+ and npm
- VS Code Extension API familiarity
yoandgenerator-codefor scaffolding- Windsurf IDE for testing
Instructions
Step 1: Scaffold Extension
# Install scaffolding tools
npm install -g yo generator-code
# Generate extension
yo code
# Select: New Extension (TypeScript)
# Name: my-windsurf-extension
Step 2: Track Workspace Events
// src/extension.ts
import * as vscode from "vscode";
export function activate(context: vscode.ExtensionContext) {
console.log("Extension active in Windsurf");
// Track file saves
const saveListener = vscode.workspace.onDidSaveTextDocument(
async (document) => {
const diagnostics = vscode.languages.getDiagnostics(document.uri);
const errors = diagnostics.filter(
(d) => d.severity === vscode.DiagnosticSeverity.Error
);
if (errors.length > 0) {
vscode.window.showWarningMessage(
`${document.fileName}: ${errors.length} error(s) after save`
);
}
}
);
// Track active editor changes
const editorListener = vscode.window.onDidChangeActiveTextEditor(
(editor) => {
if (editor) {
const lang = editor.document.languageId;
const lines = editor.document.lineCount;
console.log(`Opened: ${editor.document.fileName} (${lang}, ${lines} lines)`);
}
}
);
// Track terminal output
const terminalListener = vscode.window.onDidWriteTerminalData((event) => {
// Can monitor for specific patterns (errors, warnings)
if (event.data.includes("ERROR") || event.data.includes("FAIL")) {
vscode.window.showWarningMessage("Error detected in terminal output");
}
});
context.subscriptions.push(saveListener, editorListener, terminalListener);
}
Step 3: Send Events to External System
// src/webhook.ts
import * as vscode from "vscode";
interface WorkspaceEvent {
event: string;
file?: string;
language?: string;
timestamp: string;
metadata?: Record<string, unknown>;
}
async function sendEvent(event: WorkspaceEvent): Promise<void> {
const webhookUrl = vscode.workspace
.getConfiguration("windsurf-events")
.get<string>("webhookUrl");
if (!webhookUrl) return;
try {
await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(event),
});
} catch (err) {
console.warn("Webhook delivery failed:", err);
}
}
// Debounce frequent events
const debounceMap = new Map<string, NodeJS.Timeout>();
function debouncedSend(event: WorkspaceEvent, delayMs = 2000): void {
const key = `${event.event}:${event.file}`;
clearTimeout(debounceMap.get(key));
debounceMap.set(
key,
setTimeout(() => {
sendEvent(event);
debounceMap.delete(key);
}, delayMs)
);
}
Step 4: Extension package.json
{
"name": "windsurf-events",
"displayName": "Windsurf Events",
"version": "1.0.0",
"engines": { "vscode": "^1.85.0" },
"activationEvents": ["onStartupFinished"],
"main": "./dist/extension.js",
"contributes": {
"configuration": {
"title": "Windsurf Events",
"properties": {
"windsurf-events.webhookUrl": {
"type": "string",
"description": "URL to send workspace events to"
},
"windsurf-events.trackSaves": {
"type": "boolean",
"default": true,
"description": "Track file save events"
},
"windsurf-events.trackErrors": {
"type": "boolean",
"default": true,
"description": "Track terminal error events"
}
}
},
"commands": [
{
"command": "windsurf-events.showStatus",
"title": "Windsurf Events: Show Status"
}
]
}
}
Step 5: Build and Install
# Build
npm run compile
# or: npm run build
# Package as .vsix
npx vsce package
# Install in Windsurf
windsurf --install-extension windsurf-events-1.0.0.vsix
# Or publish to marketplace
npx vsce publish
Step 6: Test in Windsurf
1. Open Extension Development Host: F5 in Windsurf
2. A new Windsurf window opens with extension loaded
3. Open a file, save it, trigger events
4. Check Output panel > "Windsurf Events" channel
5. Verify webhook delivery (use https://webhook.site for testing)
Error Handling
| Issue | Cause | Solution |
|---|---|---|
| Extension not activating | Wrong activationEvents | Use onStartupFinished for always-on |
| Webhook fails | Network/URL issue | Queue locally, retry with backoff |
| High CPU usage | Too many listeners | Debounce frequent events (saves, edits) |
| API incompatibility | Windsurf vs VS Code version | Pin engines.vscode version |
vsce package fails | Missing fields | Add publisher, repository, license |
Examples
Team Analytics Extension
// Track AI acceptance rate per developer
vscode.languages.registerInlineCompletionItemProvider(
{ pattern: "**" },
{
provideInlineCompletionItems(document, position) {
// Log completion requests (don't interfere with Supercomplete)
console.log(`Completion at ${document.fileName}:${position.line}`);
return []; // Return empty -- let Windsurf handle completions
}
}
);
Quick Test Webhook
# Start a test webhook receiver
npx -y webhook-relay -p 3456
# Configure extension: windsurf-events.webhookUrl = "http://localhost:3456"
Resources
Next Steps
For multi-environment setup, see windsurf-multi-env-setup.
When not to use it
- →When requiring native Windsurf backend integration outside of the VS Code extension API
- →When attempting to modify core Windsurf IDE behavior without an extension
Prerequisites
Limitations
- →Requires pinning engines.vscode version to maintain compatibility
- →High CPU usage can occur if too many listeners are active without debouncing
- →Webhook delivery failures require local queuing and retry logic
How it compares
Unlike manual IDE configuration, this approach creates a persistent, event-driven extension that automates data collection and external tool integration directly within the Windsurf environment.
Compared to similar skills
windsurf-webhooks-events side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| windsurf-webhooks-events (this skill) | 0 | 27d | Review | Intermediate |
| browser-tools | 6 | 9mo | Review | Intermediate |
| browser-extension-builder | 6 | 6mo | No flags | Intermediate |
| obsidian-data-handling | 4 | 27d | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
browser-tools
Whamp
Lightweight Chrome automation toolkit with shared configuration, JSON-first output, and six focused scripts for starting, navigating, inspecting, capturing, evaluating, and cleaning up browser sessions.
browser-extension-builder
davila7
Expert in building browser extensions that solve real problems - Chrome, Firefox, and cross-browser extensions. Covers extension architecture, manifest v3, content scripts, popup UIs, monetization strategies, and Chrome Web Store publishing. Use when: browser extension, chrome extension, firefox addon, extension, manifest v3.
obsidian-data-handling
jeremylongshore
Implement vault data backup, sync, and recovery strategies. Use when building backup features, implementing data export, or handling vault synchronization in your plugin. Trigger with phrases like "obsidian backup", "obsidian sync", "obsidian data export", "vault backup strategy".
playwright-mcp-dev
microsoft
Explains how to add and debug playwright MCP tools and CLI commands.
upgrading-expo
sickn33
Upgrade Expo SDK versions
pnpm
antfu
Node.js package manager with strict dependency resolution. Use when running pnpm specific commands, configuring workspaces, or managing dependencies with catalogs, patches, or overrides.