mirror of
https://github.com/anthropics/claude-code.git
synced 2026-02-19 04:27:33 -08:00
Compare commits
15 Commits
claude/sla
...
claude/sla
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cad2569360 | ||
|
|
4392352687 | ||
|
|
c27c6f4e4a | ||
|
|
0dde1fef97 | ||
|
|
e4f682030b | ||
|
|
eb87245010 | ||
|
|
3680637065 | ||
|
|
2192c86c20 | ||
|
|
dfd3494132 | ||
|
|
e8cca9a7af | ||
|
|
6358669884 | ||
|
|
ace0a82778 | ||
|
|
e095e1270a | ||
|
|
69da5e8269 | ||
|
|
7069a25987 |
@@ -102,6 +102,17 @@
|
||||
"source": "./plugins/learning-output-style",
|
||||
"category": "learning"
|
||||
},
|
||||
{
|
||||
"name": "mcp-context-warning",
|
||||
"description": "Warns users when MCP servers are consuming significant context (>20k tokens), helping prevent unexpected context exhaustion",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/mcp-context-warning",
|
||||
"category": "productivity"
|
||||
},
|
||||
{
|
||||
"name": "plugin-dev",
|
||||
"description": "Comprehensive toolkit for developing Claude Code plugins. Includes 7 expert skills covering hooks, MCP integration, commands, agents, and best practices. AI-assisted plugin creation and validation.",
|
||||
|
||||
89
CHANGELOG.md
89
CHANGELOG.md
@@ -1,5 +1,94 @@
|
||||
# Changelog
|
||||
|
||||
## 2.0.71
|
||||
|
||||
- Added /config toggle to enable/disable prompt suggestions
|
||||
- Added `/settings` as an alias for the `/config` command
|
||||
- Fixed @ file reference suggestions incorrectly triggering when cursor is in the middle of a path
|
||||
- Fixed MCP servers from `.mcp.json` not loading when using `--dangerously-skip-permissions`
|
||||
- Fixed permission rules incorrectly rejecting valid bash commands containing shell glob patterns (e.g., `ls *.txt`, `for f in *.png`)
|
||||
- Bedrock: Environment variable `ANTHROPIC_BEDROCK_BASE_URL` is now respected for token counting and inference profile listing
|
||||
- New syntax highlighting engine for native build
|
||||
|
||||
## 2.0.70
|
||||
|
||||
- Added Enter key to accept and submit prompt suggestions immediately (tab still accepts for editing)
|
||||
- Added wildcard syntax `mcp__server__*` for MCP tool permissions to allow or deny all tools from a server
|
||||
- Added auto-update toggle for plugin marketplaces, allowing per-marketplace control over automatic updates
|
||||
- Added `plan_mode_required` spawn parameter for teammates to require plan approval before implementing changes
|
||||
- Added `current_usage` field to status line input, enabling accurate context window percentage calculations
|
||||
- Fixed input being cleared when processing queued commands while the user was typing
|
||||
- Fixed prompt suggestions replacing typed input when pressing Tab
|
||||
- Fixed diff view not updating when terminal is resized
|
||||
- Improved memory usage by 3x for large conversations
|
||||
- Improved resolution of stats screenshots copied to clipboard (Ctrl+S) for crisper images
|
||||
- Removed # shortcut for quick memory entry (tell Claude to edit your CLAUDE.md instead)
|
||||
- Fix thinking mode toggle in /config not persisting correctly
|
||||
- Improve UI for file creation permission dialog
|
||||
|
||||
## 2.0.69
|
||||
|
||||
- Minor bugfixes
|
||||
|
||||
## 2.0.68
|
||||
|
||||
- Fixed IME (Input Method Editor) support for languages like Chinese, Japanese, and Korean by correctly positioning the composition window at the cursor
|
||||
- Fixed a bug where disallowed MCP tools were visible to the model
|
||||
- Fixed an issue where steering messages could be lost while a subagent is working
|
||||
- Fixed Option+Arrow word navigation treating entire CJK (Chinese, Japanese, Korean) text sequences as a single word instead of navigating by word boundaries
|
||||
- Improved plan mode exit UX: show simplified yes/no dialog when exiting with empty or missing plan instead of throwing an error
|
||||
- Add support for enterprise managed settings. Contact your Anthropic account team to enable this feature.
|
||||
|
||||
## 2.0.67
|
||||
|
||||
- Thinking mode is now enabled by default for Opus 4.5
|
||||
- Thinking mode configuration has moved to /config
|
||||
- Added search functionality to `/permissions` command with `/` keyboard shortcut for filtering rules by tool name
|
||||
- Show reason why autoupdater is disabled in `/doctor`
|
||||
- Fixed false "Another process is currently updating Claude" error when running `claude update` while another instance is already on the latest version
|
||||
- Fixed MCP servers from `.mcp.json` being stuck in pending state when running in non-interactive mode (`-p` flag or piped input)
|
||||
- Fixed scroll position resetting after deleting a permission rule in `/permissions`
|
||||
- Fixed word deletion (opt+delete) and word navigation (opt+arrow) not working correctly with non-Latin text such as Cyrillic, Greek, Arabic, Hebrew, Thai, and Chinese
|
||||
- Fixed `claude install --force` not bypassing stale lock files
|
||||
- Fixed consecutive @~/ file references in CLAUDE.md being incorrectly parsed due to markdown strikethrough interference
|
||||
- Windows: Fixed plugin MCP servers failing due to colons in log directory paths
|
||||
|
||||
## 2.0.65
|
||||
|
||||
- Added ability to switch models while writing a prompt using alt+p (linux, windows), option+p (macos).
|
||||
- Added context window information to status line input
|
||||
- Added `fileSuggestion` setting for custom `@` file search commands
|
||||
- Added `CLAUDE_CODE_SHELL` environment variable to override automatic shell detection (useful when login shell differs from actual working shell)
|
||||
- Fixed prompt not being saved to history when aborting a query with Escape
|
||||
- Fixed Read tool image handling to identify format from bytes instead of file extension
|
||||
|
||||
## 2.0.64
|
||||
|
||||
- Made auto-compacting instant
|
||||
- Agents and bash commands can run asynchronously and send messages to wake up the main agent
|
||||
- /stats now provides users with interesting CC stats, such as favorite model, usage graph, usage streak
|
||||
- Added named session support: use `/rename` to name sessions, `/resume <name>` in REPL or `claude --resume <name>` from the terminal to resume them
|
||||
- Added support for .claude/rules/`. See https://code.claude.com/docs/en/memory for details.
|
||||
- Added image dimension metadata when images are resized, enabling accurate coordinate mappings for large images
|
||||
- Fixed auto-loading .env when using native installer
|
||||
- Fixed `--system-prompt` being ignored when using `--continue` or `--resume` flags
|
||||
- Improved `/resume` screen with grouped forked sessions and keyboard shortcuts for preview (P) and rename (R)
|
||||
- VSCode: Added copy-to-clipboard button on code blocks and bash tool inputs
|
||||
- VSCode: Fixed extension not working on Windows ARM64 by falling back to x64 binary via emulation
|
||||
- Bedrock: Improve efficiency of token counting
|
||||
- Bedrock: Add support for `aws login` AWS Management Console credentials
|
||||
- Unshipped AgentOutputTool and BashOutputTool, in favor of a new unified TaskOutputTool
|
||||
|
||||
## 2.0.62
|
||||
|
||||
- Added "(Recommended)" indicator for multiple-choice questions, with the recommended option moved to the top of the list
|
||||
- Added `attribution` setting to customize commit and PR bylines (deprecates `includeCoAuthoredBy`)
|
||||
- Fixed duplicate slash commands appearing when ~/.claude is symlinked to a project directory
|
||||
- Fixed slash command selection not working when multiple commands share the same name
|
||||
- Fixed an issue where skill files inside symlinked skill directories could become circular symlinks
|
||||
- Fixed running versions getting removed because lock file incorrectly going stale
|
||||
- Fixed IDE diff tab not closing when rejecting file changes
|
||||
|
||||
## 2.0.61
|
||||
|
||||
- Reverted VSCode support for multiple terminal clients due to responsiveness issues.
|
||||
|
||||
@@ -22,23 +22,29 @@ Performs automated code review on a pull request using multiple specialized agen
|
||||
- **Agent #4**: Analyze git blame/history for context-based issues
|
||||
5. Scores each issue 0-100 for confidence level
|
||||
6. Filters out issues below 80 confidence threshold
|
||||
7. Posts review comment with high-confidence issues only
|
||||
7. Outputs review (to terminal by default, or as PR comment with `--comment` flag)
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/code-review
|
||||
/code-review [--comment]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--comment`: Post the review as a comment on the pull request (default: outputs to terminal only)
|
||||
|
||||
**Example workflow:**
|
||||
```bash
|
||||
# On a PR branch, run:
|
||||
# On a PR branch, run locally (outputs to terminal):
|
||||
/code-review
|
||||
|
||||
# Post review as PR comment:
|
||||
/code-review --comment
|
||||
|
||||
# Claude will:
|
||||
# - Launch 4 review agents in parallel
|
||||
# - Score each issue for confidence
|
||||
# - Post comment with issues ≥80 confidence
|
||||
# - Skip posting if no high-confidence issues found
|
||||
# - Output issues ≥80 confidence (to terminal or PR depending on flag)
|
||||
# - Skip if no high-confidence issues found
|
||||
```
|
||||
|
||||
**Features:**
|
||||
@@ -114,17 +120,23 @@ This plugin is included in the Claude Code repository. The command is automatica
|
||||
### Standard PR review workflow:
|
||||
```bash
|
||||
# Create PR with changes
|
||||
# Run local review (outputs to terminal)
|
||||
/code-review
|
||||
|
||||
# Review the automated feedback
|
||||
# Make any necessary fixes
|
||||
|
||||
# Optionally post as PR comment
|
||||
/code-review --comment
|
||||
|
||||
# Merge when ready
|
||||
```
|
||||
|
||||
### As part of CI/CD:
|
||||
```bash
|
||||
# Trigger on PR creation or update
|
||||
# Automatically posts review comments
|
||||
# Use --comment flag to post review comments
|
||||
/code-review --comment
|
||||
# Skip if review already exists
|
||||
```
|
||||
|
||||
|
||||
@@ -52,7 +52,9 @@ Note: Still review Claude generated PR's.
|
||||
|
||||
6. Filter out any issues that were not validated in step 5. This step will give us our list of high signal issues for our review.
|
||||
|
||||
7. Finally, comment on the pull request.
|
||||
7. Finally, output the review.
|
||||
- If the `--comment` argument is provided, post the review as a comment on the pull request using `gh pr comment`
|
||||
- Otherwise (default), output the review directly to the terminal for local viewing
|
||||
When writing your comment, follow these guidelines:
|
||||
a. Keep your output brief
|
||||
b. Avoid emojis
|
||||
@@ -93,11 +95,6 @@ Found 3 issues:
|
||||
|
||||
<link to file and line with full sha1 + line range for context>
|
||||
|
||||
🤖 Generated with [Claude Code](https://claude.ai/code)
|
||||
|
||||
|
||||
<sub>- If this code review was useful, please react with 👍. Otherwise, react with 👎.</sub>
|
||||
|
||||
---
|
||||
|
||||
- Or, if you found no issues:
|
||||
@@ -108,8 +105,6 @@ Found 3 issues:
|
||||
|
||||
No issues found. Checked for bugs and CLAUDE.md compliance.
|
||||
|
||||
🤖 Generated with [Claude Code](https://claude.ai/code)
|
||||
|
||||
---
|
||||
|
||||
- When linking to code, follow the following format precisely, otherwise the Markdown preview won't render correctly: https://github.com/anthropics/claude-code/blob/c21d3c10bc8e898b7ac1a2d745bdc9bc4e423afe/package.json#L10-L15
|
||||
|
||||
9
plugins/mcp-context-warning/.claude-plugin/plugin.json
Normal file
9
plugins/mcp-context-warning/.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "mcp-context-warning",
|
||||
"version": "1.0.0",
|
||||
"description": "Warns users when MCP servers are consuming significant context (>20k tokens), helping prevent unexpected context exhaustion",
|
||||
"author": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
}
|
||||
}
|
||||
164
plugins/mcp-context-warning/hooks/check_mcp_context.py
Executable file
164
plugins/mcp-context-warning/hooks/check_mcp_context.py
Executable file
@@ -0,0 +1,164 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
MCP Context Warning Hook for Claude Code
|
||||
|
||||
This hook runs at session start and warns users when their MCP servers
|
||||
are consuming significant context (>20k tokens). This helps users understand
|
||||
why they might be burning through context quickly.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Threshold in tokens for showing a warning
|
||||
TOKEN_WARNING_THRESHOLD = 20000
|
||||
|
||||
# Estimated tokens per MCP tool (based on real-world data:
|
||||
# Asana: ~836/tool, Gmail: ~833/tool, Google Calendar: ~1867/tool, Google Drive: ~1260/tool)
|
||||
# Using 1000 as a conservative average
|
||||
TOKENS_PER_TOOL_ESTIMATE = 1000
|
||||
|
||||
# Base overhead per MCP server (connection info, auth, etc.)
|
||||
BASE_TOKENS_PER_SERVER = 500
|
||||
|
||||
|
||||
def find_mcp_configs(cwd: str) -> list[tuple[str, dict]]:
|
||||
"""
|
||||
Find all MCP configuration files that might be loaded.
|
||||
|
||||
Returns list of (path, config) tuples.
|
||||
"""
|
||||
configs = []
|
||||
|
||||
# Check project-level .mcp.json
|
||||
project_mcp = Path(cwd) / ".mcp.json"
|
||||
if project_mcp.exists():
|
||||
try:
|
||||
with open(project_mcp) as f:
|
||||
configs.append((str(project_mcp), json.load(f)))
|
||||
except (json.JSONDecodeError, IOError):
|
||||
pass
|
||||
|
||||
# Check user-level MCP config (~/.claude/.mcp.json)
|
||||
user_mcp = Path.home() / ".claude" / ".mcp.json"
|
||||
if user_mcp.exists():
|
||||
try:
|
||||
with open(user_mcp) as f:
|
||||
configs.append((str(user_mcp), json.load(f)))
|
||||
except (json.JSONDecodeError, IOError):
|
||||
pass
|
||||
|
||||
return configs
|
||||
|
||||
|
||||
def count_servers_and_estimate_tools(configs: list[tuple[str, dict]]) -> tuple[dict, int]:
|
||||
"""
|
||||
Count MCP servers and estimate their tool counts.
|
||||
|
||||
Returns (server_info dict, total_estimated_tokens).
|
||||
"""
|
||||
server_info = {}
|
||||
|
||||
for path, config in configs:
|
||||
# MCP config format: {"mcpServers": {"server-name": {...}}}
|
||||
mcp_servers = config.get("mcpServers", {})
|
||||
|
||||
for server_name, server_config in mcp_servers.items():
|
||||
if server_name in server_info:
|
||||
continue # Skip duplicates
|
||||
|
||||
# Try to get tool count from config if available
|
||||
# Otherwise use a default estimate
|
||||
tool_count = server_config.get("toolCount", 10) # Default 10 tools
|
||||
|
||||
server_info[server_name] = {
|
||||
"source": path,
|
||||
"estimated_tools": tool_count,
|
||||
}
|
||||
|
||||
# Calculate total estimated tokens
|
||||
total_tokens = 0
|
||||
for server_name, info in server_info.items():
|
||||
server_tokens = BASE_TOKENS_PER_SERVER + (info["estimated_tools"] * TOKENS_PER_TOOL_ESTIMATE)
|
||||
info["estimated_tokens"] = server_tokens
|
||||
total_tokens += server_tokens
|
||||
|
||||
return server_info, total_tokens
|
||||
|
||||
|
||||
def format_warning_message(server_info: dict, total_tokens: int) -> str:
|
||||
"""Format a warning message about MCP context usage."""
|
||||
|
||||
# Build server breakdown table
|
||||
lines = [
|
||||
f"Your MCP servers are using an estimated ~{total_tokens:,} tokens of context.",
|
||||
"",
|
||||
"Server breakdown:",
|
||||
]
|
||||
|
||||
# Sort servers by token usage (highest first)
|
||||
sorted_servers = sorted(
|
||||
server_info.items(),
|
||||
key=lambda x: x[1]["estimated_tokens"],
|
||||
reverse=True
|
||||
)
|
||||
|
||||
for server_name, info in sorted_servers:
|
||||
tokens = info["estimated_tokens"]
|
||||
tools = info["estimated_tools"]
|
||||
lines.append(f" - {server_name}: ~{tokens:,} tokens ({tools} tools)")
|
||||
|
||||
lines.extend([
|
||||
"",
|
||||
"Consider disabling MCP servers you're not actively using to conserve context.",
|
||||
"You can manage MCP servers with `/mcp disable <server-name>` or by editing .mcp.json.",
|
||||
])
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def main():
|
||||
"""Main hook function."""
|
||||
# Read input from stdin
|
||||
try:
|
||||
raw_input = sys.stdin.read()
|
||||
input_data = json.loads(raw_input) if raw_input.strip() else {}
|
||||
except json.JSONDecodeError:
|
||||
# If we can't parse input, exit silently
|
||||
sys.exit(0)
|
||||
|
||||
# Get current working directory from hook input or environment
|
||||
cwd = input_data.get("cwd", os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd()))
|
||||
|
||||
# Find MCP configurations
|
||||
configs = find_mcp_configs(cwd)
|
||||
|
||||
if not configs:
|
||||
# No MCP configs found, nothing to warn about
|
||||
sys.exit(0)
|
||||
|
||||
# Count servers and estimate tokens
|
||||
server_info, total_tokens = count_servers_and_estimate_tools(configs)
|
||||
|
||||
if not server_info:
|
||||
# No servers configured
|
||||
sys.exit(0)
|
||||
|
||||
# Check if we're over the warning threshold
|
||||
if total_tokens >= TOKEN_WARNING_THRESHOLD:
|
||||
warning_message = format_warning_message(server_info, total_tokens)
|
||||
|
||||
# Output JSON with systemMessage for Claude to see
|
||||
output = {
|
||||
"continue": True,
|
||||
"systemMessage": warning_message
|
||||
}
|
||||
print(json.dumps(output))
|
||||
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
17
plugins/mcp-context-warning/hooks/hooks.json
Normal file
17
plugins/mcp-context-warning/hooks/hooks.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"description": "Warns users when MCP servers consume significant context (>20k tokens)",
|
||||
"hooks": {
|
||||
"SessionStart": [
|
||||
{
|
||||
"matcher": "*",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/check_mcp_context.py",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user