The complete guide to Claude Code setup (Opus 4.6, Sonnet 4.6, Haiku 4.5). 1M token context window. 100+ hours saved. 25 hook events. Agent teams and task management. Production-tested patterns for skills, hooks, and MCP integration.
Released: March 2026
Claude Code 2.1.87-2.1.88 delivers flicker-free alt-screen rendering, a new PermissionDenied hook event, named subagent typeahead, and a large batch of high-impact bug fixes targeting prompt cache efficiency, nested CLAUDE.md re-injection, hook reliability, LSP stability, and memory leaks. Version 2.1.88 is a significant stability release with platform-specific fixes for Windows, macOS, and terminal emulators.
Fixed messages in Cowork Dispatch not getting delivered. No configuration changes needed – this is an automatic fix for users of the Cowork feature.
A new environment variable eliminates terminal flickering during parallel tool calls and streaming output.
export CLAUDE_CODE_NO_FLICKER=1
Setting this opts into alt-screen rendering with virtualized scrollback – the same rendering mode used by vim, less, and htop. The terminal switches to an alternate screen buffer where updates are drawn without visible flicker.
Alt-screen content disappears from terminal scrollback on exit. When you quit Claude Code (or the session ends), the alternate screen buffer is discarded – you cannot scroll up to see prior output. This is standard alt-screen behavior, identical to exiting vim or less.
# ~/.bashrc or ~/.zshrc
export CLAUDE_CODE_NO_FLICKER=1
A new hook event that fires after auto mode classifier denials. This enables logging, custom retry logic, and observability for permission-denied actions.
{
"hooks": {
"PermissionDenied": [
{
"hooks": [
{
"type": "command",
"command": "echo \"[PermissionDenied] $(date -Iseconds)\" >> ~/.claude/logs/permission-denials.log",
"async": true
}
]
}
]
}
}
| Return | Effect |
|---|---|
{retry: true} |
Tells the model it can retry the denied action |
| No return / empty | Default behavior – denial logged, no retry |
Auto mode denied commands now:
/permissions under the Recent tabNamed subagents now appear in @ mention typeahead suggestions. When you type @ in the input, running named agents appear as completion options alongside files and symbols.
This makes it easier to reference and interact with running agents without remembering exact names or switching context.
Fixed nested CLAUDE.md files being re-injected dozens of times in long sessions that read many files.
In setups with global (~/.claude/CLAUDE.md) and per-project (.claude/CLAUDE.md) files, each file read could trigger re-injection of nested CLAUDE.md content. Over a long session with many file reads, the same CLAUDE.md content would be injected 20-50+ times, silently consuming context window capacity.
No action needed – this is an automatic fix. Long sessions with multi-level CLAUDE.md setups will see improved context efficiency immediately.
Fixed prompt cache misses in long sessions caused by tool schema bytes changing mid-session.
When MCP servers, plugins, or deferred tools update their schema mid-session, the prompt cache key changed, invalidating cached prompts. This forced re-caching of the entire system prompt on every turn.
No action needed – automatic fix. Sessions with complex tool configurations will see reduced API costs.
if Compound Command Fix (2.1.88)Fixed hooks if condition filtering not matching compound commands or commands with environment variable prefixes.
| Command | Before (2.1.85-2.1.87) | After (2.1.88) |
|---|---|---|
ls && git push |
if: "Bash(git *)" did NOT match |
Matches correctly |
FOO=bar git push |
if: "Bash(git *)" did NOT match |
Matches correctly |
npm test && git commit |
if: "Bash(git *)" did NOT match |
Matches correctly |
Hooks with if conditions may now fire more frequently than before. This is correct behavior – the previous implementation was silently skipping legitimate matches. Review your hook scripts if they assume a lower invocation rate.
file_path (2.1.88)Fixed PreToolUse/PostToolUse hooks not providing file_path as an absolute path for Write, Edit, and Read tools.
Hook scripts received file_path from tool_input JSON as a relative path (e.g., src/index.ts), requiring manual resolution.
file_path is always an absolute path (e.g., /home/user/project/src/index.ts). Hook scripts that parse file_path from the tool input JSON now work correctly without path resolution logic.
Fixed LSP server zombie state after crash. Previously, if a language server (e.g., typescript-lsp, pyright-lsp) crashed mid-session, it remained in a dead state until the entire Claude Code session was restarted.
Now the LSP server restarts automatically on the next request. This benefits all code intelligence plugins.
Fixed memory leak where large JSON inputs were retained as LRU cache keys in long-running sessions.
Sessions with heavy hook usage that passes JSON via stdin. The JSON payloads (which can be large for tools like Edit with full file content) were kept as cache keys indefinitely, growing memory usage over time.
Automatic fix. Long-running sessions with many hook invocations will maintain stable memory usage.
--resume crash: Fixed crash when transcript contains a tool result from an older CLI version or interrupted write/stats historical data: Fixed /stats losing historical data beyond 30 days when cache format changes/stats token counting: Fixed /stats undercounting tokens by excluding subagent/fork usageThinking summaries are no longer generated by default. To restore them:
{
"showThinkingSummaries": true
}
This reduces token usage for users who don’t need inline reasoning summaries.
/env for PowerShell: /env now applies to PowerShell tool commands/usage cleanup: Hides redundant “Current week (Sonnet only)” bar for Pro/Enterprise usersls/tree/du commands!command paste: Pasting !command enters bash mode, matching typed ! behaviorClaude Code gained built-in computer use via a computer-use MCP server. This provides screenshot-based desktop control – opening apps, clicking buttons, and typing text.
| Action | Via Computer Use |
|---|---|
| Open applications | Yes |
| Click UI buttons | Yes |
| Type text into fields | Yes |
| Browser interaction | View-only (no clicking links/buttons) |
| Terminal interaction | Click-only (no typing commands) |
Computer use is the last resort in the tool selection hierarchy:
MCP Tools > Bash > Chrome/Playwright > Computer Use
Claude falls back to computer use only when no better tool exists for the task.
CLAUDE_CODE_NO_FLICKER=1 to your shell profile if terminal flickering is an issue (especially WSL2)PermissionDenied hook if you use auto mode – log denials for observabilityshowThinkingSummaries – now OFF by default. Set true in settings if you want them backif conditions now match compound commands, increasing hook invocations (this is correct behavior)/stats – now includes subagent/fork usage, historical data preserved across format changesPrevious: Chapter 65 – Cross-Project AI Knowledge Sharing Next: Chapter 67 – Claude Code Internal Architecture
Updated: 2026-03-31