VS-code-agentic-framework-extension
Vibe code from anywhere using only your phone by setting up a Slack App and linking it to this extension.
How it works
The extension manages a Python Slack bot process (Socket Mode — no public URL needed) that bridges Slack and the claude CLI: your Slack messages become claude -p prompts, and Claude's replies get posted back into the same thread. It uses your existing claude login session, so no Anthropic API key is needed on the bot side.
Each Slack thread is its own conversation:
- Session continuity — replies in a thread resume the same Claude session (
claude --resume), so follow-ups keep context. A plain (non-threaded) message always starts a fresh session.
- Working directory — the first message in a new thread asks which directory Claude should work in. The last 5 directories used are offered as numbered-reaction shortcuts, or you can just reply with a path.
- Permission approvals — when Claude wants to use a tool that isn't read-only, the request (command, file diff, etc.) is posted to the thread with ✅/❌ reactions, plus a "tell Claude what to do differently" option that accepts free-form follow-up text instead.
- Progress visibility — 🤔 shows on your message while Claude is working, swapping to ✅ (done), ⚠️ (error), or ⏳ (timeout) when it finishes. Read-only tool calls (file reads, greps, web searches, ...) post a short milestone line as they happen, so long tasks don't just go silent.
Commands
| Command |
Description |
Slack App: Open Panel |
Open the token-entry / start-stop UI |
Slack App: Init (Set Tokens) |
Set/change tokens via input boxes, then start/restart the bot |
Slack App: Start |
Start the bot |
Slack App: Stop |
Stop the bot |
Slack App: Restart |
Restart the bot |
Slack App: Clear Tokens |
Remove the tokens from .env and stop the bot |
Slack App: Show Logs |
Open the Slack App output channel |
Settings
| Setting |
Default |
Description |
slackApp.pythonPath |
(empty) |
Python interpreter used to run the bot. Leave empty to let the extension build and use its own managed virtualenv (dependencies installed automatically from requirements.txt). Set this only to override with your own interpreter. |
slackApp.scriptPath |
slack/app.py |
Bot entry point (relative to the extension's own folder). |
If you set your own pythonPath, you're responsible for its dependencies:
pip install -r requirements.txt
Requirements
- The Claude Code CLI installed and logged in (
claude login) on the machine running the extension — the bot shells out to claude -p, reusing that login. Verify with claude -p "say hello" in a terminal first.
- A Slack app (see below).
Slack app configuration
Create an app at api.slack.com/apps, then:
- Socket Mode — Settings → Socket Mode → turn it on. This generates the App-Level Token (
xapp-..., needs the connections:write scope, which Slack adds automatically).
- Bot Token Scopes — OAuth & Permissions → add:
chat:write — post replies and milestone messages
reactions:read, reactions:write — the permission-approval and directory-picker reactions
im:history and/or channels:history / groups:history — matching wherever you use the bot (DM, public channel, private channel) — needed to read a free-text "tell Claude what to do differently" follow-up
- Event Subscriptions — Features → Event Subscriptions → turn on, subscribe to bot events:
message.im (and/or message.channels / message.groups, matching what you use)
reaction_added
- Install the app to your workspace. If you'll use it in a channel (not just DMs), invite it:
/invite @yourbot.
- Reinstall the app any time you add a scope or event after the first install.
Then open the Slack App panel in VS Code (Activity Bar), paste in the Bot User OAuth Token (xoxb-...) and App-Level Token (xapp-...), and press Start.
Optional environment variables
Set these in the .env the extension manages (or the panel's tokens are enough to get going without them):
| Variable |
Default |
Description |
CLAUDE_TIMEOUT |
120 |
Seconds to wait for a normal claude -p call before giving up. |
SLACK_PERMISSION_TIMEOUT |
600 |
Seconds to wait for a Slack reaction/reply before a pending permission request auto-denies. |
SLACK_DEFAULT_TARGET |
(none) |
Fallback destination for slack_messenger.py's standalone example script; not used by the bot itself. |