Skip to content

VS Code ​

VS Code settings, recommended extensions, and MCP server configuration.

Location ​

FileInstalled toMethod
config/vscode/settings.json<VS Code User>/settings.jsonsymlink¹
config/vscode/mcp.json<VS Code User>/mcp.jsonsymlink¹
config/vscode/extensions.json—read to install each recommendation¹

¹ Only when the code CLI is on PATH. <VS Code User> is ~/Library/Application Support/Code/User on macOS and ~/.config/Code/User on Debian. Each extension listed in extensions.json is installed with code --install-extension unless it already is.

Settings ​

Visuals ​

SettingValue
Color themeGitHub Dark Default (dark) / GitHub Light Default (light)
Icon themeMaterial Icon Theme
Editor fontInput Mono, Fira Code, monospace
Terminal fontHack Nerd Font Mono
Font ligaturesss01, ss02, ss03, ss06, zero
CursorPhase blinking
MinimapDisabled
Tab size2

Editor behavior ​

SettingValue
files.autoSaveafterDelay
editor.wordWrapon
editor.bracketPairColorization.enabledtrue
git.autofetchtrue
telemetry.telemetryLeveloff

Formatters ​

LanguageFormatter
TypeScriptESLint
JavaScriptESLint
HTMLESLint
MarkdownMarkdown All in One
YAMLRed Hat YAML

Shell environment and toolchain ​

SettingValueWhy
application.shellEnvironmentResolutionTimeout30Launched from the Dock, VS Code reads PATH from a login zsh; past the 10 s default it gives up, and every proto shim (node, python) then fails to find proto
python.defaultInterpreterPath${userHome}/.proto/shims/pythonThe Python extension expands ${userHome}, not ~

proto is installed with Homebrew (/opt/homebrew/bin/proto). When the shell environment is not resolved, PATH lacks /opt/homebrew/bin and the shims fail with proto-shim: Failed to execute proto. A proto link in ~/.proto/bin makes them independent of PATH (the shim also looks in $PROTO_HOME/bin):

sh
ln -s /opt/homebrew/bin/proto ~/.proto/bin/proto

Commit messages ​

github.copilot.chat.commitMessageGeneration.instructions makes the Generate commit message button of the Source Control view write Conventional Commits only, in English: a type from the release-please set (never refactor), a header of at most 100 characters, an imperative summary, a body of - bullets, and ! for a breaking change. The rules mirror the commit-types skill (see Skills); tests/configs.bats keeps the two in sync.

Security ​

SettingValueEffect
security.workspace.trust.untrustedFilespromptAsk before opening an untrusted file in a trusted window
terminal.integrated.enableMultiLinePasteWarningautoWarn before a multi-line paste the shell would run line by line
chat.tools.global.autoApprovefalseNo blanket auto-approval of agent tools

Copilot agent guardrails ​

Copilot follows the same hard rules as Claude Code (config/claude/settings.json is the reference) and OpenCode (config/opencode/opencode.json):

RuleCopilot mechanism
git commit / git push / gh repo delete blockedagent-guard hook → deny
gh auth token, git credential, kubectl get secretagent-guard hook → deny
kubectl read-only (mutating verbs blocked)agent-guard hook → deny; read verbs auto-approved
terraform apply/destroy, gh pr merge, gh api, kubectl config viewagent-guard hook → ask
Secrets never read/written (.env.example allowed)agent-guard hook → deny + edits never auto-approved

Secrets = .env, .env.*, *.env, *.pem, *.key, everything under ~/.ssh except *.pub / config / config.d/ / known_hosts, ~/.aws, ~/.gnupg, ~/.kube/config, ~/.config/dotfiles/env.local.sh, ~/.netrc, ~/.npmrc, ~/.claude/.credentials.json.

Terminal auto-approval never covers universal prefixes (command, npx, bunx, bare docker or go), and edits to the guardrail and live config folders (config/claude, config/copilot, config/vscode, config/shell, …) always ask, since Copilot has no sandbox.

FileInstalled toMethod
config/copilot/hooks/agent-guard.json~/.copilot/hooks/agent-guard.jsonsymlink
config/copilot/hooks/agent-guard.sh~/.copilot/hooks/agent-guard.shsymlink

Copilot has no OS sandbox and its tool names differ from Claude Code's, so the hook is tool-agnostic: it inspects tool_input.command and every path-like argument. It needs jq and fails closed without it. Hooks are enabled by chat.useHooks. Keep the three configs in sync when changing a rule.

Extensions ​

ExtensionCategory
mechatroner.rainbow-csvCSV
ms-vscode-remote.remote-containersRemote
coder.coder-remoteRemote
ms-vsliveshare.vsliveshareCollaboration
oderwat.indent-rainbowGeneral
pflannery.vscode-versionlensGeneral
wmaurer.change-caseGeneral
rangav.vscode-thunder-clientAPI
gruntfuggly.todo-treeGeneral
github.vscode-github-actionsGitHub Actions
GitHub.vscode-pull-request-githubGit
vivaxy.vscode-conventional-commitsGit
ms-kubernetes-tools.vscode-kubernetes-toolsKubernetes
shd101wyy.markdown-preview-enhancedMarkdown
yzhang.markdown-all-in-oneMarkdown
tomoki1207.pdfPDF
prisma.prismaORM
GitHub.github-vscode-themeTheme
pkief.material-icon-themeTheme

MCP servers ​

ServerTypeDescription
context7HTTPContext7 documentation API (https://mcp.context7.com/mcp)
shadcnstdioshadcn/ui component registry (npx shadcn@4.11.0 mcp)

The CONTEXT7_API_KEY header comes from the context7-api-key input (password: true): VS Code prompts for it once and keeps it in its secret storage, so it is never exported to the shell environment.