Merge pull request #1326 from mceachen/main
feat(mcp-server-git): Add context_lines to git_diff* tools
This commit is contained in:
commit
1252f484b9
2 changed files with 20 additions and 11 deletions
|
|
@ -16,14 +16,16 @@ Please note that mcp-server-git is currently in early development. The functiona
|
||||||
|
|
||||||
2. `git_diff_unstaged`
|
2. `git_diff_unstaged`
|
||||||
- Shows changes in working directory not yet staged
|
- Shows changes in working directory not yet staged
|
||||||
- Input:
|
- Inputs:
|
||||||
- `repo_path` (string): Path to Git repository
|
- `repo_path` (string): Path to Git repository
|
||||||
|
- `context_lines` (number, optional): Number of context lines to show (default: 3)
|
||||||
- Returns: Diff output of unstaged changes
|
- Returns: Diff output of unstaged changes
|
||||||
|
|
||||||
3. `git_diff_staged`
|
3. `git_diff_staged`
|
||||||
- Shows changes that are staged for commit
|
- Shows changes that are staged for commit
|
||||||
- Input:
|
- Inputs:
|
||||||
- `repo_path` (string): Path to Git repository
|
- `repo_path` (string): Path to Git repository
|
||||||
|
- `context_lines` (number, optional): Number of context lines to show (default: 3)
|
||||||
- Returns: Diff output of staged changes
|
- Returns: Diff output of staged changes
|
||||||
|
|
||||||
4. `git_diff`
|
4. `git_diff`
|
||||||
|
|
@ -31,6 +33,7 @@ Please note that mcp-server-git is currently in early development. The functiona
|
||||||
- Inputs:
|
- Inputs:
|
||||||
- `repo_path` (string): Path to Git repository
|
- `repo_path` (string): Path to Git repository
|
||||||
- `target` (string): Target branch or commit to compare with
|
- `target` (string): Target branch or commit to compare with
|
||||||
|
- `context_lines` (number, optional): Number of context lines to show (default: 3)
|
||||||
- Returns: Diff output comparing current state with target
|
- Returns: Diff output comparing current state with target
|
||||||
|
|
||||||
5. `git_commit`
|
5. `git_commit`
|
||||||
|
|
|
||||||
|
|
@ -15,18 +15,24 @@ from enum import Enum
|
||||||
import git
|
import git
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
# Default number of context lines to show in diff output
|
||||||
|
DEFAULT_CONTEXT_LINES = 3
|
||||||
|
|
||||||
class GitStatus(BaseModel):
|
class GitStatus(BaseModel):
|
||||||
repo_path: str
|
repo_path: str
|
||||||
|
|
||||||
class GitDiffUnstaged(BaseModel):
|
class GitDiffUnstaged(BaseModel):
|
||||||
repo_path: str
|
repo_path: str
|
||||||
|
context_lines: int = DEFAULT_CONTEXT_LINES
|
||||||
|
|
||||||
class GitDiffStaged(BaseModel):
|
class GitDiffStaged(BaseModel):
|
||||||
repo_path: str
|
repo_path: str
|
||||||
|
context_lines: int = DEFAULT_CONTEXT_LINES
|
||||||
|
|
||||||
class GitDiff(BaseModel):
|
class GitDiff(BaseModel):
|
||||||
repo_path: str
|
repo_path: str
|
||||||
target: str
|
target: str
|
||||||
|
context_lines: int = DEFAULT_CONTEXT_LINES
|
||||||
|
|
||||||
class GitCommit(BaseModel):
|
class GitCommit(BaseModel):
|
||||||
repo_path: str
|
repo_path: str
|
||||||
|
|
@ -76,14 +82,14 @@ class GitTools(str, Enum):
|
||||||
def git_status(repo: git.Repo) -> str:
|
def git_status(repo: git.Repo) -> str:
|
||||||
return repo.git.status()
|
return repo.git.status()
|
||||||
|
|
||||||
def git_diff_unstaged(repo: git.Repo) -> str:
|
def git_diff_unstaged(repo: git.Repo, context_lines: int = DEFAULT_CONTEXT_LINES) -> str:
|
||||||
return repo.git.diff()
|
return repo.git.diff(f"--unified={context_lines}")
|
||||||
|
|
||||||
def git_diff_staged(repo: git.Repo) -> str:
|
def git_diff_staged(repo: git.Repo, context_lines: int = DEFAULT_CONTEXT_LINES) -> str:
|
||||||
return repo.git.diff("--cached")
|
return repo.git.diff(f"--unified={context_lines}", "--cached")
|
||||||
|
|
||||||
def git_diff(repo: git.Repo, target: str) -> str:
|
def git_diff(repo: git.Repo, target: str, context_lines: int = DEFAULT_CONTEXT_LINES) -> str:
|
||||||
return repo.git.diff(target)
|
return repo.git.diff(f"--unified={context_lines}", target)
|
||||||
|
|
||||||
def git_commit(repo: git.Repo, message: str) -> str:
|
def git_commit(repo: git.Repo, message: str) -> str:
|
||||||
commit = repo.index.commit(message)
|
commit = repo.index.commit(message)
|
||||||
|
|
@ -278,21 +284,21 @@ async def serve(repository: Path | None) -> None:
|
||||||
)]
|
)]
|
||||||
|
|
||||||
case GitTools.DIFF_UNSTAGED:
|
case GitTools.DIFF_UNSTAGED:
|
||||||
diff = git_diff_unstaged(repo)
|
diff = git_diff_unstaged(repo, arguments.get("context_lines", DEFAULT_CONTEXT_LINES))
|
||||||
return [TextContent(
|
return [TextContent(
|
||||||
type="text",
|
type="text",
|
||||||
text=f"Unstaged changes:\n{diff}"
|
text=f"Unstaged changes:\n{diff}"
|
||||||
)]
|
)]
|
||||||
|
|
||||||
case GitTools.DIFF_STAGED:
|
case GitTools.DIFF_STAGED:
|
||||||
diff = git_diff_staged(repo)
|
diff = git_diff_staged(repo, arguments.get("context_lines", DEFAULT_CONTEXT_LINES))
|
||||||
return [TextContent(
|
return [TextContent(
|
||||||
type="text",
|
type="text",
|
||||||
text=f"Staged changes:\n{diff}"
|
text=f"Staged changes:\n{diff}"
|
||||||
)]
|
)]
|
||||||
|
|
||||||
case GitTools.DIFF:
|
case GitTools.DIFF:
|
||||||
diff = git_diff(repo, arguments["target"])
|
diff = git_diff(repo, arguments["target"], arguments.get("context_lines", DEFAULT_CONTEXT_LINES))
|
||||||
return [TextContent(
|
return [TextContent(
|
||||||
type="text",
|
type="text",
|
||||||
text=f"Diff with {arguments['target']}:\n{diff}"
|
text=f"Diff with {arguments['target']}:\n{diff}"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue