DoIt — AI Coding Agent for VS Code
Install from the VS Code Marketplace
AI coding agent with chat, code actions, and diagnostics integration. Uses Qwen3-Coder-30B via an internal LiteLLM gateway.
Install
From the Marketplace (recommended):
code --install-extension anuraghkp.doit-vscode
Or open the Extensions view (Ctrl+Shift+X) and search for "DoIt".
From VSIX (GitLab releases):
Download the latest doit-vscode-*.vsix from the GitLab releases page and run:
code --install-extension doit-vscode-*.vsix
Or in VS Code: Ctrl+Shift+P → "Install from VSIX..."
What's New — v0.3.2
- Live streaming terminal output with pulsing dot, ANSI colors, and "Move to background" escape hatch
- Process-tree kill — dev servers are fully terminated, freeing ports properly
- ApplyManager disk-corruption fix — auto-accept default prevents merged-state poisoning during multi-step agent flows
- Thinking indicator — three-dot pulsing bar shows the agent is still working between events
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 the activity bar opens the chat panel
- Code actions — Right-click selected code → Explain / Fix / Ask DoIt (language-aware, includes diagnostics)
- Inline permissions — Allow / Allow All / Deny for file edits and shell commands
- Inline diff apply — Green decorations on added lines (auto-accept mode) or full Accept/Reject CodeLens per hunk
- Live terminal streaming — Command output streams into the chat with pulsing status dot and ANSI colors
- Move to background — Long-running dev servers can be detached to the
bg_* registry mid-command
- Keep/Undo bar — One-click revert for edited files
- 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)
├── terminal.ts # Streaming run_command tool with process-group kill
├── logger.ts # Dual logger (output channel + file)
├── apply/
│ ├── ApplyManager.ts # Inline diff apply (per-hunk accept/reject)
│ ├── decorations.ts # Green/red TextEditorDecorationType
│ └── codeLens.ts # Accept / Reject CodeLens per hunk
└── 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 (now carries toolCallId)
tool-progress — Live partial output from a long-running tool (e.g. run_command)
tool-result — Tool execution complete (now carries toolCallId)
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
move-to-background — Detach a running command into the bg_* registry
undo-file — Revert file changes
init-context — Generate .doit/context.md