git_diff_staged
Review staged changes before committing in a Git repository using this tool. Identify modifications, additions, or deletions to ensure precise version control and accurate updates.
Instructions
Shows changes that are staged for commit
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes |
Implementation Reference
- Core handler function executing `repo.git.diff('--cached')` with options for stat_only, max_lines, name_only, and paths. Applies size limiting and formats output.def git_diff_staged( repo: Repo, stat_only: bool = False, max_lines: int | None = None, name_only: bool = False, paths: list[str] | None = None, ) -> str: """Get staged changes diff with file-specific and advanced options""" try: # Build git diff arguments diff_args = ["--cached"] # Add options based on parameters if name_only: diff_args.append("--name-only") elif stat_only: diff_args.append("--stat") # Add specific paths if provided if paths: diff_args.extend(["--"] + paths) # Execute git diff with arguments diff_output = repo.git.diff(*diff_args) # Handle name-only output if name_only: return ( f"Files with staged changes:\n{diff_output}" if diff_output.strip() else "No staged changes" ) # Handle stat-only output if stat_only: return ( f"Staged changes summary:\n{diff_output}" if diff_output.strip() else "No staged changes" ) # Apply size limiting for full diff output return _apply_diff_size_limiting( diff_output, "staged changes", stat_only, max_lines ) except GitCommandError as e: return f"❌ Diff staged failed: {str(e)}" except Exception as e: return f"❌ Diff staged error: {str(e)}"
- Pydantic input schema defining parameters: repo_path (required), stat_only, max_lines, name_only, paths.class GitDiffStaged(BaseModel): repo_path: str stat_only: bool | None = False max_lines: int | None = None name_only: bool | None = False paths: list[str] | None = None
- src/mcp_server_git/core/handlers.py:72-76 (registration)Registers 'git_diff_staged' tool by creating a wrapped handler from git_diff_staged function with required repo and extra args."git_diff_staged": self._create_git_handler( git_diff_staged, requires_repo=True, extra_args=["stat_only", "max_lines", "name_only", "paths"], ),
- src/mcp_server_git/core/tools.py:190-197 (registration)Initial tool registry entry for git_diff_staged with schema GitDiffStaged and metadata.ToolDefinition( name=GitTools.DIFF_STAGED, category=ToolCategory.GIT, description="Show changes that are staged for commit", schema=GitDiffStaged, handler=placeholder_handler, requires_repo=True, ),
- Helper function used by git_diff_staged to limit large diff outputs, truncate by lines, and add warnings.def _apply_diff_size_limiting( diff_output: str, operation_name: str, stat_only: bool = False, max_lines: int | None = None, ) -> str: """Apply size limiting to diff outputs with consistent formatting""" if not diff_output.strip(): return f"No changes detected in {operation_name}" if stat_only: # This should be handled by the caller using --stat flag return diff_output # Apply line limit if specified if max_lines and max_lines > 0: lines = diff_output.split("\n") if len(lines) > max_lines: truncated_output = "\n".join(lines[:max_lines]) truncated_output += ( f"\n\n... [Truncated: showing {max_lines} of {len(lines)} lines]" ) truncated_output += "\nUse stat_only=true for summary or increase max_lines for more content" return truncated_output # Check if output is extremely large and warn if len(diff_output) > 50000: # 50KB threshold lines_count = len(diff_output.split("\n")) warning = f"⚠️ Large diff detected ({lines_count} lines, ~{len(diff_output) // 1000}KB)\n" warning += "Consider using stat_only=true for summary or max_lines parameter to limit output\n\n" return warning + diff_output return diff_output