{"id":46638140,"url":"https://github.com/ericchansen/wingman","last_synced_at":"2026-03-11T00:05:18.038Z","repository":{"id":342743740,"uuid":"1174978256","full_name":"ericchansen/wingman","owner":"ericchansen","description":"The open-source chat app for the GitHub Copilot SDK. One command → full-featured chat with MCP, skills, agents, and all 63 SDK event types.","archived":false,"fork":false,"pushed_at":"2026-03-08T05:01:02.000Z","size":201,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-08T05:36:14.102Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ericchansen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-07T04:10:32.000Z","updated_at":"2026-03-08T05:01:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ericchansen/wingman","commit_stats":null,"previous_names":["ericchansen/wingman"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/ericchansen/wingman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fwingman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fwingman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fwingman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fwingman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericchansen","download_url":"https://codeload.github.com/ericchansen/wingman/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fwingman/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30349619,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T15:55:29.454Z","status":"ssl_error","status_checked_at":"2026-03-10T15:54:58.440Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-08T02:12:38.489Z","updated_at":"2026-03-11T00:05:18.030Z","avatar_url":"https://github.com/ericchansen.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🦜 Wingman\n\nThe open-source chat app for the [GitHub Copilot SDK](https://github.com/features/copilot).\n\n```bash\ngit clone https://github.com/ericchansen/wingman.git\ncd wingman \u0026\u0026 pnpm install \u0026\u0026 pnpm dev\n```\n\n**One command → full-featured chat.** MCP servers auto-discovered, skills loaded, all 51 SDK event types handled, model switching, mode control, abort support — everything works out of the box.\n\n## Why Wingman?\n\n**No turnkey chat frontend exists for the GitHub Copilot SDK.** Every team building on the SDK writes their own streaming UI, event handling, session management, and MCP wiring from scratch. Wingman is the first project to package all of that into a complete, production-ready chat app.\n\n### What's included\n\n- **All 51 SDK event types** handled — token tracking, thinking blocks, tool status, context health\n- **MCP server auto-discovery** from Copilot CLI plugins — zero config\n- **Skills and agents** wired automatically\n- **Model switching** — pick any available model from the UI\n- **Mode control** — interactive / plan / autopilot toggle\n- **Session persistence** — chat history with auto-naming\n- **Abort support** — cancel in-flight requests\n- **Token usage** — live input/output token counter\n- **Context health** — truncation and compaction warnings\n- **OpenTelemetry** — built-in observability (opt-in)\n- **Theming** — dark/light/system, fully customizable via config\n- **Easy skinning** — swap colors, logo, system prompt in \u003c 10 lines of config\n\n### The boring default\n\nOut of the box, Wingman is intentionally boring — a clean, generic chat interface. This makes it trivial to skin for your use case:\n\n```typescript\n// wingman.config.ts\nimport { defineConfig } from '@wingmanjs/core/config';\n\nexport default defineConfig({\n  systemPrompt: 'You are a sales intelligence assistant named Clippy...',\n  ui: {\n    title: 'Clippy Sales',\n    logo: './clippy-icon.svg',\n    theme: 'dark',\n    welcomeMessage: \"It looks like you're prepping for a meeting! 📎\",\n    suggestions: ['Show my pipeline', 'Brief me on Contoso'],\n  },\n});\n```\n\n## Packages\n\n| Package | npm | Description |\n|---------|-----|-------------|\n| `@wingmanjs/core` | [![npm](https://img.shields.io/npm/v/@wingmanjs/core)](https://npmjs.com/package/@wingmanjs/core) | Core SDK wrapper, session management, MCP discovery, Express server |\n| `@wingmanjs/react` | [![npm](https://img.shields.io/npm/v/@wingmanjs/react)](https://npmjs.com/package/@wingmanjs/react) | React 19 hooks + shadcn/ui components |\n| `create-wingman-app` | [![npm](https://img.shields.io/npm/v/create-wingman-app)](https://npmjs.com/package/create-wingman-app) | Project scaffolding CLI |\n\n## Quick Start\n\n### Prerequisites\n\n- Node.js 20.11+\n- GitHub Copilot CLI (optional — enables plugin-based MCP server discovery)\n\n### Create a new app\n\n\u003e **Note:** `create-wingman-app` is not yet implemented. For now, clone the repo directly:\n\n```bash\ngit clone https://github.com/ericchansen/wingman.git\ncd wingman\npnpm install\npnpm dev\n```\n\nOpen `http://localhost:3000` — you have a working chat.\n\n### Install MCP server plugins (optional)\n\nWingman auto-discovers MCP servers from installed Copilot CLI plugins:\n\n```bash\ncopilot plugin install mcaps-microsoft/MSX-MCP    # Sales data\ncopilot plugin install workiq@copilot-plugins      # M365 data\n```\n\nRestart your app — the new tools appear automatically.\n\n## Configuration\n\nEverything is controlled via `wingman.config.ts`:\n\n```typescript\nimport { defineConfig } from '@wingmanjs/core/config';\n\nexport default defineConfig({\n  // Agent behavior\n  systemPrompt: 'You are a helpful assistant.',\n  model: 'claude-sonnet-4',\n  reasoningEffort: 'medium',\n\n  // MCP servers (merged with auto-discovered servers)\n  mcpServers: {},\n\n  // Custom tools\n  tools: ['./src/tools/*.ts'],\n\n  // UI\n  ui: {\n    title: 'Wingman',\n    theme: 'system',\n    showTokenUsage: true,\n    showModelPicker: true,\n    showModeSwitcher: true,\n    showDebugPanel: false,\n  },\n\n  // Server\n  server: {\n    port: 3000,\n    transport: 'sse',\n  },\n\n  // Observability (opt-in)\n  telemetry: {\n    enabled: false,\n    exporter: 'console',\n  },\n});\n```\n\n\u003e **Security note:** CORS is enabled by default (`cors: true`) with `Access-Control-Allow-Origin: *`. This is fine for local development but should be restricted or disabled for production deployments with authentication.\n\n## Architecture\n\n```\nReact SPA (Vite) ──→ SSE ──→ Express Server ──→ WingmanClient ──→ MCP Servers\n                                                           │\n                                                    CopilotClient\n                                                     (SDK core)\n```\n\nWingman follows the **\"Thin App, Smart Agent\"** pattern. The frontend is a thin rendering layer over the Copilot SDK — all intelligence lives in the SDK's agent core. Wingman's job is to faithfully render all SDK events and provide clean input/output channels.\n\n## Local OTel Debugging\n\nWingman emits OpenTelemetry spans for every chat turn, tool call, subagent, and MCP discovery stage. To see them locally:\n\n### Option A — Console (zero setup)\n\n```typescript\n// wingman.config.ts\nexport default defineConfig({\n  telemetry: { enabled: true, exporter: 'console' },\n});\n```\n\nSpans print to stdout in JSON on every request.\n\n### Option B — Jaeger (recommended for tracing UI)\n\n```bash\ndocker run -d --name jaeger \\\n  -p 16686:16686 -p 4318:4318 \\\n  jaegertracing/all-in-one:latest\n```\n\n```typescript\nexport default defineConfig({\n  telemetry: {\n    enabled: true,\n    exporter: 'otlp',\n    endpoint: 'http://localhost:4318/v1/traces',\n  },\n});\n```\n\nOpen `http://localhost:16686` → select service `wingman`.\n\n### Option C — .NET Aspire Dashboard\n\n```bash\ndocker run -d --name aspire \\\n  -p 18888:18888 -p 4318:18890 \\\n  mcr.microsoft.com/dotnet/aspire-dashboard:latest\n```\n\n```typescript\nexport default defineConfig({\n  telemetry: {\n    enabled: true,\n    exporter: 'otlp',\n    endpoint: 'http://localhost:4318/v1/traces',\n    serviceName: 'wingman',\n  },\n});\n```\n\nOpen `http://localhost:18888`.\n\n### What's traced\n\n| Span | Description |\n|------|-------------|\n| `{METHOD} {ROUTE}` (auto) | Every HTTP request from Express auto-instrumentation (e.g. `GET /api/chat`) |\n| `chat {model}` | One per `sendMessage` call — contains token usage |\n| `tools/call {toolName}` | One per tool execution, child of chat span |\n| `invoke_agent {agentName}` | One per subagent, child of chat span |\n| `mcp.discovery` | Full MCP server discovery run |\n| `mcp.discovery.stage1_builtins` … `stage5` | Per-stage child spans |\n| `mcp.connect` | MCP server connection lifecycle |\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericchansen%2Fwingman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericchansen%2Fwingman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericchansen%2Fwingman/lists"}