feat(mcp): implement Git Operations MCP server with Gitea provider

Implements the Git Operations MCP server (Issue #58) providing:

Core features:
- GitPython wrapper for local repository operations (clone, commit, push, pull, diff, log)
- Branch management (create, delete, list, checkout)
- Workspace isolation per project with file-based locking
- Gitea provider for remote PR operations

MCP Tools (17 registered):
- clone_repository, git_status, create_branch, list_branches
- checkout, commit, push, pull, diff, log
- create_pull_request, get_pull_request, list_pull_requests
- merge_pull_request, get_workspace, lock_workspace, unlock_workspace

Technical details:
- FastMCP + FastAPI with JSON-RPC 2.0 protocol
- pydantic-settings for configuration (env prefix: GIT_OPS_)
- Comprehensive error hierarchy with structured codes
- 131 tests passing with 67% coverage
- Async operations via ThreadPoolExecutor

Closes: #105, #106, #107, #108, #109

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-06 20:48:20 +01:00
parent 4ad3d20cf2
commit 9dfa76aa41
19 changed files with 9544 additions and 0 deletions

View File

@@ -0,0 +1,179 @@
"""
Git Operations MCP Server.
Provides git repository management, branching, commits, and PR workflows
for Syndarix AI agents.
"""
__version__ = "0.1.0"
from config import Settings, get_settings, is_test_mode, reset_settings
from exceptions import (
APIError,
AuthenticationError,
BranchExistsError,
BranchNotFoundError,
CheckoutError,
CloneError,
CommitError,
CredentialError,
CredentialNotFoundError,
DirtyWorkspaceError,
ErrorCode,
GitError,
GitOpsError,
InvalidRefError,
MergeConflictError,
PRError,
PRNotFoundError,
ProviderError,
ProviderNotFoundError,
PullError,
PushError,
WorkspaceError,
WorkspaceLockedError,
WorkspaceNotFoundError,
WorkspaceSizeExceededError,
)
from models import (
BranchInfo,
BranchRequest,
BranchResult,
CheckoutRequest,
CheckoutResult,
CloneRequest,
CloneResult,
CommitInfo,
CommitRequest,
CommitResult,
CreatePRRequest,
CreatePRResult,
DiffHunk,
DiffRequest,
DiffResult,
FileChange,
FileChangeType,
FileDiff,
GetPRRequest,
GetPRResult,
GetWorkspaceRequest,
GetWorkspaceResult,
HealthStatus,
ListBranchesRequest,
ListBranchesResult,
ListPRsRequest,
ListPRsResult,
LockWorkspaceRequest,
LockWorkspaceResult,
LogRequest,
LogResult,
MergePRRequest,
MergePRResult,
MergeStrategy,
PRInfo,
ProviderStatus,
ProviderType,
PRState,
PullRequest,
PullResult,
PushRequest,
PushResult,
StatusRequest,
StatusResult,
UnlockWorkspaceRequest,
UnlockWorkspaceResult,
UpdatePRRequest,
UpdatePRResult,
WorkspaceInfo,
WorkspaceState,
)
__all__ = [
# Version
"__version__",
# Config
"Settings",
"get_settings",
"reset_settings",
"is_test_mode",
# Error codes
"ErrorCode",
# Exceptions
"GitOpsError",
"WorkspaceError",
"WorkspaceNotFoundError",
"WorkspaceLockedError",
"WorkspaceSizeExceededError",
"GitError",
"CloneError",
"CheckoutError",
"CommitError",
"PushError",
"PullError",
"MergeConflictError",
"BranchExistsError",
"BranchNotFoundError",
"InvalidRefError",
"DirtyWorkspaceError",
"ProviderError",
"AuthenticationError",
"ProviderNotFoundError",
"PRError",
"PRNotFoundError",
"APIError",
"CredentialError",
"CredentialNotFoundError",
# Enums
"FileChangeType",
"MergeStrategy",
"PRState",
"ProviderType",
"WorkspaceState",
# Dataclasses
"FileChange",
"BranchInfo",
"CommitInfo",
"DiffHunk",
"FileDiff",
"PRInfo",
"WorkspaceInfo",
# Request/Response models
"CloneRequest",
"CloneResult",
"StatusRequest",
"StatusResult",
"BranchRequest",
"BranchResult",
"ListBranchesRequest",
"ListBranchesResult",
"CheckoutRequest",
"CheckoutResult",
"CommitRequest",
"CommitResult",
"PushRequest",
"PushResult",
"PullRequest",
"PullResult",
"DiffRequest",
"DiffResult",
"LogRequest",
"LogResult",
"CreatePRRequest",
"CreatePRResult",
"GetPRRequest",
"GetPRResult",
"ListPRsRequest",
"ListPRsResult",
"MergePRRequest",
"MergePRResult",
"UpdatePRRequest",
"UpdatePRResult",
"GetWorkspaceRequest",
"GetWorkspaceResult",
"LockWorkspaceRequest",
"LockWorkspaceResult",
"UnlockWorkspaceRequest",
"UnlockWorkspaceResult",
"HealthStatus",
"ProviderStatus",
]