doit-vscode
VS Code extension for DoIt — the AI coding agent.
Install
Download doit-vscode-0.2.2.vsix from the GitLab release, then:
code --install-extension doit-vscode-0.2.2.vsix
Or in VS Code: Ctrl+Shift+P → "Install from VSIX..."
Open VS Code Settings (Ctrl+,) → search "DoIt":
| Setting |
Value |
doit.baseUrl |
http://192.168.1.95:4000/v1 |
doit.apiKey |
Your personal API key |
doit.model |
qwen3-coder-30B |
Falls back to ~/.config/doit/config.json if VS Code settings are empty.
Features
- Chat sidebar — DoIt icon in activity bar opens the chat panel
- Code actions — Right-click selected code → Explain / Fix / Ask DoIt (includes language ID and diagnostics)
- Inline permissions — Allow / Allow All / Deny for file edits and commands
- Diff preview — Shows structured diff before approving edits
- Keep/Undo bar — After edits, one-click to keep or revert all changes
- Status bar — Git branch, context tokens, indexing progress, mode indicator
- Markdown rendering — Headings, lists, bold, italic, code blocks
- Slash commands —
/init, /new, /plan, /direct, /help
Development
# From monorepo root — build core first
cd packages/core && npx tsc
cd packages/vscode
# Build
npm run build # One-shot esbuild
npm run watch # Watch mode
# Package VSIX
npx @vscode/vsce package --no-dependencies
# Install locally
code --install-extension doit-vscode-*.vsix --force
Debug in VS Code
- Open the monorepo in VS Code
- Press
F5 to launch Extension Development Host
- The extension loads from
packages/vscode/dist/extension.js
Architecture
src/
├── extension.ts # Entry point, command registration, webview provider
├── agent-bridge.ts # Core agent wrapper (events, permissions, tool wrapping)
├── diff-store.ts # Virtual document provider for diff views
├── terminal.ts # VS Code output channel for run_command
├── logger.ts # Dual logger (output channel + file)
└── webview/
├── main.js # Chat UI logic (messages, tool calls, permissions, status bar)
├── markdown.js # Markdown renderer (headings, lists, code blocks)
└── style.css # VS Code-themed styles
Key Design Decisions
- esbuild bundled — Single CJS file, native modules (LanceDB, ONNX) stubbed out via esbuild plugin
- XML fragment filter — Strips raw
<function=...> tags from streaming text (Qwen3-Coder parser artifacts)
- structuredPatch diffs — Accurate
+N -N stats using the diff library
- Singleton output channel — Single "DoIt Commands" channel reused across all
run_command calls
- Abort-safe permissions — Pending permission dialogs resolve as denied on abort (no deadlock)
- Session reset cleanup —
/new clears messages, todos, memory, diff store, and project context cache
- Context updates — Token count pushed to webview status bar via
context-update events
- Status bar polling — Git branch, indexing, mode refreshed every 3 seconds via extension → webview messages
Webview Communication
Extension → Webview:
text-delta — Streaming text chunk
tool-call — Tool execution started
tool-result — Tool execution complete
permission-request — Inline Allow/Deny prompt
done — Turn complete (with edited files for Keep/Undo)
error / info — Status messages
context-update — Token count
status-update — Git branch, cwd, indexing, mode
context — Active file indicator
Webview → Extension:
message — User chat message
abort — Stop current response
new-session — Reset conversation
set-mode — Switch plan/direct
permission-response — Allow/Deny/AllowAll
undo-file — Revert file changes
init-context — Generate .doit/context.md