mirror of
https://github.com/anthropics/claude-code.git
synced 2026-04-18 17:32:47 +00:00
Compare commits
1 Commits
claude/sla
...
claude/sla
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13530b1747 |
@@ -102,17 +102,6 @@
|
||||
"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.",
|
||||
|
||||
54
CHANGELOG.md
54
CHANGELOG.md
@@ -1,58 +1,5 @@
|
||||
# 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).
|
||||
@@ -76,7 +23,6 @@
|
||||
- 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
|
||||
|
||||
@@ -22,29 +22,23 @@ 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. Outputs review (to terminal by default, or as PR comment with `--comment` flag)
|
||||
7. Posts review comment with high-confidence issues only
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/code-review [--comment]
|
||||
/code-review
|
||||
```
|
||||
|
||||
**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 locally (outputs to terminal):
|
||||
# On a PR branch, run:
|
||||
/code-review
|
||||
|
||||
# Post review as PR comment:
|
||||
/code-review --comment
|
||||
|
||||
# Claude will:
|
||||
# - Launch 4 review agents in parallel
|
||||
# - Score each issue for confidence
|
||||
# - Output issues ≥80 confidence (to terminal or PR depending on flag)
|
||||
# - Skip if no high-confidence issues found
|
||||
# - Post comment with issues ≥80 confidence
|
||||
# - Skip posting if no high-confidence issues found
|
||||
```
|
||||
|
||||
**Features:**
|
||||
@@ -120,23 +114,17 @@ 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
|
||||
# Use --comment flag to post review comments
|
||||
/code-review --comment
|
||||
# Automatically posts review comments
|
||||
# Skip if review already exists
|
||||
```
|
||||
|
||||
|
||||
@@ -52,9 +52,7 @@ 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, 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
|
||||
7. Finally, comment on the pull request.
|
||||
When writing your comment, follow these guidelines:
|
||||
a. Keep your output brief
|
||||
b. Avoid emojis
|
||||
@@ -95,6 +93,11 @@ 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:
|
||||
@@ -105,6 +108,8 @@ 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
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -1,164 +0,0 @@
|
||||
#!/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()
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,7 @@ assistant: "[How assistant should respond and use this agent]"
|
||||
model: inherit
|
||||
color: blue
|
||||
tools: ["Read", "Write", "Grep"]
|
||||
skills: skill-name-1, skill-name-2
|
||||
---
|
||||
|
||||
You are [agent role description]...
|
||||
@@ -159,6 +160,35 @@ tools: ["Read", "Write", "Grep", "Bash"]
|
||||
- Testing: `["Read", "Bash", "Grep"]`
|
||||
- Full access: Omit field or use `["*"]`
|
||||
|
||||
### skills (optional)
|
||||
|
||||
Declare skills to auto-load when this agent is invoked.
|
||||
|
||||
**Format:** Comma-separated list of skill names
|
||||
|
||||
```yaml
|
||||
skills: database-migration, postgres-ops
|
||||
```
|
||||
|
||||
**Purpose:** Ensures specific skills are always available to the agent, regardless of context matching. This is especially useful for:
|
||||
- Skills that should persist across context compaction
|
||||
- Specialized agents that always need certain domain knowledge
|
||||
- Ensuring consistent agent behavior with required skills
|
||||
|
||||
**Example:**
|
||||
```yaml
|
||||
---
|
||||
name: db-admin
|
||||
description: Use this agent for database administration tasks...
|
||||
model: inherit
|
||||
color: cyan
|
||||
tools: ["Bash", "Read", "Write"]
|
||||
skills: database-migration, sql-optimization
|
||||
---
|
||||
```
|
||||
|
||||
**Best practice:** Only declare skills essential to the agent's core function. Let context-triggered skills load naturally for optional capabilities.
|
||||
|
||||
## System Prompt Design
|
||||
|
||||
The markdown body becomes the agent's system prompt. Write in second person, addressing the agent directly.
|
||||
@@ -355,6 +385,7 @@ Output: [What to provide]
|
||||
| model | Yes | inherit/sonnet/opus/haiku | inherit |
|
||||
| color | Yes | Color name | blue |
|
||||
| tools | No | Array of tool names | ["Read", "Grep"] |
|
||||
| skills | No | Comma-separated names | skill-a, skill-b |
|
||||
|
||||
### Best Practices
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ description: Brief description
|
||||
allowed-tools: Read, Write
|
||||
model: sonnet
|
||||
argument-hint: [arg1] [arg2]
|
||||
skills: skill-a, skill-b
|
||||
---
|
||||
|
||||
Command prompt content here...
|
||||
@@ -321,6 +322,51 @@ disable-model-invocation: true
|
||||
- Document why in command comments
|
||||
- Consider if command should exist if always manual
|
||||
|
||||
### skills
|
||||
|
||||
**Type:** String (comma-separated list)
|
||||
**Required:** No
|
||||
**Default:** None
|
||||
|
||||
**Purpose:** Declare skills to auto-load when this command executes. Ensures specific skills are always available regardless of context matching.
|
||||
|
||||
**Examples:**
|
||||
```yaml
|
||||
skills: database-migration, sql-optimization
|
||||
```
|
||||
|
||||
**When to use:**
|
||||
|
||||
1. **Commands requiring domain knowledge:** Ensure relevant skills load
|
||||
```yaml
|
||||
---
|
||||
description: Run database migration
|
||||
skills: database-migration, postgres-ops
|
||||
---
|
||||
```
|
||||
|
||||
2. **Skills that should persist across compaction:** Force-load skills that might otherwise be lost
|
||||
```yaml
|
||||
---
|
||||
description: Complex multi-step workflow
|
||||
skills: workflow-skill, validation-skill
|
||||
---
|
||||
```
|
||||
|
||||
3. **Specialized commands:** Commands that always need specific expertise
|
||||
```yaml
|
||||
---
|
||||
description: Generate API documentation
|
||||
skills: api-documentation, openapi-spec
|
||||
---
|
||||
```
|
||||
|
||||
**Best practices:**
|
||||
- Only declare skills essential to the command's function
|
||||
- Use skill names exactly as defined in SKILL.md frontmatter
|
||||
- Keep the list focused (2-4 skills max)
|
||||
- Let context-triggered skills load naturally for optional capabilities
|
||||
|
||||
## Complete Examples
|
||||
|
||||
### Minimal Command
|
||||
@@ -451,6 +497,7 @@ Before committing command:
|
||||
- [ ] model is valid value if specified
|
||||
- [ ] argument-hint matches positional arguments
|
||||
- [ ] disable-model-invocation used appropriately
|
||||
- [ ] skills references valid skill names if specified
|
||||
|
||||
## Best Practices Summary
|
||||
|
||||
@@ -460,4 +507,5 @@ Before committing command:
|
||||
4. **Choose right model:** Use haiku for speed, opus for complexity
|
||||
5. **Manual-only sparingly:** Only use disable-model-invocation when necessary
|
||||
6. **Clear descriptions:** Make commands discoverable in `/help`
|
||||
7. **Test thoroughly:** Verify frontmatter works as expected
|
||||
7. **Declare essential skills:** Use skills field for domain knowledge that must persist
|
||||
8. **Test thoroughly:** Verify frontmatter works as expected
|
||||
|
||||
Reference in New Issue
Block a user