Slack bot that bridges Slack threads to GitHub Copilot CLI via the Copilot SDK.
- Thread-safe message queueing with busy notices

- One-click interrupt to stop in-flight runs

- Incoming Slack attachments downloaded and sent to Copilot

- Copilot can return files that upload back to Slack

- Emoji reasoning summaries + live thinking status
- Interactive Block Kit responses (forms, buttons, checklists)

- Node.js 24+
- Slack app (Socket Mode enabled)
- GitHub Copilot CLI installed on host (or in container)
- Access to a Slack workspace for testing
npm installnpx @tiberriver256/github-copilot-slack-sdkFirst run creates:
bridge.config.yamlslack-app-manifest.yaml
If both files exist, onboarding is skipped and the app starts.
Create .env from docs/config/.env.sample and set required values.
npm run devnpm run startRequired:
SLACK_BOT_TOKEN: Bot token (xoxb-*)SLACK_APP_TOKEN: App-level token for Socket Mode (xapp-*)SLACK_SIGNING_SECRET: Signing secret for request validation
Optional:
NODE_ENV:development|test|production(default:development)HOST: Bind address (default:0.0.0.0)PORT: HTTP port (default:3000)APP_NAME: App name tag (default:github-copilot-slack-sdk)LOG_LEVEL:trace|debug|info|warn|error(default:info)SLACK_SOCKET_MODE:true|false(default:true)SLACK_APP_ID: App ID for diagnosticsSLACK_CLIENT_ID: OAuth client IDSLACK_CLIENT_SECRET: OAuth client secretSLACK_REDIRECT_URI: OAuth redirect URISLACK_ALLOWED_CHANNELS: Comma-separated allowlistSLACK_ALLOWED_USERS: Comma-separated allowlistSLACK_SELF_USER_ID: Optional self-echo guardSLACK_ACK_TIMEOUT_MS: Must be < 3000ms (default:2500)COPILOT_CLI_PATH: Copilot CLI path (default:copilot)COPILOT_MODEL: Model name (default:gpt-5)COPILOT_STREAMING:true|false(default:true)COPILOT_SESSION_TIMEOUT_MS:sendAndWaittimeout (default:120000)COPILOT_PERMISSION_POLICY:auto|deny|prompt(default:auto)BRIDGE_DATA_DIR: Data root (default:./data)BRIDGE_SESSION_STORE_PATH: Session store path override (default:${BRIDGE_DATA_DIR}/session-store.json)BRIDGE_WORKDIR: Copilot workdir (default:./workspace)BRIDGE_SANDBOX:host|docker(default:host)BRIDGE_SANDBOX_IMAGE: Docker image (used whenBRIDGE_SANDBOX=docker)BRIDGE_SANDBOX_NETWORK: Docker networkBRIDGE_SANDBOX_NAME: Docker container name for attachment copyBRIDGE_MCP_ENABLED:true|false(default:false)BRIDGE_MCP_CONFIG_PATH: MCP server config fileBRIDGE_MCP_TOOL_ALLOWLIST: Tool allowlistBRIDGE_MCP_TOOL_DENYLIST: Tool denylistREDACT_KEYS: CSV list of keys to redact in logs
- Verify Socket Mode enabled.
- Confirm
SLACK_APP_TOKENstarts withxapp-. - Check bot is installed in the workspace.
- Inspect logs for retry headers and
app_rate_limitedevents.
- Confirm handlers
ack()immediately and do heavy work async. - Check event retries (
X-Slack-Retry-Num) and dedupe logic.
- Validate
COPILOT_CLI_PATHand CLI auth session. - Check CLI version compatibility with SDK.
- Confirm sandbox/working directory permissions.
- Inspect
BRIDGE_SESSION_STORE_PATHfor stale or corrupt records. - Check thread key:
channel:threadTs.
npm run dev- run in watch mode withtsxnpm run build- compile TypeScript todist/npm run start- run the compiled appnpm test- run Node test runnernpm run typecheck- type check without emitnpm run lint- lint TypeScript sourcesnpm run format- format with Prettiernpm run format:check- check Prettier formattingnpm run check- lint + typecheck + format check
src/- source codedist/- build outputdocs/- architecture and usage notes
docs/config/ENV_SCHEMA.mddocs/copilot-cli-sdk-bootstrap.mddocs/slack/slack-app-manifest.yamldocs/onboarding.mddocs/session-store.md