@selfagency/git-mcp 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/constants.ts","../src/resources/git.resources.ts","../src/git/client.ts","../src/services/branch.service.ts","../src/services/inspect.service.ts","../src/tools/advanced.tools.ts","../src/schemas/index.ts","../src/services/advanced.service.ts","../src/tools/branch.tools.ts","../src/tools/context.tools.ts","../src/services/context.service.ts","../src/tools/docs.tools.ts","../src/services/docs.service.ts","../src/tools/flow.tools.ts","../src/services/flow.service.ts","../src/tools/inspect.tools.ts","../src/tools/lfs.tools.ts","../src/services/lfs.service.ts","../src/tools/remote.tools.ts","../src/services/remote.service.ts","../src/tools/write.tools.ts","../src/services/write.service.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport {\n ALLOW_FORCE_PUSH,\n ALLOW_NO_VERIFY,\n AUTO_SIGN_COMMITS,\n AUTO_SIGN_TAGS,\n DEFAULT_REPO_PATH,\n DEFAULT_SIGNING_KEY,\n} from './config.js';\nimport { SERVER_NAME, SERVER_VERSION } from './constants.js';\nimport { registerGitResources } from './resources/git.resources.js';\nimport { registerAdvancedTools } from './tools/advanced.tools.js';\nimport { registerBranchTools } from './tools/branch.tools.js';\nimport { registerContextTools } from './tools/context.tools.js';\nimport { registerDocsTools } from './tools/docs.tools.js';\nimport { registerFlowTools } from './tools/flow.tools.js';\nimport { registerInspectTools } from './tools/inspect.tools.js';\nimport { registerLfsTools } from './tools/lfs.tools.js';\nimport { registerRemoteTools } from './tools/remote.tools.js';\nimport { registerWriteTools } from './tools/write.tools.js';\n\nconst server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n});\n\nregisterInspectTools(server);\nregisterWriteTools(server);\nregisterBranchTools(server);\nregisterRemoteTools(server);\nregisterAdvancedTools(server);\nregisterContextTools(server);\nregisterLfsTools(server);\nregisterFlowTools(server);\nregisterDocsTools(server);\nregisterGitResources(server);\n\nserver.registerTool(\n 'git_ping',\n {\n title: 'Git MCP Ping',\n description: 'Returns a simple response to verify the server is running.',\n inputSchema: {\n message: z.string().default('pong'),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ message }: { message: string }) => {\n return {\n content: [{ type: 'text', text: `git-mcp-server: ${message}` }],\n structuredContent: {\n ok: true,\n message,\n },\n };\n },\n);\n\nasync function main(): Promise<void> {\n if (DEFAULT_REPO_PATH) {\n console.error(`[git-mcp] default repository path: ${DEFAULT_REPO_PATH}`);\n }\n if (ALLOW_NO_VERIFY) console.error('[git-mcp] hook bypass enabled (GIT_ALLOW_NO_VERIFY=true)');\n if (ALLOW_FORCE_PUSH) console.error('[git-mcp] force push enabled (GIT_ALLOW_FORCE_PUSH=true)');\n if (AUTO_SIGN_COMMITS) console.error('[git-mcp] auto-signing commits (GIT_AUTO_SIGN_COMMITS=true)');\n if (AUTO_SIGN_TAGS) console.error('[git-mcp] auto-signing tags (GIT_AUTO_SIGN_TAGS=true)');\n if (DEFAULT_SIGNING_KEY) console.error(`[git-mcp] signing key: ${DEFAULT_SIGNING_KEY}`);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Server startup failed: ${message}`);\n process.exit(1);\n});\n","import path from 'node:path';\n\n/**\n * Parses --repo or --repo-path from process.argv.\n * Supports both `--repo-path /path` and `--repo-path=/path` forms.\n */\nfunction parseCliRepoPath(): string | undefined {\n const args = process.argv.slice(2);\n for (let i = 0; i < args.length; i++) {\n const arg = args[i] ?? '';\n if ((arg === '--repo' || arg === '--repo-path') && i + 1 < args.length) {\n return args[i + 1];\n }\n const match = /^--repo(?:-path)?=(.+)$/.exec(arg);\n if (match?.[1]) return match[1];\n }\n return undefined;\n}\n\nconst configured: string | undefined = process.env['GIT_REPO_PATH'] ?? parseCliRepoPath();\n\n/**\n * Server-level default repository path, resolved to an absolute path.\n * Set via the GIT_REPO_PATH environment variable or --repo / --repo-path CLI argument.\n */\nexport const DEFAULT_REPO_PATH: string | undefined = configured ? path.resolve(configured) : undefined;\n\n/**\n * Resolves the effective repository path for a tool request.\n * Uses the provided path if given, otherwise falls back to the server default.\n * Throws a clear error if neither is available.\n */\nexport function resolveRepoPath(repoPath: string | undefined): string {\n const resolved = repoPath ?? DEFAULT_REPO_PATH;\n if (!resolved) {\n throw new Error(\n 'No repository path provided. Pass repo_path in the tool request, ' +\n 'or configure a server default via the GIT_REPO_PATH environment variable ' +\n 'or the --repo / --repo-path CLI argument.',\n );\n }\n return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// Hook bypass\n// ---------------------------------------------------------------------------\n\n/**\n * When true, tools accept a `no_verify` parameter that passes --no-verify to\n * git commit and git push, bypassing pre-commit / pre-push hooks.\n * Enable via: GIT_ALLOW_NO_VERIFY=true\n */\nexport const ALLOW_NO_VERIFY: boolean = process.env['GIT_ALLOW_NO_VERIFY'] === 'true';\n\n// ---------------------------------------------------------------------------\n// Force push\n// ---------------------------------------------------------------------------\n\n/**\n * When true, tools accept a `force` parameter that passes --force to git push.\n * Note: this bypasses local safety checks only. Remote branch protection\n * (e.g. GitHub/GitLab protected branches) is enforced server-side regardless.\n * Enable via: GIT_ALLOW_FORCE_PUSH=true\n */\nexport const ALLOW_FORCE_PUSH: boolean = process.env['GIT_ALLOW_FORCE_PUSH'] === 'true';\n\n// ---------------------------------------------------------------------------\n// Commit / tag signing\n// ---------------------------------------------------------------------------\n\n/**\n * Default signing key (GPG key ID, SSH public key path, or empty to use git's\n * configured user.signingkey). Set via: GIT_SIGNING_KEY=<value>\n */\nexport const DEFAULT_SIGNING_KEY: string | undefined = process.env['GIT_SIGNING_KEY'] || undefined;\n\n/**\n * Signing format: openpgp | ssh | x509\n * Set via: GIT_SIGNING_FORMAT=ssh\n */\nexport const DEFAULT_SIGNING_FORMAT: string | undefined = process.env['GIT_SIGNING_FORMAT'] || undefined;\n\n/**\n * Auto-sign all commits produced by this server.\n * Enable via: GIT_AUTO_SIGN_COMMITS=true\n */\nexport const AUTO_SIGN_COMMITS: boolean = process.env['GIT_AUTO_SIGN_COMMITS'] === 'true';\n\n/**\n * Auto-sign all tags produced by this server.\n * Enable via: GIT_AUTO_SIGN_TAGS=true\n */\nexport const AUTO_SIGN_TAGS: boolean = process.env['GIT_AUTO_SIGN_TAGS'] === 'true';\n","export const SERVER_NAME = 'git-mcp-server';\nexport const SERVER_VERSION = '0.1.0';\nexport const CHARACTER_LIMIT = 25_000;\n\nexport const EXCLUDED_DIFF_DIRECTORIES = ['node_modules/', '.yarn/', '.astro/', 'dist/'] as const;\n\nexport const EXCLUDED_DIFF_EXTENSIONS = [\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'svg',\n 'ico',\n 'webp',\n 'bmp',\n 'tiff',\n 'mp4',\n 'mp3',\n 'wav',\n 'ogg',\n 'pdf',\n 'woff',\n 'woff2',\n 'ttf',\n 'eot',\n 'zip',\n 'tar',\n 'gz',\n] as const;\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { listBranches } from '../services/branch.service.js';\nimport { getDiff, getLog, getStatus } from '../services/inspect.service.js';\n\nfunction decodeRepoPath(value: string): string {\n return decodeURIComponent(value);\n}\n\nfunction stringify(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n\nexport function registerGitResources(server: McpServer): void {\n const templateConfig = { list: undefined };\n\n server.registerResource(\n 'git_repo_status',\n new ResourceTemplate('git+repo://status/{repo_path}', templateConfig),\n {\n title: 'Git Repository Status',\n description: 'Read-only repository status snapshot.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const status = await getStatus(repoPath);\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify(status) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_log',\n new ResourceTemplate('git+repo://log/{repo_path}', templateConfig),\n {\n title: 'Git Repository Log',\n description: 'Read-only recent commit log.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const commits = await getLog(repoPath, { limit: 20, offset: 0 });\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify({ commits }) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_branches',\n new ResourceTemplate('git+repo://branches/{repo_path}', templateConfig),\n {\n title: 'Git Repository Branches',\n description: 'Read-only branch list.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const branches = await listBranches(repoPath, true);\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify({ branches }) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_diff',\n new ResourceTemplate('git+repo://diff/{repo_path}', templateConfig),\n {\n title: 'Git Repository Diff',\n description: 'Read-only unstaged + staged diff views.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const [unstaged, staged] = await Promise.all([\n getDiff(repoPath, { mode: 'unstaged', filtered: false }),\n getDiff(repoPath, { mode: 'staged', filtered: false }),\n ]);\n\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'application/json',\n text: stringify({ unstaged, staged }),\n },\n ],\n };\n },\n );\n}\n","import { existsSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type { GitError, GitErrorKind } from '../types.js';\n\nconst GIT_NOT_FOUND_PATTERN = /(not found|is not recognized|ENOENT)/i;\nconst PERMISSION_PATTERN = /(permission denied|EACCES|EPERM)/i;\nconst CONFLICT_PATTERN = /(CONFLICT|merge conflict|rebase in progress|cherry-pick in progress)/i;\nconst NETWORK_PATTERN = /(network|timed out|unable to access|could not resolve host|proxy)/i;\n\nfunction classifyError(message: string): GitErrorKind {\n if (GIT_NOT_FOUND_PATTERN.test(message)) {\n return 'missing_git';\n }\n\n if (PERMISSION_PATTERN.test(message)) {\n return 'permission';\n }\n\n if (CONFLICT_PATTERN.test(message)) {\n return 'git_conflict';\n }\n\n if (NETWORK_PATTERN.test(message)) {\n return 'network';\n }\n\n return 'unknown';\n}\n\nexport function toGitError(error: unknown): GitError {\n if (error instanceof Error) {\n return {\n kind: classifyError(error.message),\n message: error.message,\n };\n }\n\n return {\n kind: 'unknown',\n message: String(error),\n };\n}\n\nexport function validateRepoPath(repoPath: string): string {\n const resolved = path.resolve(repoPath);\n\n if (!existsSync(resolved)) {\n throw new Error(`Repository path does not exist: ${repoPath}`);\n }\n\n if (!statSync(resolved).isDirectory()) {\n throw new Error(`Repository path is not a directory: ${repoPath}`);\n }\n\n return resolved;\n}\n\nexport function getGit(repoPath: string): SimpleGit {\n const safePath = validateRepoPath(repoPath);\n return simpleGit({ baseDir: safePath, binary: 'git', maxConcurrentProcesses: 6 });\n}\n","import { getGit } from '../git/client.js';\nimport type { BranchInfo } from '../types.js';\n\nexport interface CreateBranchOptions {\n readonly name: string;\n readonly fromRef?: string;\n readonly checkout: boolean;\n}\n\nexport interface DeleteBranchOptions {\n readonly name: string;\n readonly force: boolean;\n}\n\nexport async function listBranches(repoPath: string, all: boolean): Promise<BranchInfo[]> {\n const git = getGit(repoPath);\n const summary = await git.branch(all ? ['-a'] : []);\n\n return summary.all.map(name => {\n const details = Object.hasOwn(summary.branches, name) ? summary.branches[name] : undefined;\n return {\n name,\n isCurrent: summary.current === name,\n commit: details?.commit,\n upstream: details?.label,\n };\n });\n}\n\nexport async function createBranch(repoPath: string, options: CreateBranchOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.fromRef) {\n if (options.checkout) {\n await git.checkoutBranch(options.name, options.fromRef);\n } else {\n await git.raw(['branch', options.name, options.fromRef]);\n }\n return options.checkout\n ? `Created and checked out ${options.name} from ${options.fromRef}.`\n : `Created branch ${options.name} from ${options.fromRef}.`;\n }\n\n await git.branch([options.name]);\n if (options.checkout) {\n await git.checkout(options.name);\n }\n\n return options.checkout ? `Created and checked out ${options.name}.` : `Created branch ${options.name}.`;\n}\n\nexport async function deleteBranch(repoPath: string, options: DeleteBranchOptions): Promise<string> {\n const git = getGit(repoPath);\n await git.deleteLocalBranch(options.name, options.force);\n return `Deleted branch ${options.name}.`;\n}\n\nexport async function renameBranch(repoPath: string, oldName: string, newName: string): Promise<string> {\n const git = getGit(repoPath);\n await git.branch(['-m', oldName, newName]);\n return `Renamed branch ${oldName} to ${newName}.`;\n}\n\nexport async function checkoutRef(repoPath: string, ref: string, create: boolean): Promise<string> {\n const git = getGit(repoPath);\n\n if (create) {\n await git.checkoutLocalBranch(ref);\n return `Created and checked out ${ref}.`;\n }\n\n await git.checkout(ref);\n return `Checked out ${ref}.`;\n}\n\nexport async function setUpstream(repoPath: string, branch: string, upstream: string): Promise<string> {\n const git = getGit(repoPath);\n await git.raw(['branch', '--set-upstream-to', upstream, branch]);\n return `Set upstream of ${branch} to ${upstream}.`;\n}\n","import path from 'node:path';\nimport { CHARACTER_LIMIT, EXCLUDED_DIFF_DIRECTORIES, EXCLUDED_DIFF_EXTENSIONS } from '../constants.js';\nimport { getGit } from '../git/client.js';\nimport type { CommitInfo, DiffSummary, FileStatus } from '../types.js';\n\nexport interface GitStatusResult {\n readonly branch: string;\n readonly current: string;\n readonly tracking: string;\n readonly ahead: number;\n readonly behind: number;\n readonly files: FileStatus[];\n readonly isClean: boolean;\n}\n\nexport interface GitLogOptions {\n readonly limit: number;\n readonly offset: number;\n readonly author?: string;\n readonly grep?: string;\n readonly since?: string;\n readonly until?: string;\n readonly filePath?: string;\n}\n\nexport interface GitDiffOptions {\n readonly mode: 'unstaged' | 'staged' | 'refs';\n readonly fromRef?: string;\n readonly toRef?: string;\n readonly filtered: boolean;\n}\n\nfunction truncate(text: string): string {\n if (text.length <= CHARACTER_LIMIT) {\n return text;\n }\n\n return `${text.slice(0, CHARACTER_LIMIT)}\\n\\n[truncated to ${CHARACTER_LIMIT} characters]`;\n}\n\nfunction parseLogLine(line: string): CommitInfo | null {\n const [hash, authorName, authorEmail, dateIso, ...subjectParts] = line.split('\\t');\n if (!hash || !authorName || !authorEmail || !dateIso) {\n return null;\n }\n\n return {\n hash,\n authorName,\n authorEmail,\n dateIso,\n subject: subjectParts.join('\\t'),\n };\n}\n\nfunction shouldExcludeFile(filePath: string): boolean {\n if (EXCLUDED_DIFF_DIRECTORIES.some(prefix => filePath.startsWith(prefix))) {\n return true;\n }\n\n const extension = path.extname(filePath).replace(/^\\./, '').toLowerCase();\n if (!extension) {\n return false;\n }\n\n return EXCLUDED_DIFF_EXTENSIONS.includes(extension as (typeof EXCLUDED_DIFF_EXTENSIONS)[number]);\n}\n\nfunction buildDiffBaseArgs(options: GitDiffOptions): string[] {\n if (options.mode === 'staged') {\n return ['diff', '--staged'];\n }\n\n if (options.mode === 'refs') {\n if (!options.fromRef || !options.toRef) {\n throw new Error(\"from_ref and to_ref are required when mode='refs'\");\n }\n\n return ['diff', `${options.fromRef}..${options.toRef}`];\n }\n\n return ['diff'];\n}\n\nexport async function getStatus(repoPath: string): Promise<GitStatusResult> {\n const git = getGit(repoPath);\n const status = await git.status();\n\n const files: FileStatus[] = status.files.map(file => ({\n path: file.path,\n index: file.index,\n workingTree: file.working_dir,\n }));\n\n return {\n branch: status.current ?? '',\n current: status.current ?? '',\n tracking: status.tracking ?? '',\n ahead: status.ahead,\n behind: status.behind,\n files,\n isClean: status.isClean(),\n };\n}\n\nexport async function getLog(repoPath: string, options: GitLogOptions): Promise<CommitInfo[]> {\n const git = getGit(repoPath);\n\n const args = [\n 'log',\n '--date=iso-strict',\n `--skip=${options.offset}`,\n '-n',\n String(options.limit),\n '--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s',\n ];\n\n if (options.author) {\n args.push(`--author=${options.author}`);\n }\n\n if (options.grep) {\n args.push(`--grep=${options.grep}`);\n }\n\n if (options.since) {\n args.push(`--since=${options.since}`);\n }\n\n if (options.until) {\n args.push(`--until=${options.until}`);\n }\n\n if (options.filePath) {\n args.push('--', options.filePath);\n }\n\n const output = await git.raw(args);\n\n return output\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .map(parseLogLine)\n .filter((item): item is CommitInfo => item !== null);\n}\n\nexport async function showRef(repoPath: string, ref: string): Promise<string> {\n const git = getGit(repoPath);\n const output = await git.raw(['show', '--stat', '--patch', ref]);\n return truncate(output);\n}\n\nexport async function getDiffSummary(repoPath: string, options: GitDiffOptions): Promise<DiffSummary> {\n const git = getGit(repoPath);\n const baseArgs = buildDiffBaseArgs(options).slice(1);\n const summary = await git.diffSummary(baseArgs);\n\n return {\n filesChanged: summary.files.length,\n insertions: summary.insertions,\n deletions: summary.deletions,\n };\n}\n\nexport async function getDiff(repoPath: string, options: GitDiffOptions): Promise<string> {\n const git = getGit(repoPath);\n const baseArgs = buildDiffBaseArgs(options);\n\n if (!options.filtered) {\n const output = await git.raw(baseArgs);\n return truncate(output);\n }\n\n const namesOutput = await git.raw([...baseArgs, '--name-only']);\n const files = namesOutput\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .filter(line => !shouldExcludeFile(line));\n\n if (files.length === 0) {\n return 'No changed files after filtering.';\n }\n\n const chunks: string[] = [];\n for (const filePath of files) {\n const diff = await git.raw([...baseArgs, '--', filePath]);\n chunks.push(`=== ${filePath} ===\\n${diff.trim()}`);\n }\n\n return truncate(chunks.join('\\n\\n'));\n}\n\nexport async function blameFile(repoPath: string, filePath: string, ref?: string): Promise<string> {\n const git = getGit(repoPath);\n\n const args = ['blame'];\n if (ref) {\n args.push(ref);\n }\n args.push('--', filePath);\n\n const output = await git.raw(args);\n return truncate(output);\n}\n\nexport async function getReflog(repoPath: string, limit: number): Promise<string> {\n const git = getGit(repoPath);\n const output = await git.raw(['reflog', '--date=iso', '-n', String(limit)]);\n return truncate(output);\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport {\n runBisectAction,\n runCherryPickAction,\n runRebaseAction,\n runStashAction,\n runSubmoduleAction,\n runTagAction,\n runWorktreeAction,\n} from '../services/advanced.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nfunction buildError(error: unknown): { content: Array<{ type: 'text'; text: string }> } {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n}\n\nexport function registerAdvancedTools(server: McpServer): void {\n server.registerTool(\n 'git_stash',\n {\n title: 'Git Stash Actions',\n description: 'Save, list, apply, pop, or drop stash entries.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['save', 'list', 'apply', 'pop', 'drop']),\n message: z.string().optional(),\n index: z.number().int().min(0).optional(),\n include_untracked: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n message,\n index,\n include_untracked,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'save' | 'list' | 'apply' | 'pop' | 'drop';\n message?: string;\n index?: number;\n include_untracked: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runStashAction(repoPath, {\n action,\n message,\n index,\n includeUntracked: include_untracked,\n });\n\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_rebase',\n {\n title: 'Git Rebase Actions',\n description: 'Start, continue, skip, or abort rebase operations.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['start', 'continue', 'abort', 'skip']),\n onto: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n onto,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'start' | 'continue' | 'abort' | 'skip';\n onto?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runRebaseAction(repoPath, { action, onto });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_cherry_pick',\n {\n title: 'Git Cherry-pick Actions',\n description: 'Start, continue, or abort cherry-pick.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['start', 'continue', 'abort']),\n ref: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n ref,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'start' | 'continue' | 'abort';\n ref?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runCherryPickAction(repoPath, { action, ref });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_bisect',\n {\n title: 'Git Bisect Actions',\n description: 'Run bisect workflows for bug isolation.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['start', 'good', 'bad', 'skip', 'run', 'reset']),\n ref: z.string().optional(),\n good_ref: z.string().optional(),\n bad_ref: z.string().optional(),\n command: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n ref,\n good_ref,\n bad_ref,\n command,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'start' | 'good' | 'bad' | 'skip' | 'run' | 'reset';\n ref?: string;\n good_ref?: string;\n bad_ref?: string;\n command?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runBisectAction(repoPath, {\n action,\n ref,\n goodRef: good_ref,\n badRef: bad_ref,\n command,\n });\n\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_tag',\n {\n title: 'Git Tag Actions',\n description: 'List, create, or delete tags. Supports GPG/SSH signed tags.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['list', 'create', 'delete']),\n name: z.string().optional(),\n target: z.string().optional(),\n message: z.string().optional(),\n sign: z\n .boolean()\n .default(false)\n .describe('Create a signed tag (-s/-u). Defaults to server AUTO_SIGN_TAGS setting.'),\n signing_key: z\n .string()\n .optional()\n .describe('Specific signing key ID or path. Falls back to GIT_SIGNING_KEY env var.'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n name,\n target,\n message,\n sign,\n signing_key,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'list' | 'create' | 'delete';\n name?: string;\n target?: string;\n message?: string;\n sign: boolean;\n signing_key?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runTagAction(repoPath, {\n action,\n name,\n target,\n message,\n sign,\n signingKey: signing_key,\n });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_worktree',\n {\n title: 'Git Worktree Actions',\n description: 'Add, list, or remove worktrees.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['add', 'list', 'remove']),\n path: z.string().optional(),\n branch: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n path,\n branch,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'add' | 'list' | 'remove';\n path?: string;\n branch?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runWorktreeAction(repoPath, { action, path, branch });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_submodule',\n {\n title: 'Git Submodule Actions',\n description: 'Add, list, update, or sync submodules.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['add', 'list', 'update', 'sync']),\n url: z.string().optional(),\n path: z.string().optional(),\n recursive: z.boolean().default(true),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n url,\n path,\n recursive,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'add' | 'list' | 'update' | 'sync';\n url?: string;\n path?: string;\n recursive: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runSubmoduleAction(repoPath, {\n action,\n url,\n path,\n recursive,\n });\n\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n}\n","import { z } from 'zod';\n\nexport const RepoPathSchema = z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Absolute path to the local Git repository. ' +\n 'If omitted, falls back to the server default set via the GIT_REPO_PATH environment variable or --repo-path CLI argument.',\n );\n\nexport const RefSchema = z\n .string()\n .min(1, 'ref is required')\n .describe('Git reference: branch, tag, commit SHA, or HEAD expression.');\n\nexport const PaginationSchema = z\n .object({\n limit: z.number().int().min(1).max(200).default(50),\n offset: z.number().int().min(0).default(0),\n })\n .strict();\n\nexport const ConfirmSchema = z.boolean().default(false);\n\nexport const ResponseFormatSchema = z\n .enum(['markdown', 'json'])\n .default('markdown')\n .describe('Output format for the response.');\n","import { AUTO_SIGN_TAGS, DEFAULT_SIGNING_KEY } from '../config.js';\nimport { getGit } from '../git/client.js';\n\nexport interface StashActionOptions {\n readonly action: 'save' | 'list' | 'apply' | 'pop' | 'drop';\n readonly message?: string;\n readonly index?: number;\n readonly includeUntracked?: boolean;\n}\n\nexport interface RebaseActionOptions {\n readonly action: 'start' | 'continue' | 'abort' | 'skip';\n readonly onto?: string;\n}\n\nexport interface CherryPickActionOptions {\n readonly action: 'start' | 'continue' | 'abort';\n readonly ref?: string;\n}\n\nexport interface BisectActionOptions {\n readonly action: 'start' | 'good' | 'bad' | 'skip' | 'run' | 'reset';\n readonly ref?: string;\n readonly goodRef?: string;\n readonly badRef?: string;\n readonly command?: string;\n}\n\nexport interface TagActionOptions {\n readonly action: 'list' | 'create' | 'delete';\n readonly name?: string;\n readonly target?: string;\n readonly message?: string;\n /** Sign the tag. Defaults to AUTO_SIGN_TAGS server config. */\n readonly sign?: boolean;\n /** Signing key to use. Falls back to DEFAULT_SIGNING_KEY, then git's user.signingkey. */\n readonly signingKey?: string;\n}\n\nexport interface WorktreeActionOptions {\n readonly action: 'add' | 'list' | 'remove';\n readonly path?: string;\n readonly branch?: string;\n}\n\nexport interface SubmoduleActionOptions {\n readonly action: 'add' | 'list' | 'update' | 'sync';\n readonly url?: string;\n readonly path?: string;\n readonly recursive?: boolean;\n}\n\nexport async function runStashAction(repoPath: string, options: StashActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'save') {\n const args = ['stash', 'push'];\n if (options.includeUntracked) {\n args.push('--include-untracked');\n }\n if (options.message) {\n args.push('-m', options.message);\n }\n const output = await git.raw(args);\n return output.trim() || 'Stash saved.';\n }\n\n if (options.action === 'list') {\n const output = await git.raw(['stash', 'list']);\n return output.trim() || 'No stashes.';\n }\n\n const index = options.index ?? 0;\n if (options.action === 'apply') {\n const output = await git.raw(['stash', 'apply', `stash@{${index}}`]);\n return output.trim() || `Applied stash@{${index}}.`;\n }\n\n if (options.action === 'pop') {\n const output = await git.raw(['stash', 'pop', `stash@{${index}}`]);\n return output.trim() || `Popped stash@{${index}}.`;\n }\n\n const output = await git.raw(['stash', 'drop', `stash@{${index}}`]);\n return output.trim() || `Dropped stash@{${index}}.`;\n}\n\nexport async function runRebaseAction(repoPath: string, options: RebaseActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'continue') {\n const output = await git.raw(['rebase', '--continue']);\n return output.trim() || 'Rebase continued.';\n }\n\n if (options.action === 'abort') {\n const output = await git.raw(['rebase', '--abort']);\n return output.trim() || 'Rebase aborted.';\n }\n\n if (options.action === 'skip') {\n const output = await git.raw(['rebase', '--skip']);\n return output.trim() || 'Rebase skipped current commit.';\n }\n\n if (!options.onto) {\n throw new Error('onto is required for rebase start.');\n }\n\n const output = await git.raw(['rebase', options.onto]);\n return output.trim() || `Rebase started onto ${options.onto}.`;\n}\n\nexport async function runCherryPickAction(repoPath: string, options: CherryPickActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'continue') {\n const output = await git.raw(['cherry-pick', '--continue']);\n return output.trim() || 'Cherry-pick continued.';\n }\n\n if (options.action === 'abort') {\n const output = await git.raw(['cherry-pick', '--abort']);\n return output.trim() || 'Cherry-pick aborted.';\n }\n\n if (!options.ref) {\n throw new Error('ref is required when cherry-pick action is start.');\n }\n\n const output = await git.raw(['cherry-pick', options.ref]);\n return output.trim() || `Cherry-picked ${options.ref}.`;\n}\n\nexport async function runBisectAction(repoPath: string, options: BisectActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n switch (options.action) {\n case 'start': {\n if (!options.badRef || !options.goodRef) {\n throw new Error('goodRef and badRef are required for bisect start.');\n }\n await git.raw(['bisect', 'start']);\n await git.raw(['bisect', 'bad', options.badRef]);\n await git.raw(['bisect', 'good', options.goodRef]);\n return `Bisect started between good=${options.goodRef} and bad=${options.badRef}.`;\n }\n case 'good': {\n const output = await git.raw(['bisect', 'good', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Marked current commit as good.';\n }\n case 'bad': {\n const output = await git.raw(['bisect', 'bad', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Marked current commit as bad.';\n }\n case 'skip': {\n const output = await git.raw(['bisect', 'skip', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Skipped current bisect commit.';\n }\n case 'run': {\n if (!options.command) {\n throw new Error('command is required for bisect run.');\n }\n const output = await git.raw(['bisect', 'run', 'sh', '-lc', options.command]);\n return output.trim() || 'Bisect run completed.';\n }\n case 'reset': {\n const output = await git.raw(['bisect', 'reset']);\n return output.trim() || 'Bisect reset.';\n }\n }\n}\n\nexport async function runTagAction(repoPath: string, options: TagActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.tags();\n return output.all.join('\\n') || 'No tags.';\n }\n\n if (options.action === 'delete') {\n if (!options.name) {\n throw new Error('name is required for delete action.');\n }\n await git.tag(['-d', options.name]);\n return `Deleted tag ${options.name}.`;\n }\n\n if (!options.name) {\n throw new Error('name is required for create action.');\n }\n\n const shouldSign = options.sign ?? AUTO_SIGN_TAGS;\n\n if (shouldSign) {\n const key = options.signingKey ?? DEFAULT_SIGNING_KEY;\n const signFlag = key ? ['-u', key] : ['-s'];\n const msgFlag = options.message ? ['-m', options.message] : ['-m', options.name];\n const targetArg = options.target ? [options.target] : [];\n await git.raw(['tag', ...signFlag, ...msgFlag, options.name, ...targetArg]);\n return `Created signed tag ${options.name}.`;\n }\n\n if (options.message) {\n await git.addAnnotatedTag(options.name, options.message);\n return `Created annotated tag ${options.name}.`;\n }\n\n // Only pass the tag name (string) to addTag\n await git.addTag(options.name);\n return `Created tag ${options.name}.`;\n}\n\nexport async function runWorktreeAction(repoPath: string, options: WorktreeActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.raw(['worktree', 'list', '--porcelain']);\n return output.trim();\n }\n\n if (options.action === 'remove') {\n if (!options.path) {\n throw new Error('path is required for worktree remove.');\n }\n await git.raw(['worktree', 'remove', options.path]);\n return `Removed worktree ${options.path}.`;\n }\n\n if (!options.path || !options.branch) {\n throw new Error('path and branch are required for worktree add.');\n }\n\n await git.raw(['worktree', 'add', options.path, options.branch]);\n return `Added worktree at ${options.path} for ${options.branch}.`;\n}\n\nexport async function runSubmoduleAction(repoPath: string, options: SubmoduleActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.raw(['submodule', 'status']);\n return output.trim() || 'No submodules.';\n }\n\n if (options.action === 'sync') {\n const args = ['submodule', 'sync'];\n if (options.recursive) {\n args.push('--recursive');\n }\n const output = await git.raw(args);\n return output.trim() || 'Submodule sync complete.';\n }\n\n if (options.action === 'update') {\n const args = ['submodule', 'update', '--init'];\n if (options.recursive) {\n args.push('--recursive');\n }\n const output = await git.raw(args);\n return output.trim() || 'Submodule update complete.';\n }\n\n if (!options.url || !options.path) {\n throw new Error('url and path are required for submodule add.');\n }\n\n await git.raw(['submodule', 'add', options.url, options.path]);\n return `Added submodule ${options.path}.`;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport {\n checkoutRef,\n createBranch,\n deleteBranch,\n listBranches,\n renameBranch,\n setUpstream,\n} from '../services/branch.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerBranchTools(server: McpServer): void {\n server.registerTool(\n 'git_list_branches',\n {\n title: 'List Git Branches',\n description: 'List local branches, or all branches including remotes.',\n inputSchema: {\n repo_path: RepoPathSchema,\n all: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n all,\n response_format,\n }: {\n repo_path: string | undefined;\n all: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const branches = await listBranches(repoPath, all);\n return {\n content: [{ type: 'text', text: render({ branches }, response_format) }],\n structuredContent: { branches },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_create_branch',\n {\n title: 'Create Git Branch',\n description: 'Create a branch from current HEAD or an explicit ref.',\n inputSchema: {\n repo_path: RepoPathSchema,\n name: z.string().min(1),\n from_ref: z.string().optional(),\n checkout: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n name,\n from_ref,\n checkout,\n response_format,\n }: {\n repo_path: string | undefined;\n name: string;\n from_ref?: string;\n checkout: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await createBranch(repoPath, {\n name,\n fromRef: from_ref,\n checkout,\n });\n\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_delete_branch',\n {\n title: 'Delete Git Branch',\n description: 'Delete a local branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n name: z.string().min(1),\n force: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n name,\n force,\n response_format,\n }: {\n repo_path: string | undefined;\n name: string;\n force: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await deleteBranch(repoPath, { name, force });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_rename_branch',\n {\n title: 'Rename Git Branch',\n description: 'Rename an existing branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n old_name: z.string().min(1),\n new_name: z.string().min(1),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n old_name,\n new_name,\n response_format,\n }: {\n repo_path: string | undefined;\n old_name: string;\n new_name: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await renameBranch(repoPath, old_name, new_name);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_checkout',\n {\n title: 'Git Checkout',\n description: 'Checkout a branch, tag, or commit; optionally create a new local branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n ref: z.string().min(1),\n create: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n ref,\n create,\n response_format,\n }: {\n repo_path: string | undefined;\n ref: string;\n create: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await checkoutRef(repoPath, ref, create);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_set_upstream',\n {\n title: 'Set Branch Upstream',\n description: 'Set the upstream tracking branch for a local branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n branch: z.string().min(1),\n upstream: z.string().min(1),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n branch,\n upstream,\n response_format,\n }: {\n repo_path: string | undefined;\n branch: string;\n upstream: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await setUpstream(repoPath, branch, upstream);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { getConfig, getContextSummary, searchHistory, setConfig } from '../services/context.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nfunction buildError(error: unknown): { content: Array<{ type: 'text'; text: string }> } {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n}\n\nexport function registerContextTools(server: McpServer): void {\n server.registerTool(\n 'git_context_summary',\n {\n title: 'Git Context Summary',\n description: 'High-signal repository context for LLM-assisted workflows.',\n inputSchema: {\n repo_path: RepoPathSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ repo_path, response_format }: { repo_path: string | undefined; response_format: 'markdown' | 'json' }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const summary = await getContextSummary(repoPath);\n return {\n content: [{ type: 'text', text: render(summary, response_format) }],\n structuredContent: { summary },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_search',\n {\n title: 'Git Search',\n description: 'Search code and history using pickaxe and grep.',\n inputSchema: {\n repo_path: RepoPathSchema,\n query: z.string().min(1),\n limit: z.number().int().min(1).max(200).default(20),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n query,\n limit,\n response_format,\n }: {\n repo_path: string | undefined;\n query: string;\n limit: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await searchHistory(repoPath, query, limit);\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_get_config',\n {\n title: 'Get Git Config',\n description: 'Read repository/local git configuration values.',\n inputSchema: {\n repo_path: RepoPathSchema,\n key: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n key,\n response_format,\n }: {\n repo_path: string | undefined;\n key?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const value = await getConfig(repoPath, key);\n return {\n content: [{ type: 'text', text: render({ value }, response_format) }],\n structuredContent: { value },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_set_config',\n {\n title: 'Set Git Config',\n description: 'Set repository-local git configuration value.',\n inputSchema: {\n repo_path: RepoPathSchema,\n key: z.string().min(1),\n value: z.string(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n key,\n value,\n response_format,\n }: {\n repo_path: string | undefined;\n key: string;\n value: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await setConfig(repoPath, key, value);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { CHARACTER_LIMIT } from '../constants.js';\nimport { getGit } from '../git/client.js';\nimport { getLog, getStatus } from './inspect.service.js';\n\nexport interface ContextSummary {\n readonly branch: string;\n readonly ahead: number;\n readonly behind: number;\n readonly isClean: boolean;\n readonly changedFiles: number;\n readonly recentCommits: Array<{ hash: string; subject: string; dateIso: string }>;\n readonly remotes: string[];\n readonly inProgress: {\n rebasing: boolean;\n merging: boolean;\n cherryPicking: boolean;\n bisecting: boolean;\n };\n}\n\nexport async function getContextSummary(repoPath: string): Promise<ContextSummary> {\n const git = getGit(repoPath);\n const [status, commits, remotesRaw, gitDir] = await Promise.all([\n getStatus(repoPath),\n getLog(repoPath, { limit: 5, offset: 0 }),\n git.getRemotes(false),\n git.raw(['rev-parse', '--absolute-git-dir']).then(s => s.trim()),\n ]);\n\n const rebasing = existsSync(path.join(gitDir, 'rebase-merge')) || existsSync(path.join(gitDir, 'rebase-apply'));\n const merging = existsSync(path.join(gitDir, 'MERGE_HEAD'));\n const cherryPicking = existsSync(path.join(gitDir, 'CHERRY_PICK_HEAD'));\n const bisecting = existsSync(path.join(gitDir, 'BISECT_LOG'));\n\n return {\n branch: status.current,\n ahead: status.ahead,\n behind: status.behind,\n isClean: status.isClean,\n changedFiles: status.files.length,\n recentCommits: commits.map(commit => ({\n hash: commit.hash,\n subject: commit.subject,\n dateIso: commit.dateIso,\n })),\n remotes: remotesRaw.map(remote => remote.name),\n inProgress: {\n rebasing,\n merging,\n cherryPicking,\n bisecting,\n },\n };\n}\n\nexport async function searchHistory(repoPath: string, query: string, limit: number): Promise<string> {\n const git = getGit(repoPath);\n\n const [pickaxe, grep] = await Promise.all([\n git.raw(['log', '-S', query, '--oneline', '-n', String(limit)]),\n git.raw(['grep', '-n', '-m', String(limit), '--', query]).catch(() => ''),\n ]);\n\n const sections = [\n '## Pickaxe (-S)',\n pickaxe.trim() || 'No history matches.',\n '',\n '## grep',\n grep.trim() || 'No working-tree matches.',\n ];\n\n const combined = sections.join('\\n');\n return combined.length > CHARACTER_LIMIT\n ? `${combined.slice(0, CHARACTER_LIMIT)}\\n\\n[Output truncated at ${CHARACTER_LIMIT} characters]`\n : combined;\n}\n\nconst BLOCKED_CONFIG_KEY_PATTERNS: readonly RegExp[] = [/^credential\\./i, /^url\\./i];\n\nconst SENSITIVE_KEY_PATTERNS: readonly RegExp[] = [/(password|token|secret|auth|passphrase)/i];\n\nfunction isBlockedConfigKey(key: string): boolean {\n return BLOCKED_CONFIG_KEY_PATTERNS.some(p => p.test(key));\n}\n\nfunction redactConfigValue(key: string, value: string): string {\n if (SENSITIVE_KEY_PATTERNS.some(p => p.test(key))) {\n return '***';\n }\n // Redact credentials embedded in URLs: https://user:pass@host → https://***@host\n const stripped = value.replace(/(https?:\\/\\/)[^@\\s]+@/g, '$1***@');\n // Redact long hex strings that look like access tokens (not normal in config values)\n if (/\\b[0-9a-f]{40,}\\b/i.test(stripped)) {\n return '***';\n }\n return stripped;\n}\n\nexport async function getConfig(repoPath: string, key?: string): Promise<string> {\n const git = getGit(repoPath);\n\n if (key) {\n if (isBlockedConfigKey(key)) {\n throw new Error(`Access to git config key '${key}' is not permitted.`);\n }\n const value = await git.raw(['config', '--get', key]);\n return redactConfigValue(key, value.trim());\n }\n\n const output = await git.raw(['config', '--list']);\n const lines = output\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .flatMap(line => {\n const eq = line.indexOf('=');\n if (eq === -1) return [];\n const k = line.slice(0, eq);\n const v = line.slice(eq + 1);\n if (isBlockedConfigKey(k)) return [];\n return [`${k}=${redactConfigValue(k, v)}`];\n });\n\n return lines.join('\\n').trim();\n}\n\nexport async function setConfig(repoPath: string, key: string, value: string): Promise<string> {\n const git = getGit(repoPath);\n await git.raw(['config', key, value]);\n return `Set ${key}.`;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { toGitError } from '../git/client.js';\nimport { ResponseFormatSchema } from '../schemas/index.js';\nimport { fetchGitManPage, searchGitDocs } from '../services/docs.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerDocsTools(server: McpServer): void {\n server.registerTool(\n 'git_docs',\n {\n title: 'Git Documentation',\n description:\n 'Search and browse official Git documentation from git-scm.com. ' +\n 'Use action=\"search\" to find relevant commands and concepts by keyword. ' +\n 'Use action=\"man\" to fetch the full man page for a specific git command ' +\n '(e.g. query=\"commit\" fetches the git-commit man page). ' +\n 'Useful for answering questions about how to use git commands, understanding options, ' +\n 'and discovering the right git command for a task.',\n inputSchema: {\n action: z.enum(['search', 'man']),\n query: z\n .string()\n .min(1)\n .describe(\n 'For action=\"search\": search terms (e.g. \"undo last commit\"). ' +\n 'For action=\"man\": git command name without \"git-\" prefix (e.g. \"commit\", \"rebase\", \"merge\").',\n ),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n action,\n query,\n response_format,\n }: {\n action: 'search' | 'man';\n query: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n if (action === 'search') {\n const results = await searchGitDocs(query);\n const structuredContent: Record<string, unknown> = {\n query: results.query,\n results: results.results,\n };\n\n if (response_format === 'json') {\n return {\n content: [{ type: 'text', text: JSON.stringify(structuredContent, null, 2) }],\n structuredContent,\n };\n }\n\n if (results.results.length === 0) {\n const text = `No results found for \"${query}\" on git-scm.com.`;\n return { content: [{ type: 'text', text }], structuredContent };\n }\n\n const lines = [`## Git Docs Search: \"${results.query}\"`, ''];\n for (const r of results.results) {\n lines.push(`### [${r.title}](${r.url})`);\n if (r.excerpt) lines.push(r.excerpt);\n lines.push('');\n }\n\n const text = lines.join('\\n');\n return { content: [{ type: 'text', text }], structuredContent };\n }\n\n // action === 'man'\n const text = await fetchGitManPage(query);\n return {\n content: [{ type: 'text', text: render(text, response_format) }],\n structuredContent: { command: query, content: text } as Record<string, unknown>,\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { CHARACTER_LIMIT } from '../constants.js';\n\nexport interface GitDocsSearchResult {\n title: string;\n url: string;\n excerpt: string;\n}\n\nexport interface GitDocsSearchResponse {\n query: string;\n results: GitDocsSearchResult[];\n}\n\n/** Strip HTML tags, decode common entities, and collapse whitespace. */\nfunction stripHtml(html: string): string {\n // Remove <script> and <style> blocks including their content\n let text = html.replace(/<(script|style)[^>]*>[\\s\\S]*?<\\/\\1>/gi, ' ');\n // Strip all remaining HTML tags\n text = text.replace(/<[^>]+>/g, ' ');\n // Decode common HTML entities\n text = text\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, ' ')\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCodePoint(Number(code)));\n // Collapse whitespace\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/** Extract the content between two markers in an HTML string. */\nfunction extractBetween(html: string, startMarker: RegExp, endMarker: RegExp): string {\n const startMatch = startMarker.exec(html);\n if (!startMatch) return html;\n const startIdx = startMatch.index + startMatch[0].length;\n const remainder = html.slice(startIdx);\n const endMatch = endMarker.exec(remainder);\n return endMatch ? remainder.slice(0, endMatch.index) : remainder;\n}\n\n/**\n * Search git-scm.com for documentation matching a query.\n * Uses the same search endpoint as the site's search box.\n */\nexport async function searchGitDocs(query: string): Promise<GitDocsSearchResponse> {\n const url = `https://git-scm.com/search/results?search=${encodeURIComponent(query)}&language=en`;\n\n let html: string;\n try {\n const response = await fetch(url, {\n headers: { Accept: 'text/html', 'User-Agent': 'git-mcp-docs/1.0' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new Error(`git-scm.com returned HTTP ${response.status}`);\n }\n html = await response.text();\n } catch (err) {\n throw new Error(`Failed to fetch git docs search: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Parse result entries: each is a <tr> or <li> with a link and excerpt\n // The site returns <li> elements inside <ul class=\"result-list\">\n const results: GitDocsSearchResult[] = [];\n\n // Extract result items via regex — site uses <li> blocks with <a> and <p>\n const listMatch = /<ul[^>]*class=\"[^\"]*result-list[^\"]*\"[^>]*>([\\s\\S]*?)<\\/ul>/i.exec(html);\n const listHtml = listMatch ? listMatch[1] : html;\n\n const itemRegex = /<li[^>]*>([\\s\\S]*?)<\\/li>/gi;\n let itemMatch: RegExpExecArray | null;\n\n while ((itemMatch = itemRegex.exec(listHtml)) !== null) {\n const item = itemMatch[1]!;\n const linkMatch = /<a[^>]+href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/i.exec(item);\n if (!linkMatch) continue;\n\n const href = linkMatch[1]!.trim();\n const title = stripHtml(linkMatch[2]!).trim();\n if (!title) continue;\n\n const excerptMatch = /<(?:p|span)[^>]*class=\"[^\"]*excerpt[^\"]*\"[^>]*>([\\s\\S]*?)<\\/(?:p|span)>/i.exec(item);\n const excerpt = excerptMatch ? stripHtml(excerptMatch[1]!).trim() : '';\n\n const fullUrl = href.startsWith('http') ? href : `https://git-scm.com${href}`;\n results.push({ title, url: fullUrl, excerpt });\n }\n\n // Fallback: if no structured results, look for plain <a href=\"/docs/...\"> links\n if (results.length === 0) {\n const linkRegex = /<a[^>]+href=\"(\\/docs\\/[^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/gi;\n let m: RegExpExecArray | null;\n const seen = new Set<string>();\n while ((m = linkRegex.exec(html)) !== null && results.length < 20) {\n const href = m[1]!;\n const title = stripHtml(m[2]!).trim();\n if (!title || seen.has(href)) continue;\n seen.add(href);\n results.push({ title, url: `https://git-scm.com${href}`, excerpt: '' });\n }\n }\n\n return { query, results };\n}\n\n/**\n * Fetch the git man page for a command from git-scm.com.\n * Provide the command without the \"git-\" prefix (e.g. \"commit\", \"merge\").\n */\nexport async function fetchGitManPage(command: string): Promise<string> {\n // Normalize: strip leading \"git \" or \"git-\"\n const normalized = command\n .trim()\n .toLowerCase()\n .replace(/^git[- ]/, '');\n\n const url = `https://git-scm.com/docs/git-${normalized}`;\n\n let html: string;\n try {\n const response = await fetch(url, {\n headers: { Accept: 'text/html', 'User-Agent': 'git-mcp-docs/1.0' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\n `No man page found for \"git ${normalized}\". ` + `Check the command name or search with action=\"search\".`,\n );\n }\n throw new Error(`git-scm.com returned HTTP ${response.status} for git-${normalized}`);\n }\n html = await response.text();\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('No man page')) throw err;\n throw new Error(`Failed to fetch git man page: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Extract the main article content\n const articleContent = extractBetween(\n html,\n /<(?:article|div)[^>]*(?:id=\"main\"|class=\"[^\"]*(?:sect|man-page|article)[^\"]*\")[^>]*>/i,\n /<\\/(?:article|div)>/i,\n );\n\n const content = stripHtml(articleContent || html);\n\n const header = `# git-${normalized}(1)\\n\\nSource: ${url}\\n\\n`;\n const full = header + content;\n\n return full.length > CHARACTER_LIMIT\n ? full.slice(0, CHARACTER_LIMIT) + '\\n\\n[...truncated — content exceeded limit]'\n : full;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { runFlowAction } from '../services/flow.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nconst FLOW_ACTION_VALUES = [\n 'init',\n 'feature-start',\n 'feature-finish',\n 'feature-publish',\n 'feature-list',\n 'release-start',\n 'release-finish',\n 'release-publish',\n 'release-list',\n 'hotfix-start',\n 'hotfix-finish',\n 'hotfix-list',\n 'support-start',\n 'support-list',\n] as const;\n\nexport function registerFlowTools(server: McpServer): void {\n server.registerTool(\n 'git_flow',\n {\n title: 'Git Flow Actions',\n description:\n 'Implements the git-flow branching model without requiring the git-flow CLI extension. ' +\n 'Supports feature, release, hotfix, and support branches. ' +\n 'Use \"init\" first to configure branch names and prefixes in local git config. ' +\n 'Branch names (main/develop) and prefixes are read from gitflow.* config with sensible defaults. ' +\n 'Actions: init — set up flow config and develop branch. ' +\n 'feature-start/finish/publish/list — manage feature branches off develop. ' +\n 'release-start/finish/publish/list — manage release branches; finish merges to main+develop and tags. ' +\n 'hotfix-start/finish/list — manage hotfix branches off main; finish merges to main+develop and tags. ' +\n 'support-start/list — create long-lived support branches off main.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(FLOW_ACTION_VALUES),\n name: z\n .string()\n .optional()\n .describe('Feature/release/hotfix/support name or version (e.g. \"my-feature\", \"1.2.0\").'),\n main_branch: z\n .string()\n .optional()\n .describe('Override the main branch name (default: gitflow.branch.master config or \"main\").'),\n develop_branch: z\n .string()\n .optional()\n .describe('Override the develop branch name (default: gitflow.branch.develop config or \"develop\").'),\n remote: z.string().optional().describe('Remote name for publish operations (default: \"origin\").'),\n tag: z\n .boolean()\n .default(true)\n .describe('Create an annotated tag when finishing a release or hotfix (default: true).'),\n tag_message: z.string().optional().describe('Message for the version tag.'),\n delete_branch: z\n .boolean()\n .default(true)\n .describe('Delete the branch after a finish operation (default: true).'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n name,\n main_branch,\n develop_branch,\n remote,\n tag,\n tag_message,\n delete_branch,\n response_format,\n }: {\n repo_path: string | undefined;\n action: (typeof FLOW_ACTION_VALUES)[number];\n name?: string;\n main_branch?: string;\n develop_branch?: string;\n remote?: string;\n tag: boolean;\n tag_message?: string;\n delete_branch: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runFlowAction(repoPath, {\n action,\n name,\n mainBranch: main_branch,\n developBranch: develop_branch,\n remote,\n tag,\n tagMessage: tag_message,\n deleteBranch: delete_branch,\n });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { getGit } from '../git/client.js';\n\nexport type FlowAction =\n | 'init'\n | 'feature-start'\n | 'feature-finish'\n | 'feature-publish'\n | 'feature-list'\n | 'release-start'\n | 'release-finish'\n | 'release-publish'\n | 'release-list'\n | 'hotfix-start'\n | 'hotfix-finish'\n | 'hotfix-list'\n | 'support-start'\n | 'support-list';\n\nexport interface FlowConfig {\n mainBranch: string;\n developBranch: string;\n featurePrefix: string;\n releasePrefix: string;\n hotfixPrefix: string;\n supportPrefix: string;\n versionTagPrefix: string;\n}\n\nexport interface FlowOptions {\n readonly action: FlowAction;\n /** Feature/release/hotfix name or version string. */\n readonly name?: string;\n /** Override the main branch (default: from gitflow config or 'main'). */\n readonly mainBranch?: string;\n /** Override the develop branch (default: from gitflow config or 'develop'). */\n readonly developBranch?: string;\n /** Remote for publish actions. */\n readonly remote?: string;\n /** Whether to create a tag when finishing a release/hotfix (default: true). */\n readonly tag?: boolean;\n /** Message for the version tag. */\n readonly tagMessage?: string;\n /** Whether to delete the branch after finish (default: true). */\n readonly deleteBranch?: boolean;\n}\n\nasync function getFlowConfig(git: ReturnType<typeof getGit>, overrides: FlowOptions): Promise<FlowConfig> {\n const get = async (key: string, fallback: string): Promise<string> => {\n try {\n const value = await git.raw(['config', '--local', key]);\n return value.trim() || fallback;\n } catch {\n return fallback;\n }\n };\n\n const mainBranch = overrides.mainBranch ?? (await get('gitflow.branch.master', 'main'));\n const developBranch = overrides.developBranch ?? (await get('gitflow.branch.develop', 'develop'));\n\n return {\n mainBranch,\n developBranch,\n featurePrefix: await get('gitflow.prefix.feature', 'feature/'),\n releasePrefix: await get('gitflow.prefix.release', 'release/'),\n hotfixPrefix: await get('gitflow.prefix.hotfix', 'hotfix/'),\n supportPrefix: await get('gitflow.prefix.support', 'support/'),\n versionTagPrefix: await get('gitflow.prefix.versiontag', ''),\n };\n}\n\nasync function listBranchesByPrefix(git: ReturnType<typeof getGit>, prefix: string): Promise<string> {\n const result = await git.branch(['-a']);\n const matching = result.all\n .map(b => b.replace(/^remotes\\/[^/]+\\//, '').trim())\n .filter((b, idx, arr) => b.startsWith(prefix) && arr.indexOf(b) === idx)\n .map(b => b.slice(prefix.length));\n return matching.length > 0 ? matching.join('\\n') : `No ${prefix.slice(0, -1)} branches found.`;\n}\n\nasync function branchExists(git: ReturnType<typeof getGit>, branch: string): Promise<boolean> {\n try {\n const result = await git.branch(['-a']);\n return result.all.some(b => b === branch || b === `remotes/origin/${branch}` || b.endsWith(`/${branch}`));\n } catch {\n return false;\n }\n}\n\nexport async function runFlowAction(repoPath: string, options: FlowOptions): Promise<string> {\n const git = getGit(repoPath);\n const cfg = await getFlowConfig(git, options);\n const deleteBranch = options.deleteBranch ?? true;\n const tagOnFinish = options.tag ?? true;\n\n switch (options.action) {\n // -----------------------------------------------------------------------\n // init\n // -----------------------------------------------------------------------\n case 'init': {\n // Persist flow config into local git config\n const sets: Array<[string, string]> = [\n ['gitflow.branch.master', cfg.mainBranch],\n ['gitflow.branch.develop', cfg.developBranch],\n ['gitflow.prefix.feature', cfg.featurePrefix],\n ['gitflow.prefix.release', cfg.releasePrefix],\n ['gitflow.prefix.hotfix', cfg.hotfixPrefix],\n ['gitflow.prefix.support', cfg.supportPrefix],\n ['gitflow.prefix.versiontag', cfg.versionTagPrefix],\n ];\n for (const [key, val] of sets) {\n await git.raw(['config', '--local', key, val]);\n }\n\n // Create develop branch if it doesn't exist\n if (!(await branchExists(git, cfg.developBranch))) {\n await git.checkoutLocalBranch(cfg.developBranch);\n const lines = [`Initialized git flow.`, `Created branch: ${cfg.developBranch}`];\n lines.push(`Main branch: ${cfg.mainBranch}, Develop branch: ${cfg.developBranch}`);\n return lines.join('\\n');\n }\n\n return [\n `Initialized git flow.`,\n `Main branch: ${cfg.mainBranch}, Develop branch: ${cfg.developBranch}`,\n `Prefixes — feature: ${cfg.featurePrefix}, release: ${cfg.releasePrefix}, hotfix: ${cfg.hotfixPrefix}`,\n ].join('\\n');\n }\n\n // -----------------------------------------------------------------------\n // feature\n // -----------------------------------------------------------------------\n case 'feature-list': {\n return listBranchesByPrefix(git, cfg.featurePrefix);\n }\n\n case 'feature-start': {\n if (!options.name) throw new Error('name is required for feature-start.');\n const branch = `${cfg.featurePrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.developBranch);\n return `Created and switched to branch ${branch} from ${cfg.developBranch}.`;\n }\n\n case 'feature-finish': {\n if (!options.name) throw new Error('name is required for feature-finish.');\n const branch = `${cfg.featurePrefix}${options.name}`;\n await git.checkout(cfg.developBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.developBranch}`]);\n if (deleteBranch) {\n await git.deleteLocalBranch(branch);\n return `Merged ${branch} into ${cfg.developBranch} and deleted branch.`;\n }\n return `Merged ${branch} into ${cfg.developBranch}.`;\n }\n\n case 'feature-publish': {\n if (!options.name) throw new Error('name is required for feature-publish.');\n const branch = `${cfg.featurePrefix}${options.name}`;\n const remote = options.remote ?? 'origin';\n await git.push(remote, branch, ['--set-upstream']);\n return `Published ${branch} to ${remote}.`;\n }\n\n // -----------------------------------------------------------------------\n // release\n // -----------------------------------------------------------------------\n case 'release-list': {\n return listBranchesByPrefix(git, cfg.releasePrefix);\n }\n\n case 'release-start': {\n if (!options.name) throw new Error('name is required for release-start.');\n const branch = `${cfg.releasePrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.developBranch);\n return `Created and switched to branch ${branch} from ${cfg.developBranch}.`;\n }\n\n case 'release-finish': {\n if (!options.name) throw new Error('name is required for release-finish.');\n const branch = `${cfg.releasePrefix}${options.name}`;\n const tagName = `${cfg.versionTagPrefix}${options.name}`;\n const tagMsg = options.tagMessage ?? `Release ${options.name}`;\n\n // Merge into main\n await git.checkout(cfg.mainBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.mainBranch}`]);\n\n // Tag the release on main\n if (tagOnFinish) {\n await git.addAnnotatedTag(tagName, tagMsg);\n }\n\n // Merge back into develop\n await git.checkout(cfg.developBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.developBranch}`]);\n\n const lines = [\n `Merged ${branch} into ${cfg.mainBranch}.`,\n ...(tagOnFinish ? [`Tagged: ${tagName}`] : []),\n `Merged ${branch} into ${cfg.developBranch}.`,\n ];\n\n if (deleteBranch) {\n await git.deleteLocalBranch(branch);\n lines.push(`Deleted branch ${branch}.`);\n }\n\n return lines.join('\\n');\n }\n\n case 'release-publish': {\n if (!options.name) throw new Error('name is required for release-publish.');\n const branch = `${cfg.releasePrefix}${options.name}`;\n const remote = options.remote ?? 'origin';\n await git.push(remote, branch, ['--set-upstream']);\n return `Published ${branch} to ${remote}.`;\n }\n\n // -----------------------------------------------------------------------\n // hotfix\n // -----------------------------------------------------------------------\n case 'hotfix-list': {\n return listBranchesByPrefix(git, cfg.hotfixPrefix);\n }\n\n case 'hotfix-start': {\n if (!options.name) throw new Error('name is required for hotfix-start.');\n const branch = `${cfg.hotfixPrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.mainBranch);\n return `Created and switched to branch ${branch} from ${cfg.mainBranch}.`;\n }\n\n case 'hotfix-finish': {\n if (!options.name) throw new Error('name is required for hotfix-finish.');\n const branch = `${cfg.hotfixPrefix}${options.name}`;\n const tagName = `${cfg.versionTagPrefix}${options.name}`;\n const tagMsg = options.tagMessage ?? `Hotfix ${options.name}`;\n\n // Merge into main\n await git.checkout(cfg.mainBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.mainBranch}`]);\n\n // Tag the hotfix on main\n if (tagOnFinish) {\n await git.addAnnotatedTag(tagName, tagMsg);\n }\n\n // Merge back into develop\n await git.checkout(cfg.developBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.developBranch}`]);\n\n const lines = [\n `Merged ${branch} into ${cfg.mainBranch}.`,\n ...(tagOnFinish ? [`Tagged: ${tagName}`] : []),\n `Merged ${branch} into ${cfg.developBranch}.`,\n ];\n\n if (deleteBranch) {\n await git.deleteLocalBranch(branch);\n lines.push(`Deleted branch ${branch}.`);\n }\n\n return lines.join('\\n');\n }\n\n // -----------------------------------------------------------------------\n // support\n // -----------------------------------------------------------------------\n case 'support-list': {\n return listBranchesByPrefix(git, cfg.supportPrefix);\n }\n\n case 'support-start': {\n if (!options.name) throw new Error('name is required for support-start.');\n const branch = `${cfg.supportPrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.mainBranch);\n return `Created and switched to branch ${branch} from ${cfg.mainBranch}.`;\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport {\n blameFile,\n getDiff,\n getDiffSummary,\n getLog,\n getReflog,\n getStatus,\n showRef,\n} from '../services/inspect.service.js';\n\nfunction toText(content: unknown, responseFormat: 'markdown' | 'json'): string {\n if (responseFormat === 'json') {\n return JSON.stringify(content, null, 2);\n }\n\n return typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n}\n\nexport function registerInspectTools(server: McpServer): void {\n server.registerTool(\n 'git_status',\n {\n title: 'Git Status',\n description: 'Get repository working tree and branch status.',\n inputSchema: {\n repo_path: RepoPathSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ repo_path, response_format }: { repo_path: string | undefined; response_format: 'markdown' | 'json' }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const status = await getStatus(repoPath);\n return {\n content: [{ type: 'text', text: toText(status, response_format) }],\n structuredContent: { status },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_log',\n {\n title: 'Git Log',\n description: 'Get commit history with optional filters and pagination.',\n inputSchema: {\n repo_path: RepoPathSchema,\n limit: z.number().int().min(1).max(200).default(30),\n offset: z.number().int().min(0).default(0),\n author: z.string().optional(),\n grep: z.string().optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n file_path: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n limit,\n offset,\n author,\n grep,\n since,\n until,\n file_path,\n response_format,\n }: {\n repo_path: string | undefined;\n limit: number;\n offset: number;\n author?: string;\n grep?: string;\n since?: string;\n until?: string;\n file_path?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const commits = await getLog(repoPath, {\n limit,\n offset,\n author,\n grep,\n since,\n until,\n filePath: file_path,\n });\n\n return {\n content: [{ type: 'text', text: toText(commits, response_format) }],\n structuredContent: { commits },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_show',\n {\n title: 'Git Show',\n description: 'Show patch and metadata for a commit, tag, or ref.',\n inputSchema: {\n repo_path: RepoPathSchema,\n ref: z.string().min(1),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n ref,\n response_format,\n }: {\n repo_path: string | undefined;\n ref: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await showRef(repoPath, ref);\n return {\n content: [{ type: 'text', text: toText(output, response_format) }],\n structuredContent: { ref, output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_diff',\n {\n title: 'Git Diff',\n description: 'Show unstaged, staged, or ref-to-ref diff. Supports optional LLM-oriented filtering.',\n inputSchema: {\n repo_path: RepoPathSchema,\n mode: z.enum(['unstaged', 'staged', 'refs']).default('unstaged'),\n from_ref: z.string().optional(),\n to_ref: z.string().optional(),\n filtered: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n mode,\n from_ref,\n to_ref,\n filtered,\n response_format,\n }: {\n repo_path: string | undefined;\n mode: 'unstaged' | 'staged' | 'refs';\n from_ref?: string;\n to_ref?: string;\n filtered: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const [summary, output] = await Promise.all([\n getDiffSummary(repoPath, {\n mode,\n fromRef: from_ref,\n toRef: to_ref,\n filtered,\n }),\n getDiff(repoPath, {\n mode,\n fromRef: from_ref,\n toRef: to_ref,\n filtered,\n }),\n ]);\n\n const payload = { summary, output };\n return {\n content: [{ type: 'text', text: toText(payload, response_format) }],\n structuredContent: payload,\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_blame',\n {\n title: 'Git Blame',\n description: 'Show line-level author attribution for a file.',\n inputSchema: {\n repo_path: RepoPathSchema,\n file_path: z.string().min(1),\n ref: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n file_path,\n ref,\n response_format,\n }: {\n repo_path: string | undefined;\n file_path: string;\n ref?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await blameFile(repoPath, file_path, ref);\n return {\n content: [{ type: 'text', text: toText(output, response_format) }],\n structuredContent: { file_path, ref, output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_reflog',\n {\n title: 'Git Reflog',\n description: 'Show local HEAD and ref movement history for recovery.',\n inputSchema: {\n repo_path: RepoPathSchema,\n limit: z.number().int().min(1).max(200).default(30),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n limit,\n response_format,\n }: {\n repo_path: string | undefined;\n limit: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await getReflog(repoPath, limit);\n return {\n content: [{ type: 'text', text: toText(output, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { runLfsAction } from '../services/lfs.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerLfsTools(server: McpServer): void {\n server.registerTool(\n 'git_lfs',\n {\n title: 'Git LFS Actions',\n description:\n 'Manage Git Large File Storage (LFS). Supports tracking/untracking file patterns, ' +\n 'listing LFS-tracked files and status, pulling/pushing LFS objects, installing LFS ' +\n 'hooks for the repository, and migrating existing files into or out of LFS storage.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum([\n 'track',\n 'untrack',\n 'ls-files',\n 'status',\n 'pull',\n 'push',\n 'install',\n 'migrate-import',\n 'migrate-export',\n ]),\n patterns: z\n .array(z.string())\n .optional()\n .describe('File glob patterns for track/untrack (e.g. [\"*.psd\", \"*.zip\"]).'),\n remote: z.string().optional().describe('Remote name for pull/push operations.'),\n include: z.string().optional().describe('Comma-separated include patterns for migrate or pull operations.'),\n exclude: z.string().optional().describe('Comma-separated exclude patterns for migrate or pull operations.'),\n everything: z\n .boolean()\n .default(false)\n .describe('Pass --all/--everything to include all refs in push/migrate operations.'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n action,\n patterns,\n remote,\n include,\n exclude,\n everything,\n response_format,\n }: {\n repo_path: string | undefined;\n action:\n | 'track'\n | 'untrack'\n | 'ls-files'\n | 'status'\n | 'pull'\n | 'push'\n | 'install'\n | 'migrate-import'\n | 'migrate-export';\n patterns?: string[];\n remote?: string;\n include?: string;\n exclude?: string;\n everything: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runLfsAction(repoPath, {\n action,\n patterns,\n remote,\n include,\n exclude,\n everything,\n });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { getGit } from '../git/client.js';\n\nexport type LfsAction =\n | 'track'\n | 'untrack'\n | 'ls-files'\n | 'status'\n | 'pull'\n | 'push'\n | 'install'\n | 'migrate-import'\n | 'migrate-export';\n\nexport interface LfsOptions {\n readonly action: LfsAction;\n /** File patterns for track/untrack (e.g. \"*.psd\", \"*.zip\"). */\n readonly patterns?: string[];\n /** Remote name for pull/push operations. */\n readonly remote?: string;\n /** Comma-separated include patterns for migrate operations. */\n readonly include?: string;\n /** Comma-separated exclude patterns for migrate operations. */\n readonly exclude?: string;\n /** Pass --everything to migrate-import to rewrite all refs. */\n readonly everything?: boolean;\n}\n\nexport async function runLfsAction(repoPath: string, options: LfsOptions): Promise<string> {\n const git = getGit(repoPath);\n\n switch (options.action) {\n case 'install': {\n const output = await git.raw(['lfs', 'install']);\n return output.trim() || 'Git LFS installed for this repository.';\n }\n\n case 'track': {\n if (!options.patterns || options.patterns.length === 0) {\n throw new Error('patterns is required for lfs track.');\n }\n const output = await git.raw(['lfs', 'track', ...options.patterns]);\n return output.trim() || `Tracking: ${options.patterns.join(', ')}`;\n }\n\n case 'untrack': {\n if (!options.patterns || options.patterns.length === 0) {\n throw new Error('patterns is required for lfs untrack.');\n }\n const output = await git.raw(['lfs', 'untrack', ...options.patterns]);\n return output.trim() || `Untracked: ${options.patterns.join(', ')}`;\n }\n\n case 'ls-files': {\n const output = await git.raw(['lfs', 'ls-files']);\n return output.trim() || 'No LFS-tracked files found.';\n }\n\n case 'status': {\n const output = await git.raw(['lfs', 'status']);\n return output.trim() || 'No LFS status changes.';\n }\n\n case 'pull': {\n const args = ['lfs', 'pull'];\n if (options.remote) args.push(options.remote);\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS pull complete.';\n }\n\n case 'push': {\n if (!options.remote) {\n throw new Error('remote is required for lfs push.');\n }\n const args = ['lfs', 'push', options.remote];\n if (options.everything) args.push('--all');\n const output = await git.raw(args);\n return output.trim() || `LFS push to ${options.remote} complete.`;\n }\n\n case 'migrate-import': {\n const args = ['lfs', 'migrate', 'import'];\n if (options.everything) args.push('--everything');\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS migrate import complete.';\n }\n\n case 'migrate-export': {\n const args = ['lfs', 'migrate', 'export'];\n if (options.everything) args.push('--everything');\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS migrate export complete.';\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { fetchRemote, listRemotes, manageRemote, pullRemote, pushRemote } from '../services/remote.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerRemoteTools(server: McpServer): void {\n server.registerTool(\n 'git_list_remotes',\n {\n title: 'List Git Remotes',\n description: 'List configured repository remotes with fetch and push URLs.',\n inputSchema: {\n repo_path: RepoPathSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ repo_path, response_format }: { repo_path: string | undefined; response_format: 'markdown' | 'json' }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const remotes = await listRemotes(repoPath);\n return {\n content: [{ type: 'text', text: render({ remotes }, response_format) }],\n structuredContent: { remotes },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_remote',\n {\n title: 'Manage Git Remotes',\n description: 'Add, remove, or set URL for remotes using action-based input.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['add', 'remove', 'set-url']),\n name: z.string().min(1),\n url: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n name,\n url,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'add' | 'remove' | 'set-url';\n name: string;\n url?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await manageRemote(repoPath, { action, name, url });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_fetch',\n {\n title: 'Git Fetch',\n description: 'Fetch updates from remote with optional pruning.',\n inputSchema: {\n repo_path: RepoPathSchema,\n remote: z.string().optional(),\n branch: z.string().optional(),\n prune: z.boolean().default(true),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n remote,\n branch,\n prune,\n response_format,\n }: {\n repo_path: string | undefined;\n remote?: string;\n branch?: string;\n prune: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await fetchRemote(repoPath, { remote, branch, prune });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_pull',\n {\n title: 'Git Pull',\n description: 'Pull from remote with merge (default) or rebase mode.',\n inputSchema: {\n repo_path: RepoPathSchema,\n remote: z.string().optional(),\n branch: z.string().optional(),\n rebase: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n remote,\n branch,\n rebase,\n response_format,\n }: {\n repo_path: string | undefined;\n remote?: string;\n branch?: string;\n rebase: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await pullRemote(repoPath, { remote, branch, rebase });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_push',\n {\n title: 'Git Push',\n description:\n 'Push to remote. Supports safe force (`--force-with-lease`), hard force (if enabled server-side), ' +\n 'and bypassing pre-push hooks (if enabled server-side).',\n inputSchema: {\n repo_path: RepoPathSchema,\n remote: z.string().optional(),\n branch: z.string().optional(),\n set_upstream: z.boolean().default(false),\n force_with_lease: z.boolean().default(false),\n force: z\n .boolean()\n .default(false)\n .describe(\n 'Hard force push (--force). Only accepted when GIT_ALLOW_FORCE_PUSH=true is set on the server. ' +\n 'Prefer force_with_lease unless you have a specific reason for a hard force.',\n ),\n no_verify: z\n .boolean()\n .default(false)\n .describe(\n 'Bypass pre-push hooks (--no-verify). Only accepted when GIT_ALLOW_NO_VERIFY=true is set on the server.',\n ),\n tags: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n remote,\n branch,\n set_upstream,\n force_with_lease,\n force,\n no_verify,\n tags,\n response_format,\n }: {\n repo_path: string | undefined;\n remote?: string;\n branch?: string;\n set_upstream: boolean;\n force_with_lease: boolean;\n force: boolean;\n no_verify: boolean;\n tags: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await pushRemote(repoPath, {\n remote,\n branch,\n setUpstream: set_upstream,\n forceWithLease: force_with_lease,\n force,\n noVerify: no_verify,\n tags,\n });\n\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { ALLOW_FORCE_PUSH, ALLOW_NO_VERIFY } from '../config.js';\nimport { getGit } from '../git/client.js';\nimport type { RemoteInfo } from '../types.js';\n\nexport interface ManageRemoteOptions {\n readonly action: 'add' | 'remove' | 'set-url';\n readonly name: string;\n readonly url?: string;\n}\n\nexport interface FetchOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly prune: boolean;\n}\n\nexport interface PullOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly rebase: boolean;\n}\n\nexport interface PushOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly setUpstream: boolean;\n readonly forceWithLease: boolean;\n /** Hard force push. Requires ALLOW_FORCE_PUSH=true. Only use when you know what you are doing. */\n readonly force?: boolean;\n /** Pass --no-verify to bypass pre-push hooks. Requires ALLOW_NO_VERIFY=true. */\n readonly noVerify?: boolean;\n readonly tags: boolean;\n}\n\nfunction sanitizeRemoteUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n if (!parsed.username && !parsed.password) return url;\n parsed.username = '';\n parsed.password = '';\n return parsed.toString();\n } catch {\n // SCP-style URLs (e.g. git@github.com:org/repo.git) are not parseable by URL\n return url;\n }\n}\n\nexport async function listRemotes(repoPath: string): Promise<RemoteInfo[]> {\n const git = getGit(repoPath);\n const remotes = await git.getRemotes(true);\n\n return remotes.map(remote => ({\n name: remote.name,\n fetchUrl: sanitizeRemoteUrl(remote.refs.fetch),\n pushUrl: sanitizeRemoteUrl(remote.refs.push),\n }));\n}\n\nexport async function manageRemote(repoPath: string, options: ManageRemoteOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'add') {\n if (!options.url) {\n throw new Error(\"url is required for action='add'\");\n }\n await git.addRemote(options.name, options.url);\n return `Added remote ${options.name}.`;\n }\n\n if (options.action === 'remove') {\n await git.removeRemote(options.name);\n return `Removed remote ${options.name}.`;\n }\n\n if (!options.url) {\n throw new Error(\"url is required for action='set-url'\");\n }\n\n await git.remote(['set-url', options.name, options.url]);\n return `Updated remote ${options.name} URL.`;\n}\n\nexport async function fetchRemote(repoPath: string, options: FetchOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const args: string[] = [];\n if (options.prune) {\n args.push('--prune');\n }\n\n // Only pass remote and branch if they are defined, otherwise use overloads\n if (options.remote && options.branch) {\n await git.fetch(options.remote, options.branch, args);\n return `Fetched ${options.remote}/${options.branch}.`;\n } else if (options.remote) {\n await git.fetch(options.remote, args);\n return `Fetched ${options.remote}.`;\n } else {\n await git.fetch(args);\n return 'Fetched default remote.';\n }\n}\n\nexport async function pullRemote(repoPath: string, options: PullOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const pullOptions: string[] = [];\n if (options.rebase) {\n pullOptions.push('--rebase');\n }\n\n await git.pull(options.remote, options.branch, pullOptions);\n return `Pulled ${options.remote ?? 'tracking remote'}${options.branch ? `/${options.branch}` : ''}${options.rebase ? ' with rebase' : ''}.`;\n}\n\nexport async function pushRemote(repoPath: string, options: PushOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.noVerify && !ALLOW_NO_VERIFY) {\n throw new Error(\n 'no_verify is disabled on this server. Set GIT_ALLOW_NO_VERIFY=true to permit bypassing git hooks.',\n );\n }\n\n if (options.force && !ALLOW_FORCE_PUSH) {\n throw new Error(\n 'force push is disabled on this server. Set GIT_ALLOW_FORCE_PUSH=true to enable it. ' +\n 'Consider using force_with_lease instead for a safer alternative.',\n );\n }\n\n const pushOptions: string[] = [];\n if (options.setUpstream) {\n pushOptions.push('--set-upstream');\n }\n\n if (options.forceWithLease) {\n pushOptions.push('--force-with-lease');\n }\n\n if (options.force) {\n pushOptions.push('--force');\n }\n\n if (options.tags) {\n pushOptions.push('--tags');\n }\n\n if (options.noVerify) {\n pushOptions.push('--no-verify');\n }\n\n await git.push(options.remote, options.branch, pushOptions);\n return `Pushed ${options.remote ?? 'tracking remote'}${options.branch ? `/${options.branch}` : ''}.`;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { ConfirmSchema, RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { addFiles, commitChanges, resetChanges, restoreFiles, revertCommit } from '../services/write.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerWriteTools(server: McpServer): void {\n server.registerTool(\n 'git_add',\n {\n title: 'Git Add',\n description: 'Stage files in the index.',\n inputSchema: {\n repo_path: RepoPathSchema,\n all: z.boolean().default(false),\n paths: z.array(z.string()).optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n all,\n paths,\n response_format,\n }: {\n repo_path: string | undefined;\n all: boolean;\n paths?: string[];\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await addFiles(repoPath, { all, paths });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_restore',\n {\n title: 'Git Restore',\n description: 'Restore paths in worktree and/or index from current state or source ref.',\n inputSchema: {\n repo_path: RepoPathSchema,\n paths: z.array(z.string()).min(1),\n staged: z.boolean().default(false),\n worktree: z.boolean().default(true),\n source: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: true,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n paths,\n staged,\n worktree,\n source,\n response_format,\n }: {\n repo_path: string | undefined;\n paths: string[];\n staged: boolean;\n worktree: boolean;\n source?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await restoreFiles(repoPath, { paths, staged, worktree, source });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_commit',\n {\n title: 'Git Commit',\n description:\n 'Create a commit from staged changes, optionally amending the previous commit. ' +\n 'Supports GPG/SSH commit signing and bypassing git hooks (if enabled server-side).',\n inputSchema: {\n repo_path: RepoPathSchema,\n message: z.string().min(1),\n all: z.boolean().default(false),\n amend: z.boolean().default(false),\n no_edit: z.boolean().default(false),\n sign: z\n .boolean()\n .default(false)\n .describe('Sign the commit with GPG/SSH. Defaults to server AUTO_SIGN_COMMITS setting.'),\n signing_key: z\n .string()\n .optional()\n .describe('Specific signing key ID or path. Falls back to GIT_SIGNING_KEY env var.'),\n no_verify: z\n .boolean()\n .default(false)\n .describe(\n 'Bypass pre-commit and commit-msg hooks (--no-verify). ' +\n 'Only accepted when GIT_ALLOW_NO_VERIFY=true is set on the server.',\n ),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n message,\n all,\n amend,\n no_edit,\n sign,\n signing_key,\n no_verify,\n response_format,\n }: {\n repo_path: string | undefined;\n message: string;\n all: boolean;\n amend: boolean;\n no_edit: boolean;\n sign: boolean;\n signing_key?: string;\n no_verify: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const commitMessage = await commitChanges(repoPath, {\n message,\n all,\n amend,\n noEdit: no_edit,\n sign,\n signingKey: signing_key,\n noVerify: no_verify,\n });\n\n return {\n content: [{ type: 'text', text: render({ message: commitMessage }, response_format) }],\n structuredContent: { message: commitMessage },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_reset',\n {\n title: 'Git Reset',\n description: 'Reset HEAD/index/worktree by mode. Hard reset requires confirm=true.',\n inputSchema: {\n repo_path: RepoPathSchema,\n mode: z.enum(['soft', 'mixed', 'hard']).default('mixed'),\n target: z.string().optional(),\n paths: z.array(z.string()).optional(),\n confirm: ConfirmSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n mode,\n target,\n paths,\n confirm,\n response_format,\n }: {\n repo_path: string | undefined;\n mode: 'soft' | 'mixed' | 'hard';\n target?: string;\n paths?: string[];\n confirm: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n if (mode === 'hard' && !confirm) {\n throw new Error('Hard reset requires confirm=true.');\n }\n\n const repoPath = resolveRepoPath(repo_path);\n const message = await resetChanges(repoPath, { mode, target, paths });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_revert',\n {\n title: 'Git Revert',\n description: 'Revert a commit without rewriting history.',\n inputSchema: {\n repo_path: RepoPathSchema,\n ref: z.string().min(1),\n no_commit: z.boolean().default(false),\n mainline: z.number().int().min(1).optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n ref,\n no_commit,\n mainline,\n response_format,\n }: {\n repo_path: string | undefined;\n ref: string;\n no_commit: boolean;\n mainline?: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await revertCommit(repoPath, {\n ref,\n noCommit: no_commit,\n mainline,\n });\n\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { ALLOW_NO_VERIFY, AUTO_SIGN_COMMITS, DEFAULT_SIGNING_KEY } from '../config.js';\nimport { getGit } from '../git/client.js';\n\nexport interface GitAddOptions {\n readonly all?: boolean;\n readonly paths?: string[];\n}\n\nexport interface GitRestoreOptions {\n readonly paths: string[];\n readonly staged: boolean;\n readonly worktree: boolean;\n readonly source?: string;\n}\n\nexport interface GitCommitOptions {\n readonly message: string;\n readonly all: boolean;\n readonly amend: boolean;\n readonly noEdit: boolean;\n /** Sign the commit. Defaults to AUTO_SIGN_COMMITS server config. */\n readonly sign?: boolean;\n /** Signing key to use. Falls back to DEFAULT_SIGNING_KEY, then git's user.signingkey. */\n readonly signingKey?: string;\n /** Pass --no-verify to bypass pre-commit/commit-msg hooks. Requires ALLOW_NO_VERIFY=true. */\n readonly noVerify?: boolean;\n}\n\nexport interface GitResetOptions {\n readonly mode: 'soft' | 'mixed' | 'hard';\n readonly target?: string;\n readonly paths?: string[];\n}\n\nexport interface GitRevertOptions {\n readonly ref: string;\n readonly noCommit: boolean;\n readonly mainline?: number;\n}\n\nexport async function addFiles(repoPath: string, options: GitAddOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.all) {\n await git.add('.');\n return 'Staged all changes.';\n }\n\n const paths = options.paths ?? [];\n if (paths.length === 0) {\n throw new Error('Provide paths or set all=true.');\n }\n\n await git.add(paths);\n return `Staged ${paths.length} path(s).`;\n}\n\nexport async function restoreFiles(repoPath: string, options: GitRestoreOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (!options.staged && !options.worktree) {\n throw new Error('At least one of staged/worktree must be true.');\n }\n\n const args = ['restore'];\n\n if (options.staged) {\n args.push('--staged');\n }\n\n if (options.worktree) {\n args.push('--worktree');\n }\n\n if (options.source) {\n args.push('--source', options.source);\n }\n\n args.push('--', ...options.paths);\n\n await git.raw(args);\n return `Restored ${options.paths.length} path(s).`;\n}\n\nexport async function commitChanges(repoPath: string, options: GitCommitOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.noVerify && !ALLOW_NO_VERIFY) {\n throw new Error(\n 'no_verify is disabled on this server. Set GIT_ALLOW_NO_VERIFY=true to permit bypassing git hooks.',\n );\n }\n\n const args: string[] = [];\n if (options.all) {\n args.push('-a');\n }\n if (options.amend) {\n args.push('--amend');\n }\n if (options.noEdit) {\n args.push('--no-edit');\n }\n if (options.noVerify) {\n args.push('--no-verify');\n }\n\n const shouldSign = options.sign ?? AUTO_SIGN_COMMITS;\n if (shouldSign) {\n const key = options.signingKey ?? DEFAULT_SIGNING_KEY;\n args.push(key ? `--gpg-sign=${key}` : '--gpg-sign');\n }\n\n // simple-git expects message, then options array (as second arg), not third\n const result = await git.commit(options.message, args);\n return `Committed ${result.commit}.`;\n}\n\nexport async function resetChanges(repoPath: string, options: GitResetOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.paths && options.paths.length > 0) {\n const args = ['reset'];\n if (options.target) {\n args.push(options.target);\n }\n args.push('--', ...options.paths);\n await git.raw(args);\n return `Unstaged ${options.paths.length} path(s).`;\n }\n\n const args = ['reset', `--${options.mode}`];\n if (options.target) {\n args.push(options.target);\n }\n\n await git.raw(args);\n return `Reset completed with mode=${options.mode}.`;\n}\n\nexport async function revertCommit(repoPath: string, options: GitRevertOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const args = ['revert'];\n if (options.noCommit) {\n args.push('--no-commit');\n }\n\n if (typeof options.mainline === 'number') {\n args.push('-m', String(options.mainline));\n }\n\n args.push(options.ref);\n\n await git.raw(args);\n return `Reverted ${options.ref}.`;\n}\n"],"mappings":"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","names":["McpServer","z","path","path","path","server","z","output","server","z","path","z","render","server","z","z","existsSync","path","existsSync","path","render","buildError","server","z","z","render","server","z","text","z","deleteBranch","render","server","z","z","server","z","z","render","server","z","z","render","server","z","z","args","render","server","z","McpServer","z"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/constants.ts","../src/resources/git.resources.ts","../src/git/client.ts","../src/services/branch.service.ts","../src/services/inspect.service.ts","../src/tools/docs.tools.ts","../src/schemas/index.ts","../src/services/docs.service.ts","../src/tools/flow.tools.ts","../src/services/flow.service.ts","../src/tools/grouped.tools.ts","../src/services/advanced.service.ts","../src/services/context.service.ts","../src/services/remote.service.ts","../src/services/write.service.ts","../src/tools/lfs.tools.ts","../src/services/lfs.service.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport {\n ALLOW_FORCE_PUSH,\n ALLOW_FLOW_HOOKS,\n ALLOW_NO_VERIFY,\n AUTO_SIGN_COMMITS,\n AUTO_SIGN_TAGS,\n DEFAULT_REPO_PATH,\n DEFAULT_SIGNING_KEY,\n} from './config.js';\nimport { SERVER_NAME, SERVER_VERSION } from './constants.js';\nimport { registerGitResources } from './resources/git.resources.js';\nimport { registerDocsTools } from './tools/docs.tools.js';\nimport { registerFlowTools } from './tools/flow.tools.js';\nimport { registerGroupedTools } from './tools/grouped.tools.js';\nimport { registerLfsTools } from './tools/lfs.tools.js';\n\nconst server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n});\n\nregisterGroupedTools(server);\nregisterLfsTools(server);\nregisterFlowTools(server);\nregisterDocsTools(server);\nregisterGitResources(server);\n\nserver.registerTool(\n 'git_ping',\n {\n title: 'Git MCP Ping',\n description: 'Returns a simple response to verify the server is running.',\n inputSchema: {\n message: z.string().default('pong'),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ message }: { message: string }) => {\n return {\n content: [{ type: 'text', text: `git-mcp-server: ${message}` }],\n structuredContent: {\n ok: true,\n message,\n },\n };\n },\n);\n\nasync function main(): Promise<void> {\n if (DEFAULT_REPO_PATH) {\n console.error(`[git-mcp] default repository path: ${DEFAULT_REPO_PATH}`);\n }\n if (ALLOW_NO_VERIFY) console.error('[git-mcp] hook bypass enabled (GIT_ALLOW_NO_VERIFY=true)');\n if (ALLOW_FORCE_PUSH) console.error('[git-mcp] force push enabled (GIT_ALLOW_FORCE_PUSH=true)');\n if (ALLOW_FLOW_HOOKS) console.error('[git-mcp] git_flow hooks/filters enabled (GIT_ALLOW_FLOW_HOOKS=true)');\n if (AUTO_SIGN_COMMITS) console.error('[git-mcp] auto-signing commits (GIT_AUTO_SIGN_COMMITS=true)');\n if (AUTO_SIGN_TAGS) console.error('[git-mcp] auto-signing tags (GIT_AUTO_SIGN_TAGS=true)');\n if (DEFAULT_SIGNING_KEY) console.error(`[git-mcp] signing key: ${DEFAULT_SIGNING_KEY}`);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Server startup failed: ${message}`);\n process.exit(1);\n});\n","import path from 'node:path';\n\n/**\n * Parses --repo or --repo-path from process.argv.\n * Supports both `--repo-path /path` and `--repo-path=/path` forms.\n */\nfunction parseCliRepoPath(): string | undefined {\n const args = process.argv.slice(2);\n for (let i = 0; i < args.length; i++) {\n const arg = args[i] ?? '';\n if ((arg === '--repo' || arg === '--repo-path') && i + 1 < args.length) {\n return args[i + 1];\n }\n const match = /^--repo(?:-path)?=(.+)$/.exec(arg);\n if (match?.[1]) return match[1];\n }\n return undefined;\n}\n\nconst configured: string | undefined = process.env['GIT_REPO_PATH'] ?? parseCliRepoPath();\n\n/**\n * Server-level default repository path, resolved to an absolute path.\n * Set via the GIT_REPO_PATH environment variable or --repo / --repo-path CLI argument.\n */\nexport const DEFAULT_REPO_PATH: string | undefined = configured ? path.resolve(configured) : undefined;\n\n/**\n * Resolves the effective repository path for a tool request.\n * Uses the provided path if given, otherwise falls back to the server default.\n * Throws a clear error if neither is available.\n */\nexport function resolveRepoPath(repoPath: string | undefined): string {\n const resolved = repoPath ?? DEFAULT_REPO_PATH;\n if (!resolved) {\n throw new Error(\n 'No repository path provided. Pass repo_path in the tool request, ' +\n 'or configure a server default via the GIT_REPO_PATH environment variable ' +\n 'or the --repo / --repo-path CLI argument.',\n );\n }\n return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// Hook bypass\n// ---------------------------------------------------------------------------\n\n/**\n * When true, tools accept a `no_verify` parameter that passes --no-verify to\n * git commit and git push, bypassing pre-commit / pre-push hooks.\n * Enable via: GIT_ALLOW_NO_VERIFY=true\n */\nexport const ALLOW_NO_VERIFY: boolean = process.env['GIT_ALLOW_NO_VERIFY'] === 'true';\n\n// ---------------------------------------------------------------------------\n// Force push\n// ---------------------------------------------------------------------------\n\n/**\n * When true, tools accept a `force` parameter that passes --force to git push.\n * Note: this bypasses local safety checks only. Remote branch protection\n * (e.g. GitHub/GitLab protected branches) is enforced server-side regardless.\n * Enable via: GIT_ALLOW_FORCE_PUSH=true\n */\nexport const ALLOW_FORCE_PUSH: boolean = process.env['GIT_ALLOW_FORCE_PUSH'] === 'true';\n\n// ---------------------------------------------------------------------------\n// Flow hook execution\n// ---------------------------------------------------------------------------\n\n/**\n * When true, git_flow may execute git-flow-next-compatible hook and filter\n * programs discovered from git config or repository hook locations.\n * Enable via: GIT_ALLOW_FLOW_HOOKS=true\n */\nexport const ALLOW_FLOW_HOOKS: boolean = process.env['GIT_ALLOW_FLOW_HOOKS'] === 'true';\n\n// ---------------------------------------------------------------------------\n// Commit / tag signing\n// ---------------------------------------------------------------------------\n\n/**\n * Default signing key (GPG key ID, SSH public key path, or empty to use git's\n * configured user.signingkey). Set via: GIT_SIGNING_KEY=<value>\n */\nexport const DEFAULT_SIGNING_KEY: string | undefined = process.env['GIT_SIGNING_KEY'] || undefined;\n\n/**\n * Signing format: openpgp | ssh | x509\n * Set via: GIT_SIGNING_FORMAT=ssh\n */\nexport const DEFAULT_SIGNING_FORMAT: string | undefined = process.env['GIT_SIGNING_FORMAT'] || undefined;\n\n/**\n * Auto-sign all commits produced by this server.\n * Enable via: GIT_AUTO_SIGN_COMMITS=true\n */\nexport const AUTO_SIGN_COMMITS: boolean = process.env['GIT_AUTO_SIGN_COMMITS'] === 'true';\n\n/**\n * Auto-sign all tags produced by this server.\n * Enable via: GIT_AUTO_SIGN_TAGS=true\n */\nexport const AUTO_SIGN_TAGS: boolean = process.env['GIT_AUTO_SIGN_TAGS'] === 'true';\n","export const SERVER_NAME = 'git-mcp-server';\nexport const SERVER_VERSION = '0.1.0';\nexport const CHARACTER_LIMIT = 25_000;\n\nexport const EXCLUDED_DIFF_DIRECTORIES = ['node_modules/', '.yarn/', '.astro/', 'dist/'] as const;\n\nexport const EXCLUDED_DIFF_EXTENSIONS = [\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'svg',\n 'ico',\n 'webp',\n 'bmp',\n 'tiff',\n 'mp4',\n 'mp3',\n 'wav',\n 'ogg',\n 'pdf',\n 'woff',\n 'woff2',\n 'ttf',\n 'eot',\n 'zip',\n 'tar',\n 'gz',\n] as const;\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { listBranches } from '../services/branch.service.js';\nimport { getDiff, getLog, getStatus } from '../services/inspect.service.js';\n\nfunction decodeRepoPath(value: string): string {\n return decodeURIComponent(value);\n}\n\nfunction stringify(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n\nexport function registerGitResources(server: McpServer): void {\n const templateConfig = { list: undefined };\n\n server.registerResource(\n 'git_repo_status',\n new ResourceTemplate('git+repo://status/{repo_path}', templateConfig),\n {\n title: 'Git Repository Status',\n description: 'Read-only repository status snapshot.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const status = await getStatus(repoPath);\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify(status) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_log',\n new ResourceTemplate('git+repo://log/{repo_path}', templateConfig),\n {\n title: 'Git Repository Log',\n description: 'Read-only recent commit log.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const commits = await getLog(repoPath, { limit: 20, offset: 0 });\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify({ commits }) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_branches',\n new ResourceTemplate('git+repo://branches/{repo_path}', templateConfig),\n {\n title: 'Git Repository Branches',\n description: 'Read-only branch list.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const branches = await listBranches(repoPath, true);\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify({ branches }) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_diff',\n new ResourceTemplate('git+repo://diff/{repo_path}', templateConfig),\n {\n title: 'Git Repository Diff',\n description: 'Read-only unstaged + staged diff views.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const [unstaged, staged] = await Promise.all([\n getDiff(repoPath, { mode: 'unstaged', filtered: false }),\n getDiff(repoPath, { mode: 'staged', filtered: false }),\n ]);\n\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'application/json',\n text: stringify({ unstaged, staged }),\n },\n ],\n };\n },\n );\n}\n","import { existsSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type { GitError, GitErrorKind } from '../types.js';\n\nconst GIT_NOT_FOUND_PATTERN = /(not found|is not recognized|ENOENT)/i;\nconst PERMISSION_PATTERN = /(permission denied|EACCES|EPERM)/i;\nconst CONFLICT_PATTERN = /(CONFLICT|merge conflict|rebase in progress|cherry-pick in progress)/i;\nconst NETWORK_PATTERN = /(network|timed out|unable to access|could not resolve host|proxy)/i;\n\nfunction classifyError(message: string): GitErrorKind {\n if (GIT_NOT_FOUND_PATTERN.test(message)) {\n return 'missing_git';\n }\n\n if (PERMISSION_PATTERN.test(message)) {\n return 'permission';\n }\n\n if (CONFLICT_PATTERN.test(message)) {\n return 'git_conflict';\n }\n\n if (NETWORK_PATTERN.test(message)) {\n return 'network';\n }\n\n return 'unknown';\n}\n\nexport function toGitError(error: unknown): GitError {\n if (error instanceof Error) {\n return {\n kind: classifyError(error.message),\n message: error.message,\n };\n }\n\n return {\n kind: 'unknown',\n message: String(error),\n };\n}\n\nexport function validateRepoPath(repoPath: string): string {\n const resolved = path.resolve(repoPath);\n\n if (!existsSync(resolved)) {\n throw new Error(`Repository path does not exist: ${repoPath}`);\n }\n\n if (!statSync(resolved).isDirectory()) {\n throw new Error(`Repository path is not a directory: ${repoPath}`);\n }\n\n return resolved;\n}\n\nexport function getGit(repoPath: string): SimpleGit {\n const safePath = validateRepoPath(repoPath);\n return simpleGit({ baseDir: safePath, binary: 'git', maxConcurrentProcesses: 6 });\n}\n","import { getGit } from '../git/client.js';\nimport type { BranchInfo } from '../types.js';\n\nexport interface CreateBranchOptions {\n readonly name: string;\n readonly fromRef?: string;\n readonly checkout: boolean;\n}\n\nexport interface DeleteBranchOptions {\n readonly name: string;\n readonly force: boolean;\n}\n\nexport async function listBranches(repoPath: string, all: boolean): Promise<BranchInfo[]> {\n const git = getGit(repoPath);\n const summary = await git.branch(all ? ['-a'] : []);\n\n return summary.all.map(name => {\n const details = Object.hasOwn(summary.branches, name) ? summary.branches[name] : undefined;\n return {\n name,\n isCurrent: summary.current === name,\n commit: details?.commit,\n upstream: details?.label,\n };\n });\n}\n\nexport async function createBranch(repoPath: string, options: CreateBranchOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.fromRef) {\n if (options.checkout) {\n await git.checkoutBranch(options.name, options.fromRef);\n } else {\n await git.raw(['branch', options.name, options.fromRef]);\n }\n return options.checkout\n ? `Created and checked out ${options.name} from ${options.fromRef}.`\n : `Created branch ${options.name} from ${options.fromRef}.`;\n }\n\n await git.branch([options.name]);\n if (options.checkout) {\n await git.checkout(options.name);\n }\n\n return options.checkout ? `Created and checked out ${options.name}.` : `Created branch ${options.name}.`;\n}\n\nexport async function deleteBranch(repoPath: string, options: DeleteBranchOptions): Promise<string> {\n const git = getGit(repoPath);\n await git.deleteLocalBranch(options.name, options.force);\n return `Deleted branch ${options.name}.`;\n}\n\nexport async function renameBranch(repoPath: string, oldName: string, newName: string): Promise<string> {\n const git = getGit(repoPath);\n await git.branch(['-m', oldName, newName]);\n return `Renamed branch ${oldName} to ${newName}.`;\n}\n\nexport async function checkoutRef(repoPath: string, ref: string, create: boolean): Promise<string> {\n const git = getGit(repoPath);\n\n if (create) {\n await git.checkoutLocalBranch(ref);\n return `Created and checked out ${ref}.`;\n }\n\n await git.checkout(ref);\n return `Checked out ${ref}.`;\n}\n\nexport async function setUpstream(repoPath: string, branch: string, upstream: string): Promise<string> {\n const git = getGit(repoPath);\n await git.raw(['branch', '--set-upstream-to', upstream, branch]);\n return `Set upstream of ${branch} to ${upstream}.`;\n}\n","import path from 'node:path';\nimport { CHARACTER_LIMIT, EXCLUDED_DIFF_DIRECTORIES, EXCLUDED_DIFF_EXTENSIONS } from '../constants.js';\nimport { getGit } from '../git/client.js';\nimport type { CommitInfo, DiffSummary, FileStatus } from '../types.js';\n\nexport interface GitStatusResult {\n readonly branch: string;\n readonly current: string;\n readonly tracking: string;\n readonly ahead: number;\n readonly behind: number;\n readonly files: FileStatus[];\n readonly isClean: boolean;\n}\n\nexport interface GitLogOptions {\n readonly limit: number;\n readonly offset: number;\n readonly author?: string;\n readonly grep?: string;\n readonly since?: string;\n readonly until?: string;\n readonly filePath?: string;\n}\n\nexport interface GitDiffOptions {\n readonly mode: 'unstaged' | 'staged' | 'refs';\n readonly fromRef?: string;\n readonly toRef?: string;\n readonly filtered: boolean;\n}\n\nfunction truncate(text: string): string {\n if (text.length <= CHARACTER_LIMIT) {\n return text;\n }\n\n return `${text.slice(0, CHARACTER_LIMIT)}\\n\\n[truncated to ${CHARACTER_LIMIT} characters]`;\n}\n\nfunction parseLogLine(line: string): CommitInfo | null {\n const [hash, authorName, authorEmail, dateIso, ...subjectParts] = line.split('\\t');\n if (!hash || !authorName || !authorEmail || !dateIso) {\n return null;\n }\n\n return {\n hash,\n authorName,\n authorEmail,\n dateIso,\n subject: subjectParts.join('\\t'),\n };\n}\n\nfunction shouldExcludeFile(filePath: string): boolean {\n if (EXCLUDED_DIFF_DIRECTORIES.some(prefix => filePath.startsWith(prefix))) {\n return true;\n }\n\n const extension = path.extname(filePath).replace(/^\\./, '').toLowerCase();\n if (!extension) {\n return false;\n }\n\n return EXCLUDED_DIFF_EXTENSIONS.includes(extension as (typeof EXCLUDED_DIFF_EXTENSIONS)[number]);\n}\n\nfunction buildDiffBaseArgs(options: GitDiffOptions): string[] {\n if (options.mode === 'staged') {\n return ['diff', '--staged'];\n }\n\n if (options.mode === 'refs') {\n if (!options.fromRef || !options.toRef) {\n throw new Error(\"from_ref and to_ref are required when mode='refs'\");\n }\n\n return ['diff', `${options.fromRef}..${options.toRef}`];\n }\n\n return ['diff'];\n}\n\nexport async function getStatus(repoPath: string): Promise<GitStatusResult> {\n const git = getGit(repoPath);\n const status = await git.status();\n\n const files: FileStatus[] = status.files.map(file => ({\n path: file.path,\n index: file.index,\n workingTree: file.working_dir,\n }));\n\n return {\n branch: status.current ?? '',\n current: status.current ?? '',\n tracking: status.tracking ?? '',\n ahead: status.ahead,\n behind: status.behind,\n files,\n isClean: status.isClean(),\n };\n}\n\nexport async function getLog(repoPath: string, options: GitLogOptions): Promise<CommitInfo[]> {\n const git = getGit(repoPath);\n\n const args = [\n 'log',\n '--date=iso-strict',\n `--skip=${options.offset}`,\n '-n',\n String(options.limit),\n '--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s',\n ];\n\n if (options.author) {\n args.push(`--author=${options.author}`);\n }\n\n if (options.grep) {\n args.push(`--grep=${options.grep}`);\n }\n\n if (options.since) {\n args.push(`--since=${options.since}`);\n }\n\n if (options.until) {\n args.push(`--until=${options.until}`);\n }\n\n if (options.filePath) {\n args.push('--', options.filePath);\n }\n\n const output = await git.raw(args);\n\n return output\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .map(parseLogLine)\n .filter((item): item is CommitInfo => item !== null);\n}\n\nexport async function showRef(repoPath: string, ref: string): Promise<string> {\n const git = getGit(repoPath);\n const output = await git.raw(['show', '--stat', '--patch', ref]);\n return truncate(output);\n}\n\nexport async function getDiffSummary(repoPath: string, options: GitDiffOptions): Promise<DiffSummary> {\n const git = getGit(repoPath);\n const baseArgs = buildDiffBaseArgs(options).slice(1);\n const summary = await git.diffSummary(baseArgs);\n\n return {\n filesChanged: summary.files.length,\n insertions: summary.insertions,\n deletions: summary.deletions,\n };\n}\n\nexport async function getDiff(repoPath: string, options: GitDiffOptions): Promise<string> {\n const git = getGit(repoPath);\n const baseArgs = buildDiffBaseArgs(options);\n\n if (!options.filtered) {\n const output = await git.raw(baseArgs);\n return truncate(output);\n }\n\n const namesOutput = await git.raw([...baseArgs, '--name-only']);\n const files = namesOutput\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .filter(line => !shouldExcludeFile(line));\n\n if (files.length === 0) {\n return 'No changed files after filtering.';\n }\n\n const chunks: string[] = [];\n for (const filePath of files) {\n const diff = await git.raw([...baseArgs, '--', filePath]);\n chunks.push(`=== ${filePath} ===\\n${diff.trim()}`);\n }\n\n return truncate(chunks.join('\\n\\n'));\n}\n\nexport async function blameFile(repoPath: string, filePath: string, ref?: string): Promise<string> {\n const git = getGit(repoPath);\n\n const args = ['blame'];\n if (ref) {\n args.push(ref);\n }\n args.push('--', filePath);\n\n const output = await git.raw(args);\n return truncate(output);\n}\n\nexport async function getReflog(repoPath: string, limit: number): Promise<string> {\n const git = getGit(repoPath);\n const output = await git.raw(['reflog', '--date=iso', '-n', String(limit)]);\n return truncate(output);\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { toGitError } from '../git/client.js';\nimport { ResponseFormatSchema } from '../schemas/index.js';\nimport { fetchGitManPage, searchGitDocs } from '../services/docs.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerDocsTools(server: McpServer): void {\n server.registerTool(\n 'git_docs',\n {\n title: 'Git Documentation',\n description:\n 'Search and browse official Git documentation from git-scm.com. ' +\n 'Use action=\"search\" to find relevant commands and concepts by keyword. ' +\n 'Use action=\"man\" to fetch the full man page for a specific git command ' +\n '(e.g. query=\"commit\" fetches the git-commit man page). ' +\n 'Useful for answering questions about how to use git commands, understanding options, ' +\n 'and discovering the right git command for a task.',\n inputSchema: {\n action: z.enum(['search', 'man']),\n query: z\n .string()\n .min(1)\n .describe(\n 'For action=\"search\": search terms (e.g. \"undo last commit\"). ' +\n 'For action=\"man\": git command name without \"git-\" prefix (e.g. \"commit\", \"rebase\", \"merge\").',\n ),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n action,\n query,\n response_format,\n }: {\n action: 'search' | 'man';\n query: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n if (action === 'search') {\n const results = await searchGitDocs(query);\n const structuredContent: Record<string, unknown> = {\n query: results.query,\n results: results.results,\n };\n\n if (response_format === 'json') {\n return {\n content: [{ type: 'text', text: JSON.stringify(structuredContent, null, 2) }],\n structuredContent,\n };\n }\n\n if (results.results.length === 0) {\n const text = `No results found for \"${query}\" on git-scm.com.`;\n return { content: [{ type: 'text', text }], structuredContent };\n }\n\n const lines = [`## Git Docs Search: \"${results.query}\"`, ''];\n for (const r of results.results) {\n lines.push(`### [${r.title}](${r.url})`);\n if (r.excerpt) lines.push(r.excerpt);\n lines.push('');\n }\n\n const text = lines.join('\\n');\n return { content: [{ type: 'text', text }], structuredContent };\n }\n\n // action === 'man'\n const text = await fetchGitManPage(query);\n return {\n content: [{ type: 'text', text: render(text, response_format) }],\n structuredContent: { command: query, content: text } as Record<string, unknown>,\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { z } from 'zod';\n\nexport const RepoPathSchema = z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Absolute path to the local Git repository. ' +\n 'If omitted, falls back to the server default set via the GIT_REPO_PATH environment variable or --repo-path CLI argument.',\n );\n\nexport const RefSchema = z\n .string()\n .min(1, 'ref is required')\n .describe('Git reference: branch, tag, commit SHA, or HEAD expression.');\n\nexport const PaginationSchema = z\n .object({\n limit: z.number().int().min(1).max(200).default(50),\n offset: z.number().int().min(0).default(0),\n })\n .strict();\n\nexport const ConfirmSchema = z.boolean().default(false);\n\nexport const ResponseFormatSchema = z\n .enum(['markdown', 'json'])\n .default('markdown')\n .describe('Output format for the response.');\n\nexport const FlowPresetSchema = z\n .enum(['classic', 'github', 'gitlab'])\n .default('classic')\n .describe('git-flow-next preset to initialize.');\n\nexport const FlowConfigScopeSchema = z\n .enum(['local', 'global', 'system', 'file'])\n .default('local')\n .describe('Git config scope used for init writes.');\n\nexport const FlowBranchKindSchema = z\n .enum(['base', 'topic'])\n .describe('Whether a flow config operation targets a base branch or topic branch type.');\n\nexport const FlowMergeStrategySchema = z\n .enum(['merge', 'rebase', 'squash', 'none'])\n .describe('Merge strategy for flow branch integration.');\n\nexport const FlowConfigActionSchema = z\n .enum(['list', 'add', 'update', 'rename', 'delete'])\n .describe('Flow configuration operation.');\n\nexport const FlowTopicActionSchema = z\n .enum(['start', 'finish', 'publish', 'list', 'update', 'delete', 'rename', 'checkout', 'track'])\n .describe('Topic branch lifecycle operation.');\n\nexport const FlowControlActionSchema = z\n .enum(['continue', 'abort'])\n .describe('Continue or abort an in-progress flow finish operation.');\n\nexport const FlowMatchModeSchema = z\n .enum(['exact', 'prefix'])\n .default('exact')\n .describe('How topic names should be resolved for checkout and shorthand operations.');\n","import { CHARACTER_LIMIT } from '../constants.js';\n\nexport interface GitDocsSearchResult {\n title: string;\n url: string;\n excerpt: string;\n}\n\nexport interface GitDocsSearchResponse {\n query: string;\n results: GitDocsSearchResult[];\n}\n\n/** Strip HTML tags, decode common entities, and collapse whitespace. */\nfunction stripHtml(html: string): string {\n // Remove <script> and <style> blocks including their content\n let text = html.replace(/<(script|style)[^>]*>[\\s\\S]*?<\\/\\1>/gi, ' ');\n // Strip all remaining HTML tags\n text = text.replace(/<[^>]+>/g, ' ');\n // Decode common HTML entities\n text = text\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, ' ')\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCodePoint(Number(code)));\n // Collapse whitespace\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/** Extract the content between two markers in an HTML string. */\nfunction extractBetween(html: string, startMarker: RegExp, endMarker: RegExp): string {\n const startMatch = startMarker.exec(html);\n if (!startMatch) return html;\n const startIdx = startMatch.index + startMatch[0].length;\n const remainder = html.slice(startIdx);\n const endMatch = endMarker.exec(remainder);\n return endMatch ? remainder.slice(0, endMatch.index) : remainder;\n}\n\n/**\n * Search git-scm.com for documentation matching a query.\n * Uses the same search endpoint as the site's search box.\n */\nexport async function searchGitDocs(query: string): Promise<GitDocsSearchResponse> {\n const url = `https://git-scm.com/search/results?search=${encodeURIComponent(query)}&language=en`;\n\n let html: string;\n try {\n const response = await fetch(url, {\n headers: { Accept: 'text/html', 'User-Agent': 'git-mcp-docs/1.0' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new Error(`git-scm.com returned HTTP ${response.status}`);\n }\n html = await response.text();\n } catch (err) {\n throw new Error(`Failed to fetch git docs search: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Parse result entries: each is a <tr> or <li> with a link and excerpt\n // The site returns <li> elements inside <ul class=\"result-list\">\n const results: GitDocsSearchResult[] = [];\n\n // Extract result items via regex — site uses <li> blocks with <a> and <p>\n const listMatch = /<ul[^>]*class=\"[^\"]*result-list[^\"]*\"[^>]*>([\\s\\S]*?)<\\/ul>/i.exec(html);\n const listHtml = listMatch ? listMatch[1] : html;\n\n const itemRegex = /<li[^>]*>([\\s\\S]*?)<\\/li>/gi;\n let itemMatch: RegExpExecArray | null;\n\n while ((itemMatch = itemRegex.exec(listHtml)) !== null) {\n const item = itemMatch[1]!;\n const linkMatch = /<a[^>]+href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/i.exec(item);\n if (!linkMatch) continue;\n\n const href = linkMatch[1]!.trim();\n const title = stripHtml(linkMatch[2]!).trim();\n if (!title) continue;\n\n const excerptMatch = /<(?:p|span)[^>]*class=\"[^\"]*excerpt[^\"]*\"[^>]*>([\\s\\S]*?)<\\/(?:p|span)>/i.exec(item);\n const excerpt = excerptMatch ? stripHtml(excerptMatch[1]!).trim() : '';\n\n const fullUrl = href.startsWith('http') ? href : `https://git-scm.com${href}`;\n results.push({ title, url: fullUrl, excerpt });\n }\n\n // Fallback: if no structured results, look for plain <a href=\"/docs/...\"> links\n if (results.length === 0) {\n const linkRegex = /<a[^>]+href=\"(\\/docs\\/[^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/gi;\n let m: RegExpExecArray | null;\n const seen = new Set<string>();\n while ((m = linkRegex.exec(html)) !== null && results.length < 20) {\n const href = m[1]!;\n const title = stripHtml(m[2]!).trim();\n if (!title || seen.has(href)) continue;\n seen.add(href);\n results.push({ title, url: `https://git-scm.com${href}`, excerpt: '' });\n }\n }\n\n return { query, results };\n}\n\n/**\n * Fetch the git man page for a command from git-scm.com.\n * Provide the command without the \"git-\" prefix (e.g. \"commit\", \"merge\").\n */\nexport async function fetchGitManPage(command: string): Promise<string> {\n // Normalize: strip leading \"git \" or \"git-\"\n const normalized = command\n .trim()\n .toLowerCase()\n .replace(/^git[- ]/, '');\n\n const url = `https://git-scm.com/docs/git-${normalized}`;\n\n let html: string;\n try {\n const response = await fetch(url, {\n headers: { Accept: 'text/html', 'User-Agent': 'git-mcp-docs/1.0' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\n `No man page found for \"git ${normalized}\". ` + `Check the command name or search with action=\"search\".`,\n );\n }\n throw new Error(`git-scm.com returned HTTP ${response.status} for git-${normalized}`);\n }\n html = await response.text();\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('No man page')) throw err;\n throw new Error(`Failed to fetch git man page: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Extract the main article content\n const articleContent = extractBetween(\n html,\n /<(?:article|div)[^>]*(?:id=\"main\"|class=\"[^\"]*(?:sect|man-page|article)[^\"]*\")[^>]*>/i,\n /<\\/(?:article|div)>/i,\n );\n\n const content = stripHtml(articleContent || html);\n\n const header = `# git-${normalized}(1)\\n\\nSource: ${url}\\n\\n`;\n const full = header + content;\n\n return full.length > CHARACTER_LIMIT\n ? full.slice(0, CHARACTER_LIMIT) + '\\n\\n[...truncated — content exceeded limit]'\n : full;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport {\n FlowBranchKindSchema,\n FlowConfigActionSchema,\n FlowConfigScopeSchema,\n FlowControlActionSchema,\n FlowMatchModeSchema,\n FlowMergeStrategySchema,\n FlowPresetSchema,\n FlowTopicActionSchema,\n RepoPathSchema,\n ResponseFormatSchema,\n} from '../schemas/index.js';\nimport { runFlowAction, type FlowLegacyAction, type FlowOperation } from '../services/flow.service.js';\n\nfunction render(markdown: string, data: unknown, format: 'markdown' | 'json'): string {\n if (format === 'markdown') {\n return markdown;\n }\n\n return JSON.stringify(data, null, 2);\n}\n\nconst FLOW_ACTION_VALUES = [\n 'init',\n 'overview',\n 'config-list',\n 'config-add',\n 'config-update',\n 'config-rename',\n 'config-delete',\n 'topic-finish',\n 'topic-list',\n 'topic-start',\n 'topic-publish',\n 'topic-update',\n 'topic-delete',\n 'topic-rename',\n 'topic-checkout',\n 'topic-track',\n 'control-continue',\n 'control-abort',\n 'feature-start',\n 'feature-finish',\n 'feature-publish',\n 'feature-list',\n 'feature-update',\n 'feature-delete',\n 'feature-rename',\n 'feature-checkout',\n 'feature-track',\n 'release-start',\n 'release-finish',\n 'release-publish',\n 'release-list',\n 'release-update',\n 'release-delete',\n 'release-rename',\n 'release-checkout',\n 'release-track',\n 'hotfix-start',\n 'hotfix-finish',\n 'hotfix-publish',\n 'hotfix-list',\n 'hotfix-update',\n 'hotfix-delete',\n 'hotfix-rename',\n 'hotfix-checkout',\n 'hotfix-track',\n 'support-start',\n 'support-list',\n 'support-finish',\n 'support-publish',\n 'support-update',\n 'support-delete',\n 'support-rename',\n 'support-checkout',\n 'support-track',\n] as const;\n\nconst FLOW_OPERATION_VALUES = ['init', 'overview', 'config', 'topic', 'control'] as const;\n\nexport function registerFlowTools(server: McpServer): void {\n server.registerTool(\n 'git_flow',\n {\n title: 'Git Flow Actions',\n description:\n 'Implements git-flow-next-style workflows directly, without requiring the ' +\n 'external CLI. The canonical contract uses operation=config/topic/control ' +\n 'with subactions, while legacy alias actions remain supported for ' +\n 'compatibility. Supports preset init, overview, config CRUD, generalized ' +\n 'topic lifecycle operations, and finish recovery.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(FLOW_ACTION_VALUES).optional().describe('Legacy-compatible action alias.'),\n operation: z.enum(FLOW_OPERATION_VALUES).optional().describe('Canonical git_flow operation.'),\n config_action: FlowConfigActionSchema.optional(),\n topic_action: FlowTopicActionSchema.optional(),\n control_action: FlowControlActionSchema.optional(),\n topic: z\n .string()\n .optional()\n .describe(\n 'Topic branch type for generalized actions such as topic-start, ' + 'topic-list, or topic-publish.',\n ),\n name: z\n .string()\n .optional()\n .describe('Branch short name, branch type name, or release/hotfix version depending on the action.'),\n new_name: z.string().optional().describe('New short name or branch type name for rename operations.'),\n pattern: z\n .string()\n .optional()\n .describe('Optional glob pattern used by list actions to filter topic branch names.'),\n match_mode: FlowMatchModeSchema.optional(),\n branch_kind: FlowBranchKindSchema.optional(),\n parent: z.string().optional().describe('Parent/base branch for flow config mutations.'),\n prefix: z.string().optional().describe('Branch prefix for topic type definitions, such as \"feature/\".'),\n start_point: z.string().optional().describe('Configured start point for a topic type.'),\n base_ref: z.string().optional().describe('Explicit starting ref for topic-start.'),\n preset: FlowPresetSchema.optional(),\n scope: FlowConfigScopeSchema.optional(),\n config_file: z.string().optional().describe('Path to a git config file when scope is \"file\".'),\n force: z.boolean().default(false).describe('Force re-initialization even if git-flow is already configured.'),\n no_create_branches: z\n .boolean()\n .default(false)\n .describe('Skip base branch creation during init and only write configuration.'),\n main_branch: z\n .string()\n .optional()\n .describe('Override the main branch name (default: gitflow.branch.master config or \"main\").'),\n develop_branch: z\n .string()\n .optional()\n .describe('Override the develop branch name (default: gitflow.branch.develop ' + 'config or \"develop\").'),\n staging_branch: z.string().optional().describe('Override the staging branch name used by the gitlab preset.'),\n production_branch: z\n .string()\n .optional()\n .describe('Override the production branch name used by the gitlab preset.'),\n remote: z.string().optional().describe('Remote name for publish operations (default: \"origin\").'),\n upstream_strategy: FlowMergeStrategySchema.optional(),\n downstream_strategy: FlowMergeStrategySchema.optional(),\n strategy: FlowMergeStrategySchema.optional().describe('Integration strategy for finish/update operations.'),\n fetch: z.boolean().optional().describe('Fetch the remote before finish when a remote is configured.'),\n ff: z.boolean().optional().describe('Use fast-forward behavior when the selected strategy allows it.'),\n keep_branch: z.boolean().optional().describe('Keep the topic branch after finish.'),\n no_backmerge: z.boolean().default(false).describe('Skip configured backmerge branches during finish.'),\n rebase_before_finish: z\n .boolean()\n .optional()\n .describe('Rebase the topic branch onto its parent before finishing.'),\n preserve_merges: z.boolean().optional().describe('Preserve merges during rebase-based finish flows.'),\n publish: z.boolean().optional().describe('Publish parent/backmerge branches after finish.'),\n force_delete: z.boolean().optional().describe('Force deletion for topic-delete and config flags.'),\n auto_update: z.boolean().optional().describe('Enable auto-update on base branch definitions.'),\n tag: z\n .boolean()\n .default(true)\n .describe('Create an annotated tag when finishing a release or hotfix (default: true).'),\n tag_message: z.string().optional().describe('Message for the version tag.'),\n tag_prefix: z.string().optional().describe('Tag prefix for flow config mutations.'),\n delete_branch: z\n .boolean()\n .default(true)\n .describe('Delete the branch after a finish operation (default: true).'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n operation,\n config_action,\n topic_action,\n control_action,\n topic,\n name,\n new_name,\n pattern,\n match_mode,\n branch_kind,\n parent,\n prefix,\n start_point,\n base_ref,\n preset,\n scope,\n config_file,\n force,\n no_create_branches,\n main_branch,\n develop_branch,\n staging_branch,\n production_branch,\n remote,\n upstream_strategy,\n downstream_strategy,\n strategy,\n fetch,\n ff,\n keep_branch,\n no_backmerge,\n rebase_before_finish,\n preserve_merges,\n publish,\n force_delete,\n auto_update,\n tag,\n tag_message,\n tag_prefix,\n delete_branch,\n response_format,\n }: {\n repo_path: string | undefined;\n action?: (typeof FLOW_ACTION_VALUES)[number];\n operation?: FlowOperation;\n config_action?: 'list' | 'add' | 'update' | 'rename' | 'delete';\n topic_action?: 'start' | 'finish' | 'publish' | 'list' | 'update' | 'delete' | 'rename' | 'checkout' | 'track';\n control_action?: 'continue' | 'abort';\n topic?: string;\n name?: string;\n new_name?: string;\n pattern?: string;\n match_mode?: 'exact' | 'prefix';\n branch_kind?: 'base' | 'topic';\n parent?: string;\n prefix?: string;\n start_point?: string;\n base_ref?: string;\n preset?: 'classic' | 'github' | 'gitlab';\n scope?: 'local' | 'global' | 'system' | 'file';\n config_file?: string;\n force: boolean;\n no_create_branches: boolean;\n main_branch?: string;\n develop_branch?: string;\n staging_branch?: string;\n production_branch?: string;\n remote?: string;\n upstream_strategy?: 'merge' | 'rebase' | 'squash' | 'none';\n downstream_strategy?: 'merge' | 'rebase' | 'squash' | 'none';\n strategy?: 'merge' | 'rebase' | 'squash' | 'none';\n fetch?: boolean;\n ff?: boolean;\n keep_branch?: boolean;\n no_backmerge: boolean;\n rebase_before_finish?: boolean;\n preserve_merges?: boolean;\n publish?: boolean;\n force_delete?: boolean;\n auto_update?: boolean;\n tag: boolean;\n tag_message?: string;\n tag_prefix?: string;\n delete_branch: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const result = await runFlowAction(repoPath, {\n action: action as FlowLegacyAction | undefined,\n operation,\n configAction: config_action,\n topicAction: topic_action,\n controlAction: control_action,\n topic,\n name,\n newName: new_name,\n pattern,\n matchMode: match_mode,\n branchKind: branch_kind,\n parent,\n prefix,\n startPoint: start_point,\n baseRef: base_ref,\n preset,\n scope,\n configFile: config_file,\n force,\n noCreateBranches: no_create_branches,\n mainBranch: main_branch,\n developBranch: develop_branch,\n stagingBranch: staging_branch,\n productionBranch: production_branch,\n remote,\n upstreamStrategy: upstream_strategy,\n downstreamStrategy: downstream_strategy,\n strategy,\n fetch,\n ff,\n keepBranch: keep_branch,\n noBackmerge: no_backmerge,\n rebaseBeforeFinish: rebase_before_finish,\n preserveMerges: preserve_merges,\n publish,\n forceDelete: force_delete,\n autoUpdate: auto_update,\n tag,\n tagMessage: tag_message,\n tagPrefix: tag_prefix,\n deleteBranch: delete_branch,\n });\n\n const structuredContent: Record<string, unknown> =\n result.data && typeof result.data === 'object' && !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { output: result.data ?? result.markdown };\n\n return {\n content: [\n {\n type: 'text',\n text: render(result.markdown, structuredContent, response_format),\n },\n ],\n structuredContent,\n };\n } catch (error) {\n const gitError = toGitError(error);\n return {\n content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }],\n };\n }\n },\n );\n}\n","import { existsSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { execFile, spawn } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { ALLOW_FLOW_HOOKS } from '../config.js';\nimport { getGit, toGitError } from '../git/client.js';\nimport { CHARACTER_LIMIT } from '../constants.js';\nimport type {\n FlowActiveBranch,\n FlowBranchDefinition,\n FlowBranchKind,\n FlowConfigAction,\n FlowConfigMutationResult,\n FlowControlAction,\n FlowFilterExecutionResult,\n FlowFilterKind,\n FlowFinishResult,\n FlowFinishStage,\n FlowFinishState,\n FlowHealthStatus,\n FlowHookExecutionResult,\n FlowHookPhase,\n FlowMatchMode,\n FlowMergeStrategy,\n FlowOverview,\n FlowTopicAction,\n FlowTopicSelection,\n} from '../types.js';\n\nconst execFileAsync = promisify(execFile);\n\ntype GitClient = ReturnType<typeof getGit>;\n\nexport type FlowLegacyAction =\n | 'init'\n | 'overview'\n | 'config-list'\n | 'config-add'\n | 'config-update'\n | 'config-rename'\n | 'config-delete'\n | 'topic-start'\n | 'topic-finish'\n | 'topic-publish'\n | 'topic-list'\n | 'topic-update'\n | 'topic-delete'\n | 'topic-rename'\n | 'topic-checkout'\n | 'topic-track'\n | 'control-continue'\n | 'control-abort'\n | 'feature-start'\n | 'feature-finish'\n | 'feature-publish'\n | 'feature-list'\n | 'feature-update'\n | 'feature-delete'\n | 'feature-rename'\n | 'feature-checkout'\n | 'feature-track'\n | 'release-start'\n | 'release-finish'\n | 'release-publish'\n | 'release-list'\n | 'release-update'\n | 'release-delete'\n | 'release-rename'\n | 'release-checkout'\n | 'release-track'\n | 'hotfix-start'\n | 'hotfix-finish'\n | 'hotfix-publish'\n | 'hotfix-list'\n | 'hotfix-update'\n | 'hotfix-delete'\n | 'hotfix-rename'\n | 'hotfix-checkout'\n | 'hotfix-track'\n | 'support-start'\n | 'support-finish'\n | 'support-publish'\n | 'support-list'\n | 'support-update'\n | 'support-delete'\n | 'support-rename'\n | 'support-checkout'\n | 'support-track';\n\nexport type FlowOperation = 'init' | 'overview' | 'config' | 'topic' | 'control';\n\nexport interface FlowOptions {\n readonly action?: FlowLegacyAction;\n readonly operation?: FlowOperation;\n readonly configAction?: FlowConfigAction;\n readonly topicAction?: FlowTopicAction;\n readonly controlAction?: FlowControlAction;\n readonly topic?: string;\n readonly name?: string;\n readonly newName?: string;\n readonly pattern?: string;\n readonly matchMode?: FlowMatchMode;\n readonly branchKind?: FlowBranchKind;\n readonly parent?: string;\n readonly prefix?: string;\n readonly startPoint?: string;\n readonly mainBranch?: string;\n readonly developBranch?: string;\n readonly stagingBranch?: string;\n readonly productionBranch?: string;\n readonly remote?: string;\n readonly tag?: boolean;\n readonly tagMessage?: string;\n readonly tagPrefix?: string;\n readonly deleteBranch?: boolean;\n readonly keepBranch?: boolean;\n readonly publishAfterFinish?: boolean;\n readonly preset?: 'classic' | 'github' | 'gitlab';\n readonly scope?: 'local' | 'global' | 'system' | 'file';\n readonly configFile?: string;\n readonly force?: boolean;\n readonly forceDelete?: boolean;\n readonly noCreateBranches?: boolean;\n readonly autoUpdate?: boolean;\n readonly upstreamStrategy?: FlowMergeStrategy;\n readonly downstreamStrategy?: FlowMergeStrategy;\n readonly strategy?: FlowMergeStrategy;\n readonly fetch?: boolean;\n readonly ff?: boolean;\n readonly noBackmerge?: boolean;\n readonly rebaseBeforeFinish?: boolean;\n readonly preserveMerges?: boolean;\n readonly publish?: boolean;\n readonly signTag?: boolean;\n readonly baseRef?: string;\n}\n\nexport interface FlowActionResult {\n readonly markdown: string;\n readonly data?: unknown;\n}\n\ninterface FlowCommandConfig {\n readonly finishStrategy: FlowMergeStrategy;\n readonly fetchBeforeFinish: boolean;\n readonly keepBranch: boolean;\n readonly publishAfterFinish: boolean;\n readonly rebaseBeforeFinish: boolean;\n readonly preserveMerges: boolean;\n readonly ff: boolean;\n}\n\ninterface FlowFilterConfig {\n readonly version?: string;\n readonly tagMessage?: string;\n}\n\ninterface FlowTopicDefinition extends FlowBranchDefinition {\n readonly command: FlowCommandConfig;\n readonly filters: FlowFilterConfig;\n}\n\ninterface FlowConfigState {\n readonly initialized: boolean;\n readonly version?: string;\n readonly compatibility: 'structured' | 'legacy' | 'unconfigured';\n readonly bases: readonly FlowBranchDefinition[];\n readonly topics: readonly FlowTopicDefinition[];\n readonly versionTagPrefix: string;\n readonly config: ReadonlyMap<string, string>;\n}\n\ninterface FlowPresetDefinition {\n readonly versionTagPrefix: string;\n readonly bases: readonly FlowBranchDefinition[];\n readonly topics: readonly FlowTopicDefinition[];\n}\n\ninterface NormalizedFlowRequest {\n readonly operation: FlowOperation;\n readonly configAction?: FlowConfigAction;\n readonly topicAction?: FlowTopicAction;\n readonly controlAction?: FlowControlAction;\n readonly topic?: string;\n}\n\nconst DEFAULT_REMOTE = 'origin';\nconst FINISH_STATE_PREFIX = 'gitflow.state.finish';\nconst FILTER_MAX_RUNTIME_MS = 10_000;\nconst FILTER_MAX_OUTPUT_CHARS = 64_000;\nconst SAFE_CHILD_ENV_KEYS = [\n 'PATH',\n 'HOME',\n 'USER',\n 'LOGNAME',\n 'SHELL',\n 'TMPDIR',\n 'TMP',\n 'TEMP',\n 'LANG',\n 'LC_ALL',\n 'LC_CTYPE',\n 'SystemRoot',\n 'ComSpec',\n 'PATHEXT',\n 'WINDIR',\n] as const;\nconst FLOW_CONFIG_PROPERTIES = [\n 'type',\n 'parent',\n 'prefix',\n 'startpoint',\n 'upstreamstrategy',\n 'downstreamstrategy',\n 'tag',\n 'tagprefix',\n 'autoupdate',\n 'forcedelete',\n] as const;\nconst FLOW_FINISH_PROPERTIES = [\n 'strategy',\n 'fetch',\n 'keep',\n 'publish',\n 'rebaseBeforeFinish',\n 'preserveMerges',\n 'ff',\n] as const;\nconst FLOW_FILTER_PROPERTIES = ['version', 'tagMessage'] as const;\nconst CONTROL_STAGES: readonly FlowFinishStage[] = [\n 'prepare',\n 'hook-pre-finish',\n 'filter-version',\n 'checkout-parent',\n 'integrate-parent',\n 'tag',\n 'hook-post-parent',\n 'checkout-backmerge',\n 'integrate-backmerge',\n 'hook-post-finish',\n 'publish',\n 'cleanup',\n];\n\nfunction buildSafeChildEnv(extraEnv: Readonly<Record<string, string>>): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const key of SAFE_CHILD_ENV_KEYS) {\n const value = process.env[key];\n if (value !== undefined) {\n env[key] = value;\n }\n }\n return {\n ...env,\n ...extraEnv,\n };\n}\n\nfunction isFileSafe(candidate: string): boolean {\n try {\n return existsSync(candidate) && statSync(candidate).isFile();\n } catch {\n return false;\n }\n}\n\nfunction asBoolean(value: string | undefined): boolean | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n return undefined;\n}\n\nfunction asStrategy(value: string | undefined, fallback: FlowMergeStrategy): FlowMergeStrategy {\n if (value === 'merge' || value === 'rebase' || value === 'squash' || value === 'none') {\n return value;\n }\n return fallback;\n}\n\nfunction splitConfigLine(line: string): [string, string] | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n\n const whitespaceIndex = trimmed.search(/\\s/);\n if (whitespaceIndex === -1) {\n return [trimmed, ''];\n }\n\n return [trimmed.slice(0, whitespaceIndex), trimmed.slice(whitespaceIndex).trim()];\n}\n\nasync function readGitflowConfig(git: GitClient): Promise<Map<string, string>> {\n try {\n const rawConfig = await git.raw(['config', '--get-regexp', '^gitflow\\\\.']);\n const entries = rawConfig\n .split(/\\r?\\n/)\n .map(splitConfigLine)\n .filter((entry): entry is [string, string] => entry !== null);\n\n return new Map(entries);\n } catch {\n return new Map();\n }\n}\n\nfunction getConfigValue(config: ReadonlyMap<string, string>, key: string): string | undefined {\n return config.get(key)?.trim() || undefined;\n}\n\nfunction defaultCommandConfig(kind: FlowBranchKind): FlowCommandConfig {\n return {\n finishStrategy: kind === 'topic' ? 'merge' : 'none',\n fetchBeforeFinish: true,\n keepBranch: false,\n publishAfterFinish: false,\n rebaseBeforeFinish: false,\n preserveMerges: false,\n ff: false,\n };\n}\n\nfunction buildTopicDefinition(\n branch: FlowBranchDefinition,\n config: ReadonlyMap<string, string>,\n versionTagPrefix: string,\n): FlowTopicDefinition {\n const defaults = defaultCommandConfig('topic');\n return {\n ...branch,\n tagPrefix: branch.tagPrefix ?? versionTagPrefix,\n command: {\n finishStrategy: asStrategy(\n getConfigValue(config, `gitflow.${branch.name}.finish.strategy`),\n defaults.finishStrategy,\n ),\n fetchBeforeFinish:\n asBoolean(getConfigValue(config, `gitflow.${branch.name}.finish.fetch`)) ?? defaults.fetchBeforeFinish,\n keepBranch: asBoolean(getConfigValue(config, `gitflow.${branch.name}.finish.keep`)) ?? defaults.keepBranch,\n publishAfterFinish:\n asBoolean(getConfigValue(config, `gitflow.${branch.name}.finish.publish`)) ?? defaults.publishAfterFinish,\n rebaseBeforeFinish:\n asBoolean(getConfigValue(config, `gitflow.${branch.name}.finish.rebaseBeforeFinish`)) ??\n defaults.rebaseBeforeFinish,\n preserveMerges:\n asBoolean(getConfigValue(config, `gitflow.${branch.name}.finish.preserveMerges`)) ?? defaults.preserveMerges,\n ff: asBoolean(getConfigValue(config, `gitflow.${branch.name}.finish.ff`)) ?? defaults.ff,\n },\n filters: {\n version: getConfigValue(config, `gitflow.${branch.name}.filter.version`),\n tagMessage:\n getConfigValue(config, `gitflow.${branch.name}.filter.tagMessage`) ??\n getConfigValue(config, `gitflow.${branch.name}.filter.tag_message`),\n },\n };\n}\n\nfunction getPresetDefinition(options: FlowOptions): FlowPresetDefinition {\n const preset = options.preset ?? 'classic';\n\n if (preset === 'github') {\n const mainBranch = options.mainBranch ?? 'main';\n return {\n versionTagPrefix: '',\n bases: [\n {\n name: mainBranch,\n kind: 'base',\n upstreamStrategy: 'none',\n downstreamStrategy: 'none',\n source: 'structured',\n },\n ],\n topics: [\n {\n name: 'feature',\n kind: 'topic',\n parent: mainBranch,\n prefix: 'feature/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'rebase',\n source: 'structured',\n command: {\n ...defaultCommandConfig('topic'),\n finishStrategy: 'merge',\n ff: true,\n },\n filters: {},\n },\n ],\n };\n }\n\n if (preset === 'gitlab') {\n const productionBranch = options.productionBranch ?? 'production';\n const stagingBranch = options.stagingBranch ?? 'staging';\n const mainBranch = options.mainBranch ?? 'main';\n return {\n versionTagPrefix: '',\n bases: [\n {\n name: productionBranch,\n kind: 'base',\n upstreamStrategy: 'none',\n downstreamStrategy: 'none',\n source: 'structured',\n },\n {\n name: stagingBranch,\n kind: 'base',\n parent: productionBranch,\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n autoUpdate: true,\n source: 'structured',\n },\n {\n name: mainBranch,\n kind: 'base',\n parent: stagingBranch,\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n autoUpdate: true,\n source: 'structured',\n },\n ],\n topics: [\n {\n name: 'feature',\n kind: 'topic',\n parent: mainBranch,\n prefix: 'feature/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'rebase',\n source: 'structured',\n command: {\n ...defaultCommandConfig('topic'),\n finishStrategy: 'merge',\n ff: true,\n },\n filters: {},\n },\n {\n name: 'hotfix',\n kind: 'topic',\n parent: productionBranch,\n prefix: 'hotfix/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n tag: true,\n source: 'structured',\n command: defaultCommandConfig('topic'),\n filters: {},\n },\n ],\n };\n }\n\n const mainBranch = options.mainBranch ?? 'main';\n const developBranch = options.developBranch ?? 'develop';\n return {\n versionTagPrefix: '',\n bases: [\n {\n name: mainBranch,\n kind: 'base',\n upstreamStrategy: 'none',\n downstreamStrategy: 'none',\n source: 'structured',\n },\n {\n name: developBranch,\n kind: 'base',\n parent: mainBranch,\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n autoUpdate: true,\n source: 'structured',\n },\n ],\n topics: [\n {\n name: 'feature',\n kind: 'topic',\n parent: developBranch,\n prefix: 'feature/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'rebase',\n source: 'structured',\n command: {\n ...defaultCommandConfig('topic'),\n finishStrategy: 'merge',\n },\n filters: {},\n },\n {\n name: 'release',\n kind: 'topic',\n parent: mainBranch,\n startPoint: developBranch,\n prefix: 'release/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n tag: true,\n source: 'structured',\n command: defaultCommandConfig('topic'),\n filters: {},\n },\n {\n name: 'hotfix',\n kind: 'topic',\n parent: mainBranch,\n prefix: 'hotfix/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n tag: true,\n source: 'structured',\n command: defaultCommandConfig('topic'),\n filters: {},\n },\n {\n name: 'support',\n kind: 'topic',\n parent: mainBranch,\n prefix: 'support/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n source: 'structured',\n command: {\n ...defaultCommandConfig('topic'),\n keepBranch: true,\n },\n filters: {},\n },\n ],\n };\n}\n\nfunction getStructuredConfigState(config: ReadonlyMap<string, string>): FlowConfigState | null {\n const branches = new Map<string, Partial<FlowBranchDefinition>>();\n\n for (const [key, value] of config.entries()) {\n const match = /^gitflow\\.branch\\.([^.]+)\\.(.+)$/.exec(key);\n if (!match) {\n continue;\n }\n\n const [, branchName, property] = match;\n const current = branches.get(branchName) ?? {\n name: branchName,\n source: 'structured' as const,\n };\n\n branches.set(branchName, {\n ...current,\n kind: property === 'type' ? (value === 'base' ? 'base' : 'topic') : current.kind,\n parent: property === 'parent' ? value : current.parent,\n prefix: property === 'prefix' ? value : current.prefix,\n startPoint: property === 'startpoint' ? value : current.startPoint,\n upstreamStrategy: property === 'upstreamstrategy' ? asStrategy(value, 'merge') : current.upstreamStrategy,\n downstreamStrategy: property === 'downstreamstrategy' ? asStrategy(value, 'merge') : current.downstreamStrategy,\n tag: property === 'tag' ? asBoolean(value) : current.tag,\n tagPrefix: property === 'tagprefix' ? value : current.tagPrefix,\n autoUpdate: property === 'autoupdate' ? asBoolean(value) : current.autoUpdate,\n forceDelete: property === 'forcedelete' ? asBoolean(value) : current.forceDelete,\n });\n }\n\n if (branches.size === 0) {\n return null;\n }\n\n const versionTagPrefix =\n getConfigValue(config, 'gitflow.versiontag.prefix') ?? getConfigValue(config, 'gitflow.prefix.versiontag') ?? '';\n const definitions = [...branches.values()]\n .filter((branch): branch is FlowBranchDefinition => branch.kind === 'base' || branch.kind === 'topic')\n .sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n initialized: asBoolean(getConfigValue(config, 'gitflow.initialized')) ?? true,\n version: getConfigValue(config, 'gitflow.version'),\n compatibility: 'structured',\n bases: definitions.filter(branch => branch.kind === 'base'),\n topics: definitions\n .filter((branch): branch is FlowBranchDefinition => branch.kind === 'topic')\n .map(branch => buildTopicDefinition(branch, config, versionTagPrefix)),\n versionTagPrefix,\n config,\n };\n}\n\nfunction getLegacyConfigState(config: ReadonlyMap<string, string>, options: FlowOptions): FlowConfigState | null {\n const hasLegacyKeys =\n config.has('gitflow.branch.master') ||\n config.has('gitflow.branch.develop') ||\n config.has('gitflow.prefix.feature') ||\n config.has('gitflow.prefix.release') ||\n config.has('gitflow.prefix.hotfix') ||\n config.has('gitflow.prefix.support');\n\n if (!hasLegacyKeys) {\n return null;\n }\n\n const mainBranch = options.mainBranch ?? getConfigValue(config, 'gitflow.branch.master') ?? 'main';\n const developBranch = options.developBranch ?? getConfigValue(config, 'gitflow.branch.develop') ?? 'develop';\n const versionTagPrefix = getConfigValue(config, 'gitflow.prefix.versiontag') ?? '';\n\n const topics: readonly FlowTopicDefinition[] = [\n {\n name: 'feature',\n kind: 'topic',\n parent: developBranch,\n prefix: getConfigValue(config, 'gitflow.prefix.feature') ?? 'feature/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'rebase',\n source: 'legacy',\n command: defaultCommandConfig('topic'),\n filters: {},\n },\n {\n name: 'release',\n kind: 'topic',\n parent: mainBranch,\n startPoint: developBranch,\n prefix: getConfigValue(config, 'gitflow.prefix.release') ?? 'release/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n tag: true,\n tagPrefix: versionTagPrefix,\n source: 'legacy',\n command: defaultCommandConfig('topic'),\n filters: {},\n },\n {\n name: 'hotfix',\n kind: 'topic',\n parent: mainBranch,\n prefix: getConfigValue(config, 'gitflow.prefix.hotfix') ?? 'hotfix/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n tag: true,\n tagPrefix: versionTagPrefix,\n source: 'legacy',\n command: defaultCommandConfig('topic'),\n filters: {},\n },\n {\n name: 'support',\n kind: 'topic',\n parent: mainBranch,\n prefix: getConfigValue(config, 'gitflow.prefix.support') ?? 'support/',\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n source: 'legacy',\n command: {\n ...defaultCommandConfig('topic'),\n keepBranch: true,\n },\n filters: {},\n },\n ];\n\n return {\n initialized: true,\n version: getConfigValue(config, 'gitflow.version'),\n compatibility: 'legacy',\n bases: [\n {\n name: mainBranch,\n kind: 'base',\n upstreamStrategy: 'none',\n downstreamStrategy: 'none',\n source: 'legacy',\n },\n {\n name: developBranch,\n kind: 'base',\n parent: mainBranch,\n upstreamStrategy: 'merge',\n downstreamStrategy: 'merge',\n autoUpdate: true,\n source: 'legacy',\n },\n ],\n topics,\n versionTagPrefix,\n config,\n };\n}\n\nasync function getFlowConfigState(git: GitClient, options: FlowOptions): Promise<FlowConfigState> {\n const config = await readGitflowConfig(git);\n const structured = getStructuredConfigState(config);\n if (structured) {\n return structured;\n }\n\n const legacy = getLegacyConfigState(config, options);\n if (legacy) {\n return legacy;\n }\n\n return {\n initialized: false,\n compatibility: 'unconfigured',\n bases: [],\n topics: [],\n versionTagPrefix: '',\n config,\n };\n}\n\nfunction getScopeArgs(options: FlowOptions): string[] {\n const scope = options.scope ?? 'local';\n if (scope === 'file') {\n if (!options.configFile) {\n throw new Error('configFile is required when scope is \"file\".');\n }\n\n return ['--file', options.configFile];\n }\n\n return [`--${scope}`];\n}\n\nasync function setConfigValue(git: GitClient, scopeArgs: readonly string[], key: string, value: string): Promise<void> {\n await git.raw(['config', ...scopeArgs, key, value]);\n}\n\nasync function unsetConfigValue(git: GitClient, scopeArgs: readonly string[], key: string): Promise<void> {\n try {\n await git.raw(['config', ...scopeArgs, '--unset-all', key]);\n } catch {\n // no-op if unset target is absent\n }\n}\n\nfunction truncateText(text: string): string {\n if (text.length <= CHARACTER_LIMIT) {\n return text;\n }\n\n const omitted = text.length - CHARACTER_LIMIT;\n return `${text.slice(0, CHARACTER_LIMIT)}\\n\\n... truncated ${omitted} characters. Narrow the request or use JSON output.`;\n}\n\nfunction pushIssue(issues: string[], issue: string): void {\n if (!issues.includes(issue)) {\n issues.push(issue);\n }\n}\n\nfunction inferHealthStatus(issues: readonly string[]): FlowHealthStatus {\n if (issues.some(issue => issue.startsWith('Error:'))) {\n return 'error';\n }\n if (issues.length > 0) {\n return 'warning';\n }\n return 'healthy';\n}\n\nfunction validateFlowState(state: FlowConfigState): readonly string[] {\n const issues: string[] = [];\n\n if (!state.initialized) {\n pushIssue(issues, 'Warning: git-flow is not initialized in this repository.');\n return issues;\n }\n\n const baseNames = new Set(state.bases.map(branch => branch.name));\n if (baseNames.size === 0) {\n pushIssue(issues, 'Error: no base branches are configured.');\n }\n\n const prefixes = new Map<string, string[]>();\n for (const topic of state.topics) {\n if (!topic.parent) {\n pushIssue(issues, `Error: topic branch type \"${topic.name}\" is missing a parent branch.`);\n } else if (!baseNames.has(topic.parent)) {\n pushIssue(issues, `Error: topic branch type \"${topic.name}\" references missing parent \"${topic.parent}\".`);\n }\n\n if (!topic.prefix) {\n pushIssue(issues, `Error: topic branch type \"${topic.name}\" is missing a prefix.`);\n }\n\n if (topic.prefix) {\n prefixes.set(topic.prefix, [...(prefixes.get(topic.prefix) ?? []), topic.name]);\n }\n }\n\n for (const [prefix, topics] of prefixes.entries()) {\n if (topics.length > 1) {\n pushIssue(issues, `Error: prefix \"${prefix}\" is shared by multiple topic types: ${topics.join(', ')}.`);\n }\n }\n\n const parentMap = new Map(state.bases.map(branch => [branch.name, branch.parent]));\n for (const base of state.bases) {\n const seen = new Set<string>();\n let cursor = base.parent;\n while (cursor) {\n if (seen.has(cursor) || cursor === base.name) {\n pushIssue(issues, `Error: circular base-branch dependency detected at \"${base.name}\".`);\n break;\n }\n seen.add(cursor);\n cursor = parentMap.get(cursor);\n }\n }\n\n return issues;\n}\n\nfunction renderConfigList(state: FlowConfigState): string {\n if (!state.initialized) {\n return 'git-flow is not initialized.';\n }\n\n const lines: string[] = [`git-flow configuration (${state.compatibility})`, '', 'Base branches:'];\n for (const base of state.bases) {\n lines.push(\n `- ${base.name}${base.parent ? ` (parent: ${base.parent})` : ''}${base.autoUpdate ? ', auto-update: true' : ''}`,\n );\n }\n\n lines.push('', 'Topic branch types:');\n for (const topic of state.topics) {\n lines.push(\n `- ${topic.name}: prefix=${topic.prefix ?? '—'}, parent=${topic.parent ?? '—'}, ` +\n `start=${topic.startPoint ?? topic.parent ?? '—'}, strategy=${topic.command.finishStrategy}`,\n );\n }\n\n return truncateText(lines.join('\\n'));\n}\n\nfunction renderOverview(overview: FlowOverview): string {\n const lines: string[] = [\n `git-flow overview (${overview.compatibility})`,\n `Initialized: ${overview.initialized ? 'yes' : 'no'}`,\n `Health: ${overview.health.status}`,\n ];\n\n if (overview.version) {\n lines.push(`Version: ${overview.version}`);\n }\n if (overview.currentBranch) {\n lines.push(`Current branch: ${overview.currentBranch}`);\n }\n if (overview.ahead !== undefined || overview.behind !== undefined) {\n lines.push(`Tracking: ahead ${overview.ahead ?? 0}, behind ${overview.behind ?? 0}`);\n }\n\n lines.push('', `Base branches (${overview.bases.length}):`);\n for (const base of overview.bases) {\n lines.push(`- ${base.name}${base.parent ? ` ← ${base.parent}` : ''}`);\n }\n\n lines.push('', `Topic branch types (${overview.topics.length}):`);\n for (const topic of overview.topics) {\n lines.push(`- ${topic.name}: ${topic.prefix ?? '—'} → ${topic.parent ?? '—'}`);\n }\n\n lines.push('', `Active topic branches (${overview.activeBranches.length}):`);\n if (overview.activeBranches.length === 0) {\n lines.push('- none');\n } else {\n for (const branch of overview.activeBranches) {\n lines.push(\n `- ${branch.fullName} (${branch.type}${branch.isCurrent ? ', current' : ''}${\n branch.upstream ? `, upstream: ${branch.upstream}` : ''\n }${branch.tracking ? `, tracking: ${branch.tracking}` : ''})`,\n );\n }\n }\n\n if (overview.health.issues.length > 0) {\n lines.push('', 'Health issues:');\n for (const issue of overview.health.issues) {\n lines.push(`- ${issue}`);\n }\n }\n\n return truncateText(lines.join('\\n'));\n}\n\nasync function getTrackingInfo(git: GitClient): Promise<readonly FlowActiveBranch[]> {\n try {\n const raw = await git.raw([\n 'for-each-ref',\n '--format=%(refname:short)\\t%(upstream:short)\\t%(upstream:trackshort)',\n 'refs/heads',\n ]);\n\n return raw\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(Boolean)\n .map(line => {\n const [fullName, upstream = '', tracking = ''] = line.split('\\t');\n return {\n type: '',\n fullName,\n shortName: fullName,\n isCurrent: false,\n upstream: upstream || undefined,\n tracking: tracking || undefined,\n } satisfies FlowActiveBranch;\n });\n } catch {\n return [];\n }\n}\n\nasync function buildOverview(git: GitClient, state: FlowConfigState): Promise<FlowOverview> {\n const status = await git.status();\n const issues = validateFlowState(state);\n const tracking = await getTrackingInfo(git);\n\n const activeBranches = tracking\n .map(branch => {\n const topic = state.topics.find(candidate => branch.fullName.startsWith(candidate.prefix ?? ''));\n if (!topic?.prefix) {\n return null;\n }\n\n return {\n type: topic.name,\n fullName: branch.fullName,\n shortName: branch.fullName.slice(topic.prefix.length),\n isCurrent: branch.fullName === status.current,\n upstream: branch.upstream,\n tracking: branch.tracking,\n } satisfies FlowActiveBranch;\n })\n .filter((branch): branch is NonNullable<typeof branch> => branch !== null);\n\n return {\n initialized: state.initialized,\n version: state.version,\n compatibility: state.compatibility,\n bases: state.bases,\n topics: state.topics,\n activeBranches,\n currentBranch: status.current || undefined,\n ahead: status.ahead,\n behind: status.behind,\n health: {\n status: inferHealthStatus(issues),\n issues,\n },\n };\n}\n\nfunction normalizeRequest(options: FlowOptions): NormalizedFlowRequest {\n if (options.action) {\n if (options.action === 'init') {\n return { operation: 'init' };\n }\n if (options.action === 'overview') {\n return { operation: 'overview' };\n }\n if (options.action.startsWith('config-')) {\n return {\n operation: 'config',\n configAction: options.action.slice('config-'.length) as FlowConfigAction,\n };\n }\n if (options.action.startsWith('topic-')) {\n return {\n operation: 'topic',\n topicAction: options.action.slice('topic-'.length) as FlowTopicAction,\n topic: options.topic,\n };\n }\n if (options.action.startsWith('control-')) {\n return {\n operation: 'control',\n controlAction: options.action.slice('control-'.length) as FlowControlAction,\n };\n }\n\n const [topic, topicAction] = options.action.split('-', 2);\n return {\n operation: 'topic',\n topicAction: topicAction as FlowTopicAction,\n topic,\n };\n }\n\n if (!options.operation) {\n throw new Error('operation is required when action is not provided.');\n }\n\n return {\n operation: options.operation,\n configAction: options.configAction,\n topicAction: options.topicAction,\n controlAction: options.controlAction,\n topic: options.topic,\n };\n}\n\nfunction getTopicDefinition(state: FlowConfigState, topicName: string | undefined): FlowTopicDefinition {\n if (!topicName) {\n throw new Error('topic is required.');\n }\n\n const topic = state.topics.find(candidate => candidate.name === topicName);\n if (!topic) {\n throw new Error(`Unknown git-flow topic type: ${topicName}`);\n }\n\n return topic;\n}\n\nasync function branchExists(git: GitClient, branchName: string): Promise<boolean> {\n try {\n const summary = await git.branch(['-a']);\n return summary.all.some(branch => branch === branchName || branch.endsWith(`/${branchName}`));\n } catch {\n return false;\n }\n}\n\nasync function resolveTopicBranchSelection(\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowTopicSelection> {\n const matchMode = options.matchMode ?? 'exact';\n const currentStatus = await git.status();\n const currentBranch = currentStatus.current;\n\n if (!options.name) {\n if (currentBranch && currentBranch.startsWith(topic.prefix ?? '')) {\n return {\n topic: topic.name,\n fullName: currentBranch,\n shortName: currentBranch.slice((topic.prefix ?? '').length),\n };\n }\n\n throw new Error(`name is required for ${topic.name} unless the current branch is already a ${topic.name} branch.`);\n }\n\n const summary = await git.branch(['-a']);\n const prefix = topic.prefix ?? '';\n const candidates = summary.all\n .map(branch => branch.replace(/^remotes\\/[^/]+\\//, '').trim())\n .filter((branch, index, all) => all.indexOf(branch) === index)\n .filter(branch => branch.startsWith(prefix))\n .map(branch => ({\n topic: topic.name,\n fullName: branch,\n shortName: branch.slice(prefix.length),\n }))\n .filter(selection => {\n const requestedName = options.name ?? '';\n return matchMode === 'exact'\n ? selection.shortName === requestedName\n : selection.shortName.startsWith(requestedName);\n });\n\n if (candidates.length === 0) {\n throw new Error(`No ${topic.name} branch matches \"${options.name}\".`);\n }\n if (candidates.length > 1) {\n throw new Error(\n `Multiple ${topic.name} branches match \"${options.name}\": ${candidates.map(candidate => candidate.fullName).join(', ')}.`,\n );\n }\n\n return candidates[0]!;\n}\n\nfunction globMatches(value: string, pattern: string): boolean {\n const normalizedValue = value.toLocaleLowerCase();\n const normalizedPattern = pattern.toLocaleLowerCase();\n\n let valueIndex = 0;\n let patternIndex = 0;\n let starIndex = -1;\n let backtrackValueIndex = -1;\n\n while (valueIndex < normalizedValue.length) {\n const patternChar = normalizedPattern[patternIndex];\n if (patternChar === '?' || patternChar === normalizedValue[valueIndex]) {\n patternIndex += 1;\n valueIndex += 1;\n continue;\n }\n\n if (patternChar === '*') {\n starIndex = patternIndex;\n backtrackValueIndex = valueIndex;\n patternIndex += 1;\n continue;\n }\n\n if (starIndex !== -1) {\n patternIndex = starIndex + 1;\n backtrackValueIndex += 1;\n valueIndex = backtrackValueIndex;\n continue;\n }\n\n return false;\n }\n\n while (normalizedPattern[patternIndex] === '*') {\n patternIndex += 1;\n }\n\n return patternIndex === normalizedPattern.length;\n}\n\nasync function listTopicBranches(\n git: GitClient,\n topic: FlowTopicDefinition,\n pattern?: string,\n): Promise<readonly FlowTopicSelection[]> {\n const matcher = pattern ? (candidate: string) => globMatches(candidate, pattern) : null;\n const summary = await git.branch(['-a']);\n const prefix = topic.prefix ?? '';\n\n return summary.all\n .map(branch => branch.replace(/^remotes\\/[^/]+\\//, '').trim())\n .filter((branch, index, all) => all.indexOf(branch) === index)\n .filter(branch => branch.startsWith(prefix))\n .map(branch => ({\n topic: topic.name,\n fullName: branch,\n shortName: branch.slice(prefix.length),\n }))\n .filter(branch => (matcher ? matcher(branch.shortName) : true))\n .sort((left, right) => left.shortName.localeCompare(right.shortName));\n}\n\nasync function getRemotesSafe(git: GitClient): Promise<readonly string[]> {\n try {\n const remotes = await git.getRemotes(true);\n return remotes.map(remote => remote.name);\n } catch {\n return [];\n }\n}\n\nasync function ensureRemoteExists(git: GitClient, remoteName: string): Promise<void> {\n const remotes = await getRemotesSafe(git);\n if (remotes.length > 0 && !remotes.includes(remoteName)) {\n throw new Error(`Remote does not exist: ${remoteName}`);\n }\n}\n\nasync function resolveGitDir(repoPath: string, git: GitClient): Promise<string> {\n try {\n const gitDir = await git.raw(['rev-parse', '--git-common-dir']);\n return path.resolve(repoPath, gitDir.trim());\n } catch {\n return path.join(repoPath, '.git');\n }\n}\n\nasync function resolveHooksDirectory(repoPath: string, git: GitClient, state: FlowConfigState): Promise<string> {\n const configuredHooks = getConfigValue(state.config, 'gitflow.path.hooks');\n if (configuredHooks) {\n return path.resolve(repoPath, configuredHooks);\n }\n\n const coreHooks = getConfigValue(state.config, 'core.hooksPath');\n if (coreHooks) {\n return path.resolve(repoPath, coreHooks);\n }\n\n return path.join(await resolveGitDir(repoPath, git), 'hooks');\n}\n\nasync function runHook(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n phase: FlowHookPhase,\n context: {\n readonly topic: string;\n readonly shortName: string;\n readonly fullName: string;\n readonly parent?: string;\n readonly remote?: string;\n readonly stage?: FlowFinishStage;\n },\n): Promise<FlowHookExecutionResult> {\n if (!ALLOW_FLOW_HOOKS) {\n return {\n phase,\n executed: false,\n skippedReason: 'Hook execution disabled. Set GIT_ALLOW_FLOW_HOOKS=true to enable.',\n };\n }\n\n const hooksDir = await resolveHooksDirectory(repoPath, git, state);\n const candidates = [\n phase,\n `gitflow-${phase}`,\n `git-flow-${phase}`,\n `${context.topic}-${phase}`,\n `gitflow-${context.topic}-${phase}`,\n ].map(candidate => path.join(hooksDir, candidate));\n const hookPath = candidates.find(candidate => isFileSafe(candidate));\n\n if (!hookPath) {\n return {\n phase,\n executed: false,\n skippedReason: `No hook found in ${hooksDir}.`,\n };\n }\n\n try {\n const result = await execFileAsync(hookPath, [context.topic, context.shortName, context.fullName], {\n cwd: repoPath,\n env: buildSafeChildEnv({\n GITFLOW_ACTION: phase,\n GITFLOW_TOPIC: context.topic,\n GITFLOW_NAME: context.shortName,\n GITFLOW_BRANCH: context.fullName,\n GITFLOW_PARENT: context.parent ?? '',\n GITFLOW_REMOTE: context.remote ?? '',\n GITFLOW_STAGE: context.stage ?? '',\n }),\n });\n\n return {\n phase,\n hookPath,\n executed: true,\n exitCode: 0,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n } catch (error) {\n const gitError = toGitError(error);\n throw new Error(`Hook ${phase} failed: ${gitError.message}`);\n }\n}\n\nfunction splitCommand(command: string): { executable: string; args: string[] } {\n const parts = command.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g) ?? [];\n const [executable = '', ...args] = parts.map(part => part.replace(/^\"|\"$/g, ''));\n return { executable, args };\n}\n\nasync function runFilterProgram(\n executable: string,\n args: readonly string[],\n repoPath: string,\n input: string,\n): Promise<{ stdout: string; stderr: string }> {\n return await new Promise((resolve, reject) => {\n const child = spawn(executable, [...args], {\n cwd: repoPath,\n env: buildSafeChildEnv({\n GITFLOW_FILTER_INPUT: input,\n }),\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n child.kill('SIGKILL');\n reject(new Error(`Filter timed out after ${FILTER_MAX_RUNTIME_MS}ms.`));\n }, FILTER_MAX_RUNTIME_MS);\n\n const rejectOnce = (error: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n reject(error);\n };\n\n const resolveOnce = (result: { stdout: string; stderr: string }): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n\n const appendBounded = (current: string, chunk: string): string => {\n const remaining = FILTER_MAX_OUTPUT_CHARS - current.length;\n if (remaining <= 0) {\n throw new Error(`Filter output exceeded ${FILTER_MAX_OUTPUT_CHARS} characters.`);\n }\n if (chunk.length > remaining) {\n throw new Error(`Filter output exceeded ${FILTER_MAX_OUTPUT_CHARS} characters.`);\n }\n return current + chunk;\n };\n\n child.stdout.on('data', chunk => {\n try {\n stdout = appendBounded(stdout, chunk.toString());\n } catch (error) {\n child.kill('SIGKILL');\n rejectOnce(error instanceof Error ? error : new Error(String(error)));\n }\n });\n child.stderr.on('data', chunk => {\n try {\n stderr = appendBounded(stderr, chunk.toString());\n } catch (error) {\n child.kill('SIGKILL');\n rejectOnce(error instanceof Error ? error : new Error(String(error)));\n }\n });\n child.on('error', error => {\n rejectOnce(error instanceof Error ? error : new Error(String(error)));\n });\n child.on('close', code => {\n if (settled) {\n return;\n }\n if (code === 0) {\n resolveOnce({ stdout, stderr });\n return;\n }\n\n rejectOnce(new Error(stderr || `Filter exited with code ${code ?? 'unknown'}.`));\n });\n\n child.stdin.end(input);\n });\n}\n\nasync function runFilter(\n repoPath: string,\n kind: FlowFilterKind,\n command: string | undefined,\n input: string,\n): Promise<FlowFilterExecutionResult> {\n if (!command) {\n return {\n kind,\n executed: false,\n skippedReason: 'No filter configured.',\n input,\n output: input,\n };\n }\n\n if (!ALLOW_FLOW_HOOKS) {\n return {\n kind,\n command,\n executed: false,\n skippedReason: 'Hook/filter execution disabled. Set GIT_ALLOW_FLOW_HOOKS=true to enable.',\n input,\n output: input,\n };\n }\n\n const parsed = splitCommand(command);\n if (!parsed.executable) {\n return {\n kind,\n command,\n executed: false,\n skippedReason: 'Filter command is empty.',\n input,\n output: input,\n };\n }\n\n try {\n const result = await runFilterProgram(parsed.executable, parsed.args, repoPath, input);\n\n return {\n kind,\n command,\n executed: true,\n input,\n output: result.stdout.trim() || input,\n };\n } catch (error) {\n const gitError = toGitError(error);\n throw new Error(`Filter ${kind} failed: ${gitError.message}`);\n }\n}\n\nfunction buildFinishStateKey(property: string): string {\n return `${FINISH_STATE_PREFIX}.${property}`;\n}\n\nasync function writeFinishState(git: GitClient, state: FlowFinishState): Promise<void> {\n const scopeArgs = ['--local'];\n const serializable: Record<string, string> = {\n topic: state.topic,\n shortName: state.shortName,\n branchName: state.branchName,\n originalBranch: state.originalBranch,\n parentBranch: state.parentBranch,\n backmergeBranches: JSON.stringify(state.backmergeBranches),\n stage: state.stage,\n strategy: state.strategy,\n deleteBranch: String(state.deleteBranch),\n keepBranch: String(state.keepBranch),\n pendingBackmergeIndex: String(state.pendingBackmergeIndex),\n publishAfterFinish: String(state.publishAfterFinish),\n filters: JSON.stringify(state.filters),\n tagName: state.tagName ?? '',\n tagMessage: state.tagMessage ?? '',\n remote: state.remote ?? '',\n };\n\n for (const [property, value] of Object.entries(serializable)) {\n await setConfigValue(git, scopeArgs, buildFinishStateKey(property), value);\n }\n}\n\nasync function clearFinishState(git: GitClient): Promise<void> {\n for (const property of [\n 'topic',\n 'shortName',\n 'branchName',\n 'originalBranch',\n 'parentBranch',\n 'backmergeBranches',\n 'stage',\n 'strategy',\n 'deleteBranch',\n 'keepBranch',\n 'pendingBackmergeIndex',\n 'publishAfterFinish',\n 'filters',\n 'tagName',\n 'tagMessage',\n 'remote',\n ]) {\n await unsetConfigValue(git, ['--local'], buildFinishStateKey(property));\n }\n}\n\nasync function readFinishState(git: GitClient): Promise<FlowFinishState | null> {\n try {\n const raw = await git.raw(['config', '--get-regexp', `^${FINISH_STATE_PREFIX.replace(/\\./g, '\\\\.')}\\\\.`]);\n const entries = new Map(\n raw\n .split(/\\r?\\n/)\n .map(splitConfigLine)\n .filter((entry): entry is [string, string] => entry !== null),\n );\n\n const stage = getConfigValue(entries, buildFinishStateKey('stage')) as FlowFinishStage | undefined;\n if (!stage || !CONTROL_STAGES.includes(stage)) {\n return null;\n }\n\n return {\n topic: getConfigValue(entries, buildFinishStateKey('topic')) ?? '',\n shortName: getConfigValue(entries, buildFinishStateKey('shortName')) ?? '',\n branchName: getConfigValue(entries, buildFinishStateKey('branchName')) ?? '',\n originalBranch: getConfigValue(entries, buildFinishStateKey('originalBranch')) ?? '',\n parentBranch: getConfigValue(entries, buildFinishStateKey('parentBranch')) ?? '',\n backmergeBranches: JSON.parse(\n getConfigValue(entries, buildFinishStateKey('backmergeBranches')) ?? '[]',\n ) as readonly string[],\n stage,\n strategy: asStrategy(getConfigValue(entries, buildFinishStateKey('strategy')), 'merge'),\n deleteBranch: asBoolean(getConfigValue(entries, buildFinishStateKey('deleteBranch'))) ?? true,\n keepBranch: asBoolean(getConfigValue(entries, buildFinishStateKey('keepBranch'))) ?? false,\n filters: JSON.parse(\n getConfigValue(entries, buildFinishStateKey('filters')) ?? '[]',\n ) as readonly FlowFilterExecutionResult[],\n tagName: getConfigValue(entries, buildFinishStateKey('tagName')) || undefined,\n tagMessage: getConfigValue(entries, buildFinishStateKey('tagMessage')) || undefined,\n remote: getConfigValue(entries, buildFinishStateKey('remote')) || undefined,\n pendingBackmergeIndex: Number(getConfigValue(entries, buildFinishStateKey('pendingBackmergeIndex')) ?? '0'),\n publishAfterFinish: asBoolean(getConfigValue(entries, buildFinishStateKey('publishAfterFinish'))) ?? false,\n };\n } catch {\n return null;\n }\n}\n\nasync function getCurrentBranch(git: GitClient): Promise<string> {\n const status = await git.status();\n return status.current || 'HEAD';\n}\n\nasync function checkoutRefIfNeeded(git: GitClient, ref: string): Promise<void> {\n const currentBranch = await getCurrentBranch(git);\n if (currentBranch !== ref) {\n await git.checkout(ref);\n }\n}\n\nasync function performIntegration(\n git: GitClient,\n targetBranch: string,\n sourceBranch: string,\n strategy: FlowMergeStrategy,\n ff: boolean,\n preserveMerges: boolean,\n): Promise<void> {\n if (strategy === 'none') {\n return;\n }\n\n if (strategy === 'merge') {\n const mergeArgs = ['merge'];\n if (ff) {\n mergeArgs.push('--ff');\n } else {\n mergeArgs.push('--no-ff');\n }\n mergeArgs.push(sourceBranch, '-m', `Merge branch '${sourceBranch}' into ${targetBranch}`);\n await git.raw(mergeArgs);\n return;\n }\n\n if (strategy === 'squash') {\n await git.raw(['merge', '--squash', sourceBranch]);\n await git.commit(`Squash merge '${sourceBranch}' into ${targetBranch}`);\n return;\n }\n\n const rebaseArgs = ['rebase'];\n if (preserveMerges) {\n rebaseArgs.push('--rebase-merges');\n }\n rebaseArgs.push(targetBranch);\n await git.checkout(sourceBranch);\n await git.raw(rebaseArgs);\n await git.checkout(targetBranch);\n await git.raw(['merge', '--ff-only', sourceBranch]);\n}\n\nasync function maybeFetchRemote(git: GitClient, remote: string | undefined, enabled: boolean): Promise<void> {\n if (!enabled || !remote) {\n return;\n }\n\n const remotes = await getRemotesSafe(git);\n if (remotes.length > 0 && remotes.includes(remote)) {\n await git.fetch(remote);\n }\n}\n\nfunction getBackmergeBranches(state: FlowConfigState, topic: FlowTopicDefinition): readonly string[] {\n const mainBase = state.bases.find(branch => branch.name === topic.parent);\n const developBase = state.bases.find(\n branch => branch.name !== topic.parent && branch.name.toLowerCase().includes('develop'),\n );\n\n if (topic.startPoint && topic.startPoint !== topic.parent) {\n return [topic.startPoint];\n }\n\n if (topic.name === 'hotfix' && mainBase && developBase) {\n return [developBase.name];\n }\n\n if (topic.name === 'release' && developBase) {\n return [developBase.name];\n }\n\n return [];\n}\n\nasync function startTopic(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n if (!options.name) {\n throw new Error('name is required for topic start.');\n }\n\n const fullName = `${topic.prefix ?? ''}${options.name}`;\n const startPoint = options.baseRef ?? topic.startPoint ?? topic.parent;\n if (!startPoint) {\n throw new Error(`Topic type \"${topic.name}\" does not define a start point or parent.`);\n }\n\n const hooks = [\n await runHook(repoPath, git, state, 'pre-start', {\n topic: topic.name,\n shortName: options.name,\n fullName,\n parent: topic.parent,\n remote: options.remote,\n }),\n ];\n await git.checkoutBranch(fullName, startPoint);\n hooks.push(\n await runHook(repoPath, git, state, 'post-start', {\n topic: topic.name,\n shortName: options.name,\n fullName,\n parent: topic.parent,\n remote: options.remote,\n }),\n );\n\n return {\n markdown: [\n `Created and switched to branch ${fullName} from ${startPoint}.`,\n ...hooks.filter(h => h.executed).map(h => `Hook: ${h.phase}`),\n ].join('\\n'),\n data: {\n topic: topic.name,\n branch: fullName,\n startPoint,\n hooks,\n },\n };\n}\n\nasync function listTopic(git: GitClient, topic: FlowTopicDefinition, options: FlowOptions): Promise<FlowActionResult> {\n const branches = await listTopicBranches(git, topic, options.pattern);\n const markdown =\n branches.length > 0\n ? branches.map(branch => branch.fullName).join('\\n')\n : `No ${topic.name} branches found${options.pattern ? ` matching ${options.pattern}` : ''}.`;\n\n return {\n markdown: truncateText(markdown),\n data: {\n topic: topic.name,\n branches,\n pattern: options.pattern ?? null,\n },\n };\n}\n\nasync function publishTopic(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n const selection = options.name\n ? {\n topic: topic.name,\n fullName: `${topic.prefix ?? ''}${options.name}`,\n shortName: options.name,\n }\n : await resolveTopicBranchSelection(git, state, topic, options);\n const remote = options.remote ?? DEFAULT_REMOTE;\n await ensureRemoteExists(git, remote);\n const hooks = [\n await runHook(repoPath, git, state, 'pre-publish', {\n topic: topic.name,\n shortName: selection.shortName,\n fullName: selection.fullName,\n parent: topic.parent,\n remote,\n }),\n ];\n await git.push(remote, selection.fullName, ['--set-upstream']);\n hooks.push(\n await runHook(repoPath, git, state, 'post-publish', {\n topic: topic.name,\n shortName: selection.shortName,\n fullName: selection.fullName,\n parent: topic.parent,\n remote,\n }),\n );\n\n return {\n markdown: `Published ${selection.fullName} to ${remote}.`,\n data: {\n topic: topic.name,\n branch: selection.fullName,\n remote,\n hooks,\n },\n };\n}\n\nasync function checkoutTopic(\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n const selection = await resolveTopicBranchSelection(git, state, topic, options);\n await git.checkout(selection.fullName);\n return {\n markdown: `Checked out ${selection.fullName}.`,\n data: selection,\n };\n}\n\nasync function trackTopic(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n if (!options.name) {\n throw new Error('name is required for topic track.');\n }\n\n const remote = options.remote ?? DEFAULT_REMOTE;\n await ensureRemoteExists(git, remote);\n const branchName = `${topic.prefix ?? ''}${options.name}`;\n const remoteRef = `${remote}/${branchName}`;\n const hooks = [\n await runHook(repoPath, git, state, 'pre-track', {\n topic: topic.name,\n shortName: options.name,\n fullName: branchName,\n parent: topic.parent,\n remote,\n }),\n ];\n await git.raw(['checkout', '--track', remoteRef]);\n hooks.push(\n await runHook(repoPath, git, state, 'post-track', {\n topic: topic.name,\n shortName: options.name,\n fullName: branchName,\n parent: topic.parent,\n remote,\n }),\n );\n\n return {\n markdown: `Tracking ${remoteRef}.`,\n data: {\n topic: topic.name,\n branch: branchName,\n remote,\n hooks,\n },\n };\n}\n\nasync function renameTopic(\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n if (!options.newName) {\n throw new Error('newName is required for topic rename.');\n }\n\n const selection = await resolveTopicBranchSelection(git, state, topic, options);\n const renamedBranch = `${topic.prefix ?? ''}${options.newName}`;\n await git.raw(['branch', '-m', selection.fullName, renamedBranch]);\n\n return {\n markdown: `Renamed ${selection.fullName} to ${renamedBranch}.`,\n data: {\n topic: topic.name,\n previousName: selection.fullName,\n branch: renamedBranch,\n },\n };\n}\n\nasync function deleteTopic(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n const selection = await resolveTopicBranchSelection(git, state, topic, options);\n const remote = options.remote;\n const hooks = [\n await runHook(repoPath, git, state, 'pre-delete', {\n topic: topic.name,\n shortName: selection.shortName,\n fullName: selection.fullName,\n parent: topic.parent,\n remote,\n }),\n ];\n await git.deleteLocalBranch(selection.fullName, options.forceDelete ?? topic.forceDelete ?? false);\n\n if (remote) {\n await ensureRemoteExists(git, remote);\n await git.push(remote, selection.fullName, ['--delete']);\n }\n\n hooks.push(\n await runHook(repoPath, git, state, 'post-delete', {\n topic: topic.name,\n shortName: selection.shortName,\n fullName: selection.fullName,\n parent: topic.parent,\n remote,\n }),\n );\n\n return {\n markdown: remote ? `Deleted ${selection.fullName} locally and from ${remote}.` : `Deleted ${selection.fullName}.`,\n data: {\n topic: topic.name,\n branch: selection.fullName,\n remote: remote ?? null,\n hooks,\n },\n };\n}\n\nasync function updateTopic(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n const selection = await resolveTopicBranchSelection(git, state, topic, options);\n const originalBranch = await getCurrentBranch(git);\n const parent = topic.parent;\n if (!parent) {\n throw new Error(`Topic type \"${topic.name}\" does not define a parent branch.`);\n }\n\n const hooks = [\n await runHook(repoPath, git, state, 'pre-update', {\n topic: topic.name,\n shortName: selection.shortName,\n fullName: selection.fullName,\n parent,\n remote: options.remote,\n }),\n ];\n await git.checkout(selection.fullName);\n const strategy = options.strategy ?? topic.downstreamStrategy ?? 'merge';\n if (strategy === 'rebase') {\n await git.raw(['rebase', parent]);\n } else if (strategy === 'squash') {\n await git.raw(['merge', '--squash', parent]);\n await git.commit(`Update ${selection.fullName} from ${parent}`);\n } else if (strategy === 'merge') {\n await git.raw(['merge', '--no-ff', parent, '-m', `Merge '${parent}' into ${selection.fullName}`]);\n }\n\n if (originalBranch !== selection.fullName) {\n await git.checkout(originalBranch);\n }\n hooks.push(\n await runHook(repoPath, git, state, 'post-update', {\n topic: topic.name,\n shortName: selection.shortName,\n fullName: selection.fullName,\n parent,\n remote: options.remote,\n }),\n );\n\n return {\n markdown: `Updated ${selection.fullName} from ${parent} using ${strategy}.`,\n data: {\n topic: topic.name,\n branch: selection.fullName,\n parent,\n strategy,\n hooks,\n },\n };\n}\n\nasync function initializeFlow(git: GitClient, options: FlowOptions): Promise<FlowActionResult> {\n const state = await getFlowConfigState(git, options);\n if (state.initialized && !options.force) {\n throw new Error('git-flow is already initialized. Use force=true to rewrite the configuration.');\n }\n\n const scopeArgs = getScopeArgs(options);\n const preset = getPresetDefinition(options);\n\n await setConfigValue(git, scopeArgs, 'gitflow.version', '1.0');\n await setConfigValue(git, scopeArgs, 'gitflow.initialized', 'true');\n await setConfigValue(git, scopeArgs, 'gitflow.versiontag.prefix', preset.versionTagPrefix);\n\n for (const base of preset.bases) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${base.name}.type`, 'base');\n if (base.parent) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${base.name}.parent`, base.parent);\n }\n if (base.upstreamStrategy) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${base.name}.upstreamstrategy`, base.upstreamStrategy);\n }\n if (base.downstreamStrategy) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${base.name}.downstreamstrategy`, base.downstreamStrategy);\n }\n if (base.autoUpdate !== undefined) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${base.name}.autoupdate`, String(base.autoUpdate));\n }\n }\n\n for (const topic of preset.topics) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.type`, 'topic');\n if (topic.parent) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.parent`, topic.parent);\n }\n if (topic.prefix) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.prefix`, topic.prefix);\n }\n if (topic.startPoint) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.startpoint`, topic.startPoint);\n }\n if (topic.upstreamStrategy) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.upstreamstrategy`, topic.upstreamStrategy);\n }\n if (topic.downstreamStrategy) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.downstreamstrategy`, topic.downstreamStrategy);\n }\n if (topic.tag !== undefined) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.tag`, String(topic.tag));\n }\n if (topic.tagPrefix) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${topic.name}.tagprefix`, topic.tagPrefix);\n }\n await setConfigValue(git, scopeArgs, `gitflow.${topic.name}.finish.strategy`, topic.command.finishStrategy);\n await setConfigValue(git, scopeArgs, `gitflow.${topic.name}.finish.fetch`, String(topic.command.fetchBeforeFinish));\n await setConfigValue(git, scopeArgs, `gitflow.${topic.name}.finish.keep`, String(topic.command.keepBranch));\n await setConfigValue(\n git,\n scopeArgs,\n `gitflow.${topic.name}.finish.publish`,\n String(topic.command.publishAfterFinish),\n );\n }\n\n const createdBranches: string[] = [];\n if (!options.noCreateBranches) {\n for (const base of preset.bases) {\n if (await branchExists(git, base.name)) {\n continue;\n }\n if (base.parent) {\n await git.raw(['branch', base.name, base.parent]);\n } else {\n await git.raw(['branch', base.name]);\n }\n createdBranches.push(base.name);\n }\n }\n\n const updatedState = await getFlowConfigState(git, options);\n const lines = [\n `Initialized git-flow-next preset \"${options.preset ?? 'classic'}\".`,\n `Configured ${updatedState.bases.length} base branch(es) and ${updatedState.topics.length} topic type(s).`,\n ];\n if (createdBranches.length > 0) {\n lines.push(`Created branches: ${createdBranches.join(', ')}`);\n }\n if (options.noCreateBranches) {\n lines.push('Skipped branch creation because noCreateBranches=true.');\n }\n\n return {\n markdown: lines.join('\\n'),\n data: {\n preset: options.preset ?? 'classic',\n bases: updatedState.bases,\n topics: updatedState.topics,\n createdBranches,\n },\n };\n}\n\nfunction makeBranchDefinition(\n state: FlowConfigState,\n options: FlowOptions,\n existing?: FlowBranchDefinition,\n): FlowBranchDefinition {\n const name = options.name ?? existing?.name;\n const kind = options.branchKind ?? existing?.kind;\n if (!name || !kind) {\n throw new Error('name and branchKind are required for flow config mutations.');\n }\n\n return {\n name,\n kind,\n parent: options.parent ?? existing?.parent,\n prefix: options.prefix ?? existing?.prefix,\n startPoint: options.startPoint ?? existing?.startPoint,\n upstreamStrategy: options.upstreamStrategy ?? existing?.upstreamStrategy,\n downstreamStrategy: options.downstreamStrategy ?? existing?.downstreamStrategy,\n tag: options.tag ?? existing?.tag,\n tagPrefix: options.tagPrefix ?? existing?.tagPrefix ?? state.versionTagPrefix,\n autoUpdate: options.autoUpdate ?? existing?.autoUpdate,\n forceDelete: options.forceDelete ?? existing?.forceDelete,\n source: 'structured',\n };\n}\n\nasync function writeBranchDefinition(\n git: GitClient,\n options: FlowOptions,\n branch: FlowBranchDefinition,\n existingName?: string,\n): Promise<void> {\n const scopeArgs = getScopeArgs(options);\n const namespace = existingName ?? branch.name;\n\n for (const property of FLOW_CONFIG_PROPERTIES) {\n await unsetConfigValue(git, scopeArgs, `gitflow.branch.${namespace}.${property}`);\n }\n\n if (existingName && existingName !== branch.name) {\n for (const property of FLOW_CONFIG_PROPERTIES) {\n await unsetConfigValue(git, scopeArgs, `gitflow.branch.${existingName}.${property}`);\n }\n }\n\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.type`, branch.kind);\n if (branch.parent) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.parent`, branch.parent);\n }\n if (branch.prefix) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.prefix`, branch.prefix);\n }\n if (branch.startPoint) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.startpoint`, branch.startPoint);\n }\n if (branch.upstreamStrategy) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.upstreamstrategy`, branch.upstreamStrategy);\n }\n if (branch.downstreamStrategy) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.downstreamstrategy`, branch.downstreamStrategy);\n }\n if (branch.tag !== undefined) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.tag`, String(branch.tag));\n }\n if (branch.tagPrefix) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.tagprefix`, branch.tagPrefix);\n }\n if (branch.autoUpdate !== undefined) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.autoupdate`, String(branch.autoUpdate));\n }\n if (branch.forceDelete !== undefined) {\n await setConfigValue(git, scopeArgs, `gitflow.branch.${branch.name}.forcedelete`, String(branch.forceDelete));\n }\n\n const finishPrefix = `gitflow.${branch.name}.finish`;\n const filterPrefix = `gitflow.${branch.name}.filter`;\n if (options.strategy) {\n await setConfigValue(git, scopeArgs, `${finishPrefix}.strategy`, options.strategy);\n }\n if (options.fetch !== undefined) {\n await setConfigValue(git, scopeArgs, `${finishPrefix}.fetch`, String(options.fetch));\n }\n if (options.keepBranch !== undefined) {\n await setConfigValue(git, scopeArgs, `${finishPrefix}.keep`, String(options.keepBranch));\n }\n if (options.publish !== undefined) {\n await setConfigValue(git, scopeArgs, `${finishPrefix}.publish`, String(options.publish));\n }\n if (options.rebaseBeforeFinish !== undefined) {\n await setConfigValue(git, scopeArgs, `${finishPrefix}.rebaseBeforeFinish`, String(options.rebaseBeforeFinish));\n }\n if (options.preserveMerges !== undefined) {\n await setConfigValue(git, scopeArgs, `${finishPrefix}.preserveMerges`, String(options.preserveMerges));\n }\n if (options.ff !== undefined) {\n await setConfigValue(git, scopeArgs, `${finishPrefix}.ff`, String(options.ff));\n }\n if (options.tagMessage) {\n await setConfigValue(git, scopeArgs, `${filterPrefix}.tagMessage`, options.tagMessage);\n }\n}\n\nasync function mutateConfig(\n git: GitClient,\n state: FlowConfigState,\n options: FlowOptions,\n action: FlowConfigAction,\n): Promise<FlowActionResult> {\n if (action === 'list') {\n return {\n markdown: renderConfigList(state),\n data: state,\n };\n }\n\n const allBranches = [...state.bases, ...state.topics];\n const existing = allBranches.find(branch => branch.name === options.name);\n\n if (action === 'add') {\n if (existing) {\n throw new Error(`Flow branch type already exists: ${options.name}`);\n }\n const branch = makeBranchDefinition(state, options);\n await writeBranchDefinition(git, options, branch);\n return {\n markdown: `Added flow ${branch.kind} branch definition ${branch.name}.`,\n data: {\n action,\n branch,\n } satisfies FlowConfigMutationResult,\n };\n }\n\n if (!existing) {\n throw new Error(`Unknown flow branch definition: ${options.name}`);\n }\n\n if (action === 'update') {\n const branch = makeBranchDefinition(state, options, existing);\n await writeBranchDefinition(git, options, branch);\n return {\n markdown: `Updated flow ${branch.kind} branch definition ${branch.name}.`,\n data: {\n action,\n branch,\n } satisfies FlowConfigMutationResult,\n };\n }\n\n if (action === 'rename') {\n if (!options.newName) {\n throw new Error('newName is required for config rename.');\n }\n const renamed = makeBranchDefinition(state, { ...options, name: options.newName }, existing);\n await writeBranchDefinition(git, options, renamed, existing.name);\n\n for (const dependent of allBranches.filter(\n branch => branch.parent === existing.name || branch.startPoint === existing.name,\n )) {\n const updatedDependent: FlowBranchDefinition = {\n ...dependent,\n parent: dependent.parent === existing.name ? renamed.name : dependent.parent,\n startPoint: dependent.startPoint === existing.name ? renamed.name : dependent.startPoint,\n };\n await writeBranchDefinition(git, options, updatedDependent);\n }\n\n return {\n markdown: `Renamed flow branch definition ${existing.name} to ${renamed.name}.`,\n data: {\n action,\n branch: renamed,\n previousName: existing.name,\n } satisfies FlowConfigMutationResult,\n };\n }\n\n for (const property of FLOW_CONFIG_PROPERTIES) {\n await unsetConfigValue(git, getScopeArgs(options), `gitflow.branch.${existing.name}.${property}`);\n }\n for (const property of FLOW_FINISH_PROPERTIES) {\n await unsetConfigValue(git, getScopeArgs(options), `gitflow.${existing.name}.finish.${property}`);\n }\n for (const property of FLOW_FILTER_PROPERTIES) {\n await unsetConfigValue(git, getScopeArgs(options), `gitflow.${existing.name}.filter.${property}`);\n }\n\n return {\n markdown: `Deleted flow branch definition ${existing.name}.`,\n data: {\n action,\n branch: existing,\n } satisfies FlowConfigMutationResult,\n };\n}\n\nasync function prepareFinishState(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n selection: FlowTopicSelection,\n options: FlowOptions,\n): Promise<FlowFinishState> {\n const originalBranch = await getCurrentBranch(git);\n const parentBranch = topic.parent;\n if (!parentBranch) {\n throw new Error(`Topic type \"${topic.name}\" does not define a parent branch.`);\n }\n\n const strategy = options.strategy ?? topic.command.finishStrategy;\n const keepBranch = options.keepBranch ?? topic.command.keepBranch;\n const backmergeBranches = options.noBackmerge ? [] : getBackmergeBranches(state, topic);\n let tagName =\n options.tag === false\n ? undefined\n : topic.tag\n ? `${topic.tagPrefix ?? state.versionTagPrefix}${selection.shortName}`\n : undefined;\n let tagMessage = options.tagMessage;\n const filters: FlowFilterExecutionResult[] = [];\n\n if (topic.filters.version) {\n const filtered = await runFilter(repoPath, 'version', topic.filters.version, selection.shortName);\n filters.push(filtered);\n if (tagName) {\n tagName = `${topic.tagPrefix ?? state.versionTagPrefix}${filtered.output}`;\n }\n }\n if (topic.filters.tagMessage && tagMessage) {\n const filtered = await runFilter(repoPath, 'tag_message', topic.filters.tagMessage, tagMessage);\n filters.push(filtered);\n tagMessage = filtered.output;\n }\n\n return {\n topic: topic.name,\n shortName: selection.shortName,\n branchName: selection.fullName,\n originalBranch,\n parentBranch,\n backmergeBranches,\n stage: 'prepare',\n strategy,\n deleteBranch: options.deleteBranch ?? !keepBranch,\n keepBranch,\n filters,\n tagName,\n tagMessage,\n remote: options.remote,\n pendingBackmergeIndex: 0,\n publishAfterFinish: options.publishAfterFinish ?? options.publish ?? topic.command.publishAfterFinish,\n };\n}\n\nasync function executeFinishStages(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topicDefinition: FlowTopicDefinition,\n finishState: FlowFinishState,\n options: FlowOptions,\n): Promise<FlowFinishResult> {\n const hooks: FlowHookExecutionResult[] = [];\n const filters: FlowFilterExecutionResult[] = [...finishState.filters];\n let current = finishState;\n\n if (current.stage === 'prepare') {\n if (options.fetch ?? topicDefinition.command.fetchBeforeFinish) {\n await maybeFetchRemote(git, current.remote, true);\n }\n if (options.rebaseBeforeFinish ?? topicDefinition.command.rebaseBeforeFinish) {\n await git.checkout(current.branchName);\n const rebaseArgs = ['rebase'];\n if (options.preserveMerges ?? topicDefinition.command.preserveMerges) {\n rebaseArgs.push('--rebase-merges');\n }\n rebaseArgs.push(current.parentBranch);\n await git.raw(rebaseArgs);\n }\n current = { ...current, stage: 'hook-pre-finish' };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'hook-pre-finish') {\n hooks.push(\n await runHook(repoPath, git, state, 'pre-finish', {\n topic: current.topic,\n shortName: current.shortName,\n fullName: current.branchName,\n parent: current.parentBranch,\n remote: current.remote,\n stage: current.stage,\n }),\n );\n current = { ...current, stage: 'checkout-parent' };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'checkout-parent') {\n await checkoutRefIfNeeded(git, current.parentBranch);\n current = { ...current, stage: 'integrate-parent' };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'integrate-parent') {\n try {\n await performIntegration(\n git,\n current.parentBranch,\n current.branchName,\n current.strategy,\n options.ff ?? topicDefinition.command.ff,\n options.preserveMerges ?? topicDefinition.command.preserveMerges,\n );\n } catch {\n await writeFinishState(git, current);\n return {\n completed: false,\n state: current,\n mergedInto: [],\n deleted: false,\n tagName: current.tagName,\n hooks,\n filters,\n } satisfies FlowFinishResult;\n }\n current = { ...current, stage: 'tag' };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'tag') {\n if (current.tagName) {\n await git.addAnnotatedTag(current.tagName, current.tagMessage ?? `Release ${current.shortName}`);\n }\n current = { ...current, stage: 'hook-post-parent' };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'hook-post-parent') {\n current = {\n ...current,\n stage: current.backmergeBranches.length > 0 ? 'checkout-backmerge' : 'hook-post-finish',\n };\n await writeFinishState(git, current);\n }\n\n while (current.stage === 'checkout-backmerge' || current.stage === 'integrate-backmerge') {\n const target = current.backmergeBranches[current.pendingBackmergeIndex];\n if (!target) {\n current = { ...current, stage: 'publish' };\n await writeFinishState(git, current);\n break;\n }\n\n if (current.stage === 'checkout-backmerge') {\n await checkoutRefIfNeeded(git, target);\n current = { ...current, stage: 'integrate-backmerge' };\n await writeFinishState(git, current);\n }\n\n try {\n await performIntegration(\n git,\n target,\n current.branchName,\n 'merge',\n false,\n options.preserveMerges ?? topicDefinition.command.preserveMerges,\n );\n } catch {\n await writeFinishState(git, current);\n return {\n completed: false,\n state: current,\n mergedInto: [current.parentBranch, ...current.backmergeBranches.slice(0, current.pendingBackmergeIndex)],\n deleted: false,\n tagName: current.tagName,\n hooks,\n filters,\n } satisfies FlowFinishResult;\n }\n\n current = {\n ...current,\n pendingBackmergeIndex: current.pendingBackmergeIndex + 1,\n stage:\n current.pendingBackmergeIndex + 1 < current.backmergeBranches.length\n ? 'checkout-backmerge'\n : 'hook-post-finish',\n };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'hook-post-finish') {\n hooks.push(\n await runHook(repoPath, git, state, 'post-finish', {\n topic: current.topic,\n shortName: current.shortName,\n fullName: current.branchName,\n parent: current.parentBranch,\n remote: current.remote,\n stage: current.stage,\n }),\n );\n\n current = { ...current, stage: 'publish' };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'publish') {\n if (current.publishAfterFinish && current.remote) {\n await ensureRemoteExists(git, current.remote);\n await git.push(current.remote, current.parentBranch);\n for (const branch of current.backmergeBranches) {\n await git.push(current.remote, branch);\n }\n if (current.tagName) {\n await git.pushTags(current.remote);\n }\n }\n current = { ...current, stage: 'cleanup' };\n await writeFinishState(git, current);\n }\n\n if (current.stage === 'cleanup') {\n if (!current.keepBranch && current.deleteBranch) {\n await git.deleteLocalBranch(current.branchName);\n }\n await checkoutRefIfNeeded(git, current.originalBranch);\n await clearFinishState(git);\n }\n\n return {\n completed: true,\n mergedInto: [current.parentBranch, ...current.backmergeBranches],\n deleted: !current.keepBranch && current.deleteBranch,\n tagName: current.tagName,\n hooks,\n filters,\n } satisfies FlowFinishResult;\n}\n\nasync function finishTopic(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n const selection = await resolveTopicBranchSelection(git, state, topic, options);\n const finishState = await prepareFinishState(repoPath, git, state, topic, selection, options);\n await writeFinishState(git, finishState);\n const result = await executeFinishStages(repoPath, git, state, topic, finishState, options);\n\n if (!result.completed) {\n return {\n markdown:\n `Finish paused for ${selection.fullName} at stage ${result.state?.stage}. ` +\n 'Resolve conflicts, then use control/continue or action=\"control-continue\".',\n data: result,\n };\n }\n\n return {\n markdown: [\n `Finished ${selection.fullName}.`,\n `Merged into: ${result.mergedInto.join(', ') || 'none'}`,\n ...(result.tagName ? [`Tag: ${result.tagName}`] : []),\n ...(result.deleted ? [`Deleted ${selection.fullName}.`] : []),\n ].join('\\n'),\n data: result,\n };\n}\n\nasync function continueOrAbort(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n controlAction: FlowControlAction,\n): Promise<FlowActionResult> {\n const finishState = await readFinishState(git);\n if (!finishState) {\n throw new Error('No in-progress git_flow finish state found.');\n }\n\n if (controlAction === 'abort') {\n try {\n await git.raw(['merge', '--abort']);\n } catch {\n try {\n await git.raw(['rebase', '--abort']);\n } catch {\n // best effort\n }\n }\n await checkoutRefIfNeeded(git, finishState.originalBranch);\n await clearFinishState(git);\n return {\n markdown: `Aborted finish for ${finishState.branchName}.`,\n data: {\n aborted: true,\n state: finishState,\n },\n };\n }\n\n const topic = getTopicDefinition(state, finishState.topic);\n const result = await executeFinishStages(repoPath, git, state, topic, finishState, {});\n return {\n markdown: result.completed\n ? `Resumed and completed finish for ${finishState.branchName}.`\n : `Finish for ${finishState.branchName} is still blocked at ${result.state?.stage}.`,\n data: result,\n };\n}\n\nasync function runTopicOperation(\n repoPath: string,\n git: GitClient,\n state: FlowConfigState,\n topicAction: FlowTopicAction,\n topic: FlowTopicDefinition,\n options: FlowOptions,\n): Promise<FlowActionResult> {\n switch (topicAction) {\n case 'start':\n return startTopic(repoPath, git, state, topic, options);\n case 'list':\n return listTopic(git, topic, options);\n case 'publish':\n return publishTopic(repoPath, git, state, topic, options);\n case 'checkout':\n return checkoutTopic(git, state, topic, options);\n case 'track':\n return trackTopic(repoPath, git, state, topic, options);\n case 'rename':\n return renameTopic(git, state, topic, options);\n case 'delete':\n return deleteTopic(repoPath, git, state, topic, options);\n case 'update':\n return updateTopic(repoPath, git, state, topic, options);\n case 'finish':\n return finishTopic(repoPath, git, state, topic, options);\n }\n}\n\nexport async function runFlowAction(repoPath: string, options: FlowOptions): Promise<FlowActionResult> {\n const git = getGit(repoPath);\n const normalized = normalizeRequest(options);\n\n if (normalized.operation === 'init') {\n return initializeFlow(git, options);\n }\n\n const state = await getFlowConfigState(git, options);\n\n switch (normalized.operation) {\n case 'overview': {\n const overview = await buildOverview(git, state);\n return {\n markdown: renderOverview(overview),\n data: overview,\n };\n }\n case 'config': {\n if (!normalized.configAction) {\n throw new Error('configAction is required for operation=\"config\".');\n }\n return mutateConfig(git, state, options, normalized.configAction);\n }\n case 'topic': {\n if (!normalized.topicAction) {\n throw new Error('topicAction is required for operation=\"topic\".');\n }\n const topic = getTopicDefinition(state, normalized.topic);\n return runTopicOperation(repoPath, git, state, normalized.topicAction, topic, options);\n }\n case 'control': {\n if (!normalized.controlAction) {\n throw new Error('controlAction is required for operation=\"control\".');\n }\n return continueOrAbort(repoPath, git, state, normalized.controlAction);\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ALLOW_FORCE_PUSH, ALLOW_NO_VERIFY } from '../config.js';\nimport { resolveRepoPath } from '../config.js';\nimport { getGit, toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { runBisectAction, runStashAction, runTagAction } from '../services/advanced.service.js';\nimport {\n checkoutRef,\n createBranch,\n deleteBranch,\n listBranches,\n renameBranch,\n setUpstream,\n} from '../services/branch.service.js';\nimport { getConfig, getContextSummary, searchHistory, setConfig } from '../services/context.service.js';\nimport { getDiff, getDiffSummary, getReflog, getStatus, showRef, blameFile } from '../services/inspect.service.js';\nimport { fetchRemote, listRemotes, manageRemote, pullRemote, pushRemote } from '../services/remote.service.js';\nimport { addFiles, commitChanges, resetChanges, restoreFiles, revertCommit } from '../services/write.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nfunction buildError(error: unknown): { content: Array<{ type: 'text'; text: string }> } {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n}\n\ninterface ParsedCommit {\n readonly hash: string;\n readonly authorName: string;\n readonly authorEmail: string;\n readonly dateIso: string;\n readonly subject: string;\n}\n\nfunction parseLogLine(line: string): ParsedCommit | null {\n const [hash, authorName, authorEmail, dateIso, ...subjectParts] = line.split('\\t');\n if (!hash || !authorName || !authorEmail || !dateIso) {\n return null;\n }\n\n return {\n hash,\n authorName,\n authorEmail,\n dateIso,\n subject: subjectParts.join('\\t'),\n };\n}\n\nexport function registerGroupedTools(server: McpServer): void {\n server.registerTool(\n 'git_status',\n {\n title: 'Git Status Tools',\n description: 'Status and diff tool. Use action=status|diff|diff_main to inspect working tree and branch deltas.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['status', 'diff', 'diff_main']).default('status'),\n mode: z.enum(['unstaged', 'staged', 'refs']).default('unstaged'),\n from_ref: z.string().optional(),\n to_ref: z.string().optional(),\n filtered: z.boolean().default(false),\n base_branch: z.string().default('main'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n mode,\n from_ref,\n to_ref,\n filtered,\n base_branch,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'status' | 'diff' | 'diff_main';\n mode: 'unstaged' | 'staged' | 'refs';\n from_ref?: string;\n to_ref?: string;\n filtered: boolean;\n base_branch: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n\n if (action === 'status') {\n const status = await getStatus(repoPath);\n return {\n content: [{ type: 'text', text: render(status, response_format) }],\n structuredContent: { status },\n };\n }\n\n if (action === 'diff') {\n const [summary, output] = await Promise.all([\n getDiffSummary(repoPath, { mode, fromRef: from_ref, toRef: to_ref, filtered }),\n getDiff(repoPath, { mode, fromRef: from_ref, toRef: to_ref, filtered }),\n ]);\n\n const payload = { summary, output };\n return {\n content: [{ type: 'text', text: render(payload, response_format) }],\n structuredContent: payload,\n };\n }\n\n const git = getGit(repoPath);\n const mergeBase = (await git.raw(['merge-base', 'HEAD', base_branch])).trim();\n const [summary, output] = await Promise.all([\n getDiffSummary(repoPath, { mode: 'refs', fromRef: mergeBase, toRef: 'HEAD', filtered: false }),\n getDiff(repoPath, { mode: 'refs', fromRef: mergeBase, toRef: 'HEAD', filtered: false }),\n ]);\n\n const payload = {\n base_branch,\n merge_base: mergeBase,\n summary,\n output,\n };\n\n return {\n content: [{ type: 'text', text: render(payload, response_format) }],\n structuredContent: payload,\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_history',\n {\n title: 'Git History Tools',\n description: 'History tool. Use action=log|show|reflog|blame|lg|who to inspect commits, refs, and contributors.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['log', 'show', 'reflog', 'blame', 'lg', 'who']).default('log'),\n limit: z.number().int().min(1).max(200).default(30),\n offset: z.number().int().min(0).default(0),\n first_parent: z.boolean().default(false),\n no_merges: z.boolean().default(false),\n all_branches: z.boolean().default(false),\n simplify_merges: z.boolean().default(false),\n order: z.enum(['default', 'topo', 'date', 'author-date']).default('default'),\n revision_range: z.string().optional(),\n pathspecs: z.array(z.string()).optional(),\n author: z.string().optional(),\n grep: z.string().optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n file_path: z.string().optional(),\n ref: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n limit,\n offset,\n first_parent,\n no_merges,\n all_branches,\n simplify_merges,\n order,\n revision_range,\n pathspecs,\n author,\n grep,\n since,\n until,\n file_path,\n ref,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'log' | 'show' | 'reflog' | 'blame' | 'lg' | 'who';\n limit: number;\n offset: number;\n first_parent: boolean;\n no_merges: boolean;\n all_branches: boolean;\n simplify_merges: boolean;\n order: 'default' | 'topo' | 'date' | 'author-date';\n revision_range?: string;\n pathspecs?: string[];\n author?: string;\n grep?: string;\n since?: string;\n until?: string;\n file_path?: string;\n ref?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n\n if (action === 'log') {\n const git = getGit(repoPath);\n const args = [\n 'log',\n '--date=iso-strict',\n `--skip=${offset}`,\n '-n',\n String(limit),\n '--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s',\n ];\n\n if (first_parent) {\n args.push('--first-parent');\n }\n if (no_merges) {\n args.push('--no-merges');\n }\n if (all_branches) {\n args.push('--all');\n }\n if (simplify_merges) {\n args.push('--simplify-merges');\n }\n\n if (order === 'topo') {\n args.push('--topo-order');\n } else if (order === 'date') {\n args.push('--date-order');\n } else if (order === 'author-date') {\n args.push('--author-date-order');\n }\n\n if (author) {\n args.push(`--author=${author}`);\n }\n if (grep) {\n args.push(`--grep=${grep}`);\n }\n if (since) {\n args.push(`--since=${since}`);\n }\n if (until) {\n args.push(`--until=${until}`);\n }\n if (revision_range) {\n args.push(revision_range);\n }\n\n const combinedPathspecs = [...(pathspecs ?? []), ...(file_path ? [file_path] : [])];\n if (combinedPathspecs.length > 0) {\n args.push('--', ...combinedPathspecs);\n }\n\n const rawOutput = await git.raw(args);\n const commits = rawOutput\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .map(parseLogLine)\n .filter((item): item is ParsedCommit => item !== null);\n\n return {\n content: [{ type: 'text', text: render(commits, response_format) }],\n structuredContent: { commits },\n };\n }\n\n if (action === 'show') {\n if (!ref) {\n throw new Error('ref is required for history show.');\n }\n const output = await showRef(repoPath, ref);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { ref, output },\n };\n }\n\n if (action === 'reflog') {\n const output = await getReflog(repoPath, limit);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'blame') {\n if (!file_path) {\n throw new Error('file_path is required for history blame.');\n }\n const output = await blameFile(repoPath, file_path, ref);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { file_path, ref, output },\n };\n }\n\n const git = getGit(repoPath);\n if (action === 'lg') {\n const output = await git.raw(['log', '--oneline', '--graph', '--decorate', '--all', '--abbrev-commit']);\n return {\n content: [{ type: 'text', text: render(output.trim() || 'No commits.', response_format) }],\n structuredContent: { output: output.trim() || 'No commits.' },\n };\n }\n\n const args = ['shortlog', '-s', '-n', '--all', '--no-merges'];\n if (file_path) {\n args.push('--', file_path);\n }\n const output = await git.raw(args);\n return {\n content: [{ type: 'text', text: render(output.trim() || 'No contributors found.', response_format) }],\n structuredContent: {\n file_path: file_path ?? null,\n output: output.trim() || 'No contributors found.',\n },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_commits',\n {\n title: 'Git Commit Tools',\n description: 'Commit-area tool. Use action=add|restore|commit|reset|revert|undo|nuke|wip|unstage|amend.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z\n .enum(['add', 'restore', 'commit', 'reset', 'revert', 'undo', 'nuke', 'wip', 'unstage', 'amend'])\n .default('commit'),\n all: z.boolean().default(false),\n paths: z.array(z.string()).optional(),\n message: z.string().optional(),\n amend: z.boolean().default(false),\n no_edit: z.boolean().default(false),\n sign: z.boolean().default(false),\n signing_key: z.string().optional(),\n no_verify: z.boolean().default(false),\n mode: z.enum(['soft', 'mixed', 'hard']).default('mixed'),\n target: z.string().optional(),\n confirm: z.boolean().default(false),\n staged: z.boolean().default(false),\n worktree: z.boolean().default(true),\n source: z.string().optional(),\n ref: z.string().optional(),\n no_commit: z.boolean().default(false),\n mainline: z.number().int().min(1).optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n all,\n paths,\n message,\n amend,\n no_edit,\n sign,\n signing_key,\n no_verify,\n mode,\n target,\n confirm,\n staged,\n worktree,\n source,\n ref,\n no_commit,\n mainline,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'add' | 'restore' | 'commit' | 'reset' | 'revert' | 'undo' | 'nuke' | 'wip' | 'unstage' | 'amend';\n all: boolean;\n paths?: string[];\n message?: string;\n amend: boolean;\n no_edit: boolean;\n sign: boolean;\n signing_key?: string;\n no_verify: boolean;\n mode: 'soft' | 'mixed' | 'hard';\n target?: string;\n confirm: boolean;\n staged: boolean;\n worktree: boolean;\n source?: string;\n ref?: string;\n no_commit: boolean;\n mainline?: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n\n if (action === 'add') {\n const output = await addFiles(repoPath, { all, paths });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'restore') {\n if (!paths || paths.length === 0) {\n throw new Error('paths are required for commit restore.');\n }\n const output = await restoreFiles(repoPath, {\n paths,\n staged,\n worktree,\n source,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'commit') {\n if (!message) {\n throw new Error('message is required for commit action.');\n }\n const output = await commitChanges(repoPath, {\n message,\n all,\n amend,\n noEdit: no_edit,\n sign,\n signingKey: signing_key,\n noVerify: no_verify,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'reset') {\n if (mode === 'hard' && !confirm) {\n throw new Error('Hard reset requires confirm=true.');\n }\n const output = await resetChanges(repoPath, { mode, target, paths });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'revert') {\n if (!ref) {\n throw new Error('ref is required for revert.');\n }\n const output = await revertCommit(repoPath, {\n ref,\n noCommit: no_commit,\n mainline,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'undo') {\n const output = await resetChanges(repoPath, { mode: 'soft', target: 'HEAD~1' });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'nuke') {\n if (!confirm) {\n throw new Error('nuke requires confirm=true because it performs a hard reset.');\n }\n const output = await resetChanges(repoPath, { mode: 'hard', target: 'HEAD~1' });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'wip') {\n await addFiles(repoPath, { all: true });\n const output = await commitChanges(repoPath, {\n message: 'WIP',\n all: false,\n amend: false,\n noEdit: false,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'unstage') {\n if (!paths || paths.length === 0) {\n throw new Error('paths are required for unstage.');\n }\n const output = await restoreFiles(repoPath, {\n paths,\n staged: true,\n worktree: false,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const output = await commitChanges(repoPath, {\n message: message ?? 'amend',\n all: false,\n amend: true,\n noEdit: true,\n sign,\n signingKey: signing_key,\n noVerify: no_verify,\n });\n\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_branches',\n {\n title: 'Git Branch Tools',\n description:\n 'Branch tool. Use action=list|create|delete|rename|checkout|set_upstream|recent for branch workflows.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['list', 'create', 'delete', 'rename', 'checkout', 'set_upstream', 'recent']).default('list'),\n all: z.boolean().default(false),\n name: z.string().optional(),\n old_name: z.string().optional(),\n new_name: z.string().optional(),\n from_ref: z.string().optional(),\n ref: z.string().optional(),\n create: z.boolean().default(false),\n force: z.boolean().default(false),\n branch: z.string().optional(),\n upstream: z.string().optional(),\n count: z.number().int().min(1).max(100).default(10),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n all,\n name,\n old_name,\n new_name,\n from_ref,\n ref,\n create,\n force,\n branch,\n upstream,\n count,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'list' | 'create' | 'delete' | 'rename' | 'checkout' | 'set_upstream' | 'recent';\n all: boolean;\n name?: string;\n old_name?: string;\n new_name?: string;\n from_ref?: string;\n ref?: string;\n create: boolean;\n force: boolean;\n branch?: string;\n upstream?: string;\n count: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n\n if (action === 'list') {\n const branches = await listBranches(repoPath, all);\n return {\n content: [{ type: 'text', text: render(branches, response_format) }],\n structuredContent: { branches },\n };\n }\n\n if (action === 'create') {\n if (!name) {\n throw new Error('name is required for branch create.');\n }\n const output = await createBranch(repoPath, { name, fromRef: from_ref, checkout: create });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'delete') {\n if (!name) {\n throw new Error('name is required for branch delete.');\n }\n const output = await deleteBranch(repoPath, { name, force });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'rename') {\n if (!old_name || !new_name) {\n throw new Error('old_name and new_name are required for branch rename.');\n }\n const output = await renameBranch(repoPath, old_name, new_name);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'checkout') {\n if (!ref) {\n throw new Error('ref is required for branch checkout.');\n }\n const output = await checkoutRef(repoPath, ref, create);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'set_upstream') {\n if (!branch || !upstream) {\n throw new Error('branch and upstream are required for set_upstream.');\n }\n const output = await setUpstream(repoPath, branch, upstream);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const git = getGit(repoPath);\n const output = await git.raw([\n 'branch',\n '--sort=-committerdate',\n '--format=%(refname:short) (%(committerdate:relative))',\n '--count',\n String(count),\n ]);\n return {\n content: [{ type: 'text', text: render(output.trim() || 'No branches found.', response_format) }],\n structuredContent: { output: output.trim() || 'No branches found.' },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_remotes',\n {\n title: 'Git Remote Tools',\n description: 'Remote tool. Use action=list|manage|fetch|pull|push for network/transport operations.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['list', 'manage', 'fetch', 'pull', 'push']).default('list'),\n remote_action: z.enum(['add', 'remove', 'set-url']).optional(),\n name: z.string().optional(),\n url: z.string().optional(),\n remote: z.string().optional(),\n branch: z.string().optional(),\n refspecs: z.array(z.string()).optional(),\n prune: z.boolean().default(true),\n prune_tags: z.boolean().default(false),\n negotiation_tips: z.array(z.string()).optional(),\n rebase: z.boolean().default(false),\n rebase_mode: z.enum(['default', 'merges', 'interactive']).default('default'),\n ff_only: z.boolean().default(false),\n set_upstream: z.boolean().default(false),\n force_with_lease: z.boolean().default(false),\n force: z.boolean().default(false),\n no_verify: z.boolean().default(false),\n tags: z.boolean().default(false),\n push_options: z.array(z.string()).optional(),\n atomic: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n action,\n remote_action,\n name,\n url,\n remote,\n branch,\n refspecs,\n prune,\n prune_tags,\n negotiation_tips,\n rebase,\n rebase_mode,\n ff_only,\n set_upstream,\n force_with_lease,\n force,\n no_verify,\n tags,\n push_options,\n atomic,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'list' | 'manage' | 'fetch' | 'pull' | 'push';\n remote_action?: 'add' | 'remove' | 'set-url';\n name?: string;\n url?: string;\n remote?: string;\n branch?: string;\n refspecs?: string[];\n prune: boolean;\n prune_tags: boolean;\n negotiation_tips?: string[];\n rebase: boolean;\n rebase_mode: 'default' | 'merges' | 'interactive';\n ff_only: boolean;\n set_upstream: boolean;\n force_with_lease: boolean;\n force: boolean;\n no_verify: boolean;\n tags: boolean;\n push_options?: string[];\n atomic: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const git = getGit(repoPath);\n\n if (action === 'list') {\n const remotes = await listRemotes(repoPath);\n return {\n content: [{ type: 'text', text: render(remotes, response_format) }],\n structuredContent: { remotes },\n };\n }\n\n if (action === 'manage') {\n if (!remote_action || !name) {\n throw new Error('remote_action and name are required for remotes manage.');\n }\n const output = await manageRemote(repoPath, {\n action: remote_action,\n name,\n url,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'fetch') {\n const shouldUseAdvancedFetch =\n (refspecs?.length ?? 0) > 0 || prune_tags || (negotiation_tips?.length ?? 0) > 0;\n\n if (shouldUseAdvancedFetch) {\n const args = ['fetch'];\n if (prune) {\n args.push('--prune');\n }\n if (prune_tags) {\n args.push('--prune-tags');\n }\n for (const tip of negotiation_tips ?? []) {\n args.push('--negotiation-tip', tip);\n }\n if (remote) {\n args.push(remote);\n }\n if (refspecs && refspecs.length > 0) {\n args.push(...refspecs);\n } else if (branch) {\n args.push(branch);\n }\n\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Fetch completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const output = await fetchRemote(repoPath, {\n remote,\n branch,\n prune,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'pull') {\n const shouldUseAdvancedPull = (refspecs?.length ?? 0) > 0 || ff_only || rebase_mode !== 'default';\n\n if (shouldUseAdvancedPull) {\n const args = ['pull'];\n if (rebase) {\n if (rebase_mode === 'merges') {\n args.push('--rebase=merges');\n } else if (rebase_mode === 'interactive') {\n args.push('--rebase=interactive');\n } else {\n args.push('--rebase');\n }\n }\n if (ff_only) {\n args.push('--ff-only');\n }\n if (remote) {\n args.push(remote);\n }\n if (refspecs && refspecs.length > 0) {\n args.push(...refspecs);\n } else if (branch) {\n args.push(branch);\n }\n\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Pull completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const output = await pullRemote(repoPath, {\n remote,\n branch,\n rebase,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const shouldUseAdvancedPush = (refspecs?.length ?? 0) > 0 || (push_options?.length ?? 0) > 0 || atomic;\n\n if (force && !ALLOW_FORCE_PUSH) {\n throw new Error(\n 'force push is disabled on this server. Set GIT_ALLOW_FORCE_PUSH=true to enable it. ' +\n 'Consider using force_with_lease instead for a safer alternative.',\n );\n }\n\n if (no_verify && !ALLOW_NO_VERIFY) {\n throw new Error(\n 'no_verify is disabled on this server. Set GIT_ALLOW_NO_VERIFY=true to permit bypassing git hooks.',\n );\n }\n\n if (shouldUseAdvancedPush) {\n const args = ['push'];\n if (set_upstream) {\n args.push('--set-upstream');\n }\n if (force_with_lease) {\n args.push('--force-with-lease');\n }\n if (force) {\n args.push('--force');\n }\n if (tags) {\n args.push('--tags');\n }\n if (no_verify) {\n args.push('--no-verify');\n }\n if (atomic) {\n args.push('--atomic');\n }\n for (const option of push_options ?? []) {\n args.push(`--push-option=${option}`);\n }\n if (remote) {\n args.push(remote);\n }\n if (refspecs && refspecs.length > 0) {\n args.push(...refspecs);\n } else if (branch) {\n args.push(branch);\n }\n\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Push completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const output = await pushRemote(repoPath, {\n remote,\n branch,\n setUpstream: set_upstream,\n forceWithLease: force_with_lease,\n force,\n noVerify: no_verify,\n tags,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_workspace',\n {\n title: 'Git Workspace Tools',\n description:\n 'Workspace tool for stash/rebase/cherry-pick/merge/bisect/tag/worktree/submodule actions plus stash_all shortcut.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z\n .enum(['stash', 'stash_all', 'rebase', 'cherry_pick', 'merge', 'bisect', 'tag', 'worktree', 'submodule'])\n .default('stash'),\n stash_action: z.enum(['save', 'list', 'apply', 'pop', 'drop']).optional(),\n message: z.string().optional(),\n index: z.number().int().min(0).optional(),\n include_untracked: z.boolean().default(false),\n rebase_action: z.enum(['start', 'continue', 'abort', 'skip']).optional(),\n rebase_interactive: z.boolean().default(false),\n rebase_autosquash: z.boolean().default(false),\n rebase_merges: z.boolean().default(false),\n rebase_onto: z.string().optional(),\n rebase_upstream: z.string().optional(),\n rebase_branch: z.string().optional(),\n cherry_pick_action: z.enum(['start', 'continue', 'abort']).optional(),\n cherry_pick_refs: z.array(z.string()).optional(),\n cherry_pick_mainline: z.number().int().min(1).optional(),\n cherry_pick_record_origin: z.boolean().default(false),\n cherry_pick_no_commit: z.boolean().default(false),\n cherry_pick_strategy: z.string().optional(),\n cherry_pick_strategy_options: z.array(z.string()).optional(),\n merge_action: z.enum(['start', 'continue', 'abort']).optional(),\n merge_refs: z.array(z.string()).optional(),\n merge_no_ff: z.boolean().default(false),\n merge_ff_only: z.boolean().default(false),\n merge_squash: z.boolean().default(false),\n merge_no_commit: z.boolean().default(false),\n merge_log: z.boolean().default(false),\n merge_strategy: z.string().optional(),\n merge_strategy_options: z.array(z.string()).optional(),\n conflict_style: z.enum(['merge', 'diff3', 'zdiff3']).optional(),\n bisect_action: z.enum(['start', 'good', 'bad', 'skip', 'run', 'reset']).optional(),\n tag_action: z.enum(['list', 'create', 'delete']).optional(),\n worktree_action: z.enum(['add', 'list', 'remove', 'lock', 'unlock', 'prune', 'repair']).optional(),\n submodule_action: z.enum(['add', 'list', 'update', 'sync', 'foreach', 'set_branch']).optional(),\n ref: z.string().optional(),\n onto: z.string().optional(),\n good_ref: z.string().optional(),\n bad_ref: z.string().optional(),\n command: z.string().optional(),\n name: z.string().optional(),\n target: z.string().optional(),\n sign: z.boolean().default(false),\n signing_key: z.string().optional(),\n path: z.string().optional(),\n paths: z.array(z.string()).optional(),\n branch: z.string().optional(),\n url: z.string().optional(),\n recursive: z.boolean().default(true),\n worktree_force: z.boolean().default(false),\n worktree_detached: z.boolean().default(false),\n worktree_lock_reason: z.string().optional(),\n worktree_expire: z.string().optional(),\n submodule_remote: z.boolean().default(false),\n submodule_depth: z.number().int().min(1).optional(),\n submodule_jobs: z.number().int().min(1).optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n stash_action,\n message,\n index,\n include_untracked,\n rebase_action,\n rebase_interactive,\n rebase_autosquash,\n rebase_merges,\n rebase_onto,\n rebase_upstream,\n rebase_branch,\n cherry_pick_action,\n cherry_pick_refs,\n cherry_pick_mainline,\n cherry_pick_record_origin,\n cherry_pick_no_commit,\n cherry_pick_strategy,\n cherry_pick_strategy_options,\n merge_action,\n merge_refs,\n merge_no_ff,\n merge_ff_only,\n merge_squash,\n merge_no_commit,\n merge_log,\n merge_strategy,\n merge_strategy_options,\n conflict_style,\n bisect_action,\n tag_action,\n worktree_action,\n submodule_action,\n ref,\n onto,\n good_ref,\n bad_ref,\n command,\n name,\n target,\n sign,\n signing_key,\n path,\n paths,\n branch,\n url,\n recursive,\n worktree_force,\n worktree_detached,\n worktree_lock_reason,\n worktree_expire,\n submodule_remote,\n submodule_depth,\n submodule_jobs,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'stash' | 'stash_all' | 'rebase' | 'cherry_pick' | 'merge' | 'bisect' | 'tag' | 'worktree' | 'submodule';\n stash_action?: 'save' | 'list' | 'apply' | 'pop' | 'drop';\n message?: string;\n index?: number;\n include_untracked: boolean;\n rebase_action?: 'start' | 'continue' | 'abort' | 'skip';\n rebase_interactive: boolean;\n rebase_autosquash: boolean;\n rebase_merges: boolean;\n rebase_onto?: string;\n rebase_upstream?: string;\n rebase_branch?: string;\n cherry_pick_action?: 'start' | 'continue' | 'abort';\n cherry_pick_refs?: string[];\n cherry_pick_mainline?: number;\n cherry_pick_record_origin: boolean;\n cherry_pick_no_commit: boolean;\n cherry_pick_strategy?: string;\n cherry_pick_strategy_options?: string[];\n merge_action?: 'start' | 'continue' | 'abort';\n merge_refs?: string[];\n merge_no_ff: boolean;\n merge_ff_only: boolean;\n merge_squash: boolean;\n merge_no_commit: boolean;\n merge_log: boolean;\n merge_strategy?: string;\n merge_strategy_options?: string[];\n conflict_style?: 'merge' | 'diff3' | 'zdiff3';\n bisect_action?: 'start' | 'good' | 'bad' | 'skip' | 'run' | 'reset';\n tag_action?: 'list' | 'create' | 'delete';\n worktree_action?: 'add' | 'list' | 'remove' | 'lock' | 'unlock' | 'prune' | 'repair';\n submodule_action?: 'add' | 'list' | 'update' | 'sync' | 'foreach' | 'set_branch';\n ref?: string;\n onto?: string;\n good_ref?: string;\n bad_ref?: string;\n command?: string;\n name?: string;\n target?: string;\n sign: boolean;\n signing_key?: string;\n path?: string;\n paths?: string[];\n branch?: string;\n url?: string;\n recursive: boolean;\n worktree_force: boolean;\n worktree_detached: boolean;\n worktree_lock_reason?: string;\n worktree_expire?: string;\n submodule_remote: boolean;\n submodule_depth?: number;\n submodule_jobs?: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const git = getGit(repoPath);\n\n if (action === 'stash') {\n const output = await runStashAction(repoPath, {\n action: stash_action ?? 'list',\n message,\n index,\n includeUntracked: include_untracked,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'stash_all') {\n const output = await runStashAction(repoPath, {\n action: 'save',\n includeUntracked: true,\n message,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'rebase') {\n const op = rebase_action ?? 'start';\n const args = ['rebase'];\n\n if (op === 'continue') {\n args.push('--continue');\n } else if (op === 'abort') {\n args.push('--abort');\n } else if (op === 'skip') {\n args.push('--skip');\n } else {\n if (rebase_interactive) {\n args.push('-i');\n }\n if (rebase_autosquash) {\n args.push('--autosquash');\n }\n if (rebase_merges) {\n args.push('--rebase-merges');\n }\n\n const resolvedOnto = rebase_onto ?? onto;\n if (resolvedOnto) {\n args.push('--onto', resolvedOnto);\n }\n\n const upstreamRef = rebase_upstream ?? onto;\n if (!upstreamRef) {\n throw new Error('rebase_upstream (or onto) is required for rebase start.');\n }\n args.push(upstreamRef);\n\n if (rebase_branch) {\n args.push(rebase_branch);\n }\n }\n\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Rebase completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'cherry_pick') {\n const op = cherry_pick_action ?? 'start';\n const args = ['cherry-pick'];\n\n if (op === 'continue') {\n args.push('--continue');\n } else if (op === 'abort') {\n args.push('--abort');\n } else {\n if (cherry_pick_mainline !== undefined) {\n args.push('--mainline', String(cherry_pick_mainline));\n }\n if (cherry_pick_record_origin) {\n args.push('-x');\n }\n if (cherry_pick_no_commit) {\n args.push('--no-commit');\n }\n if (cherry_pick_strategy) {\n args.push('--strategy', cherry_pick_strategy);\n }\n for (const strategyOption of cherry_pick_strategy_options ?? []) {\n args.push('--strategy-option', strategyOption);\n }\n\n const refs = cherry_pick_refs ?? (ref ? [ref] : []);\n if (refs.length === 0) {\n throw new Error('ref or cherry_pick_refs is required for cherry_pick start.');\n }\n args.push(...refs);\n }\n\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Cherry-pick completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'merge') {\n const op = merge_action ?? 'start';\n const args = ['merge'];\n\n if (op === 'continue') {\n args.push('--continue');\n } else if (op === 'abort') {\n args.push('--abort');\n } else {\n if (merge_no_ff) {\n args.push('--no-ff');\n }\n if (merge_ff_only) {\n args.push('--ff-only');\n }\n if (merge_squash) {\n args.push('--squash');\n }\n if (merge_no_commit) {\n args.push('--no-commit');\n }\n if (merge_log) {\n args.push('--log');\n }\n if (merge_strategy) {\n args.push('--strategy', merge_strategy);\n }\n if (conflict_style) {\n args.push(`--conflict=${conflict_style}`);\n }\n for (const strategyOption of merge_strategy_options ?? []) {\n args.push('--strategy-option', strategyOption);\n }\n\n const refs = merge_refs ?? (ref ? [ref] : []);\n if (refs.length === 0) {\n throw new Error('ref or merge_refs is required for merge start.');\n }\n args.push(...refs);\n }\n\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Merge completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'bisect') {\n const output = await runBisectAction(repoPath, {\n action: bisect_action ?? 'start',\n ref,\n goodRef: good_ref,\n badRef: bad_ref,\n command,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'tag') {\n const output = await runTagAction(repoPath, {\n action: tag_action ?? 'list',\n name,\n target,\n message,\n sign,\n signingKey: signing_key,\n });\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'worktree') {\n const op = worktree_action ?? 'list';\n\n if (op === 'list') {\n const rawOutput = await git.raw(['worktree', 'list', '--porcelain']);\n const output = rawOutput.trim() || 'No worktrees.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (op === 'remove') {\n if (!path) {\n throw new Error('path is required for worktree remove.');\n }\n const args = ['worktree', 'remove'];\n if (worktree_force) {\n args.push('--force');\n }\n args.push(path);\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || `Removed worktree ${path}.`;\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (op === 'lock' || op === 'unlock') {\n if (!path) {\n throw new Error('path is required for worktree lock/unlock.');\n }\n const args = ['worktree', op, path];\n if (op === 'lock' && worktree_lock_reason) {\n args.push('--reason', worktree_lock_reason);\n }\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || `Worktree ${op} completed for ${path}.`;\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (op === 'prune') {\n const args = ['worktree', 'prune'];\n if (worktree_expire) {\n args.push(`--expire=${worktree_expire}`);\n }\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Worktree prune completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (op === 'repair') {\n const args = ['worktree', 'repair'];\n if (paths && paths.length > 0) {\n args.push(...paths);\n }\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Worktree repair completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (!path) {\n throw new Error('path is required for worktree add.');\n }\n\n const args = ['worktree', 'add'];\n if (worktree_force) {\n args.push('--force');\n }\n if (worktree_detached) {\n args.push('--detach');\n }\n if (worktree_lock_reason) {\n args.push('--lock', '--reason', worktree_lock_reason);\n }\n args.push(path);\n if (branch) {\n args.push(branch);\n } else if (!worktree_detached) {\n throw new Error('branch is required for worktree add unless worktree_detached=true.');\n }\n\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || `Added worktree at ${path}.`;\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const submoduleOp = submodule_action ?? 'list';\n\n if (submoduleOp === 'list') {\n const rawOutput = await git.raw(['submodule', 'status']);\n const output = rawOutput.trim() || 'No submodules.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (submoduleOp === 'sync') {\n const args = ['submodule', 'sync'];\n if (recursive) {\n args.push('--recursive');\n }\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Submodule sync complete.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (submoduleOp === 'update') {\n const args = ['submodule', 'update', '--init'];\n if (recursive) {\n args.push('--recursive');\n }\n if (submodule_remote) {\n args.push('--remote');\n }\n if (submodule_depth !== undefined) {\n args.push('--depth', String(submodule_depth));\n }\n if (submodule_jobs !== undefined) {\n args.push('--jobs', String(submodule_jobs));\n }\n if (paths && paths.length > 0) {\n args.push('--', ...paths);\n }\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Submodule update complete.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (submoduleOp === 'foreach') {\n if (!command) {\n throw new Error('command is required for submodule foreach.');\n }\n const args = ['submodule', 'foreach'];\n if (recursive) {\n args.push('--recursive');\n }\n args.push(command);\n const rawOutput = await git.raw(args);\n const output = rawOutput.trim() || 'Submodule foreach completed.';\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (submoduleOp === 'set_branch') {\n if (!branch || !path) {\n throw new Error('branch and path are required for submodule set_branch.');\n }\n const rawOutput = await git.raw(['submodule', 'set-branch', '--branch', branch, '--', path]);\n const output = rawOutput.trim() || `Set submodule ${path} branch to ${branch}.`;\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (!url || !path) {\n throw new Error('url and path are required for submodule add.');\n }\n\n const rawOutput = await git.raw(['submodule', 'add', url, path]);\n const output = rawOutput.trim() || `Added submodule ${path}.`;\n\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_context',\n {\n title: 'Git Context Tools',\n description:\n 'Context/config tool. Use action=summary|search|get_config|set_config|aliases for repo context operations.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['summary', 'search', 'get_config', 'set_config', 'aliases']).default('summary'),\n query: z.string().optional(),\n limit: z.number().int().min(1).max(200).default(20),\n key: z.string().optional(),\n value: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n query,\n limit,\n key,\n value,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'summary' | 'search' | 'get_config' | 'set_config' | 'aliases';\n query?: string;\n limit: number;\n key?: string;\n value?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n\n if (action === 'summary') {\n const summary = await getContextSummary(repoPath);\n return {\n content: [{ type: 'text', text: render(summary, response_format) }],\n structuredContent: { summary },\n };\n }\n\n if (action === 'search') {\n if (!query) {\n throw new Error('query is required for context search.');\n }\n const output = await searchHistory(repoPath, query, limit);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'get_config') {\n const output = await getConfig(repoPath, key);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n if (action === 'set_config') {\n if (!key || value === undefined) {\n throw new Error('key and value are required for context set_config.');\n }\n const output = await setConfig(repoPath, key, value);\n return {\n content: [{ type: 'text', text: render(output, response_format) }],\n structuredContent: { output },\n };\n }\n\n const git = getGit(repoPath);\n const output = await git.raw(['config', '--get-regexp', '^alias\\\\.']).catch(() => '');\n return {\n content: [{ type: 'text', text: render(output.trim() || 'No aliases configured.', response_format) }],\n structuredContent: { output: output.trim() || 'No aliases configured.' },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n}\n","import { AUTO_SIGN_TAGS, DEFAULT_SIGNING_KEY } from '../config.js';\nimport { getGit } from '../git/client.js';\n\nexport interface StashActionOptions {\n readonly action: 'save' | 'list' | 'apply' | 'pop' | 'drop';\n readonly message?: string;\n readonly index?: number;\n readonly includeUntracked?: boolean;\n}\n\nexport interface RebaseActionOptions {\n readonly action: 'start' | 'continue' | 'abort' | 'skip';\n readonly onto?: string;\n}\n\nexport interface CherryPickActionOptions {\n readonly action: 'start' | 'continue' | 'abort';\n readonly ref?: string;\n}\n\nexport interface BisectActionOptions {\n readonly action: 'start' | 'good' | 'bad' | 'skip' | 'run' | 'reset';\n readonly ref?: string;\n readonly goodRef?: string;\n readonly badRef?: string;\n readonly command?: string;\n}\n\nexport interface TagActionOptions {\n readonly action: 'list' | 'create' | 'delete';\n readonly name?: string;\n readonly target?: string;\n readonly message?: string;\n /** Sign the tag. Defaults to AUTO_SIGN_TAGS server config. */\n readonly sign?: boolean;\n /** Signing key to use. Falls back to DEFAULT_SIGNING_KEY, then git's user.signingkey. */\n readonly signingKey?: string;\n}\n\nexport interface WorktreeActionOptions {\n readonly action: 'add' | 'list' | 'remove';\n readonly path?: string;\n readonly branch?: string;\n}\n\nexport interface SubmoduleActionOptions {\n readonly action: 'add' | 'list' | 'update' | 'sync';\n readonly url?: string;\n readonly path?: string;\n readonly recursive?: boolean;\n}\n\nexport async function runStashAction(repoPath: string, options: StashActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'save') {\n const args = ['stash', 'push'];\n if (options.includeUntracked) {\n args.push('--include-untracked');\n }\n if (options.message) {\n args.push('-m', options.message);\n }\n const output = await git.raw(args);\n return output.trim() || 'Stash saved.';\n }\n\n if (options.action === 'list') {\n const output = await git.raw(['stash', 'list']);\n return output.trim() || 'No stashes.';\n }\n\n const index = options.index ?? 0;\n if (options.action === 'apply') {\n const output = await git.raw(['stash', 'apply', `stash@{${index}}`]);\n return output.trim() || `Applied stash@{${index}}.`;\n }\n\n if (options.action === 'pop') {\n const output = await git.raw(['stash', 'pop', `stash@{${index}}`]);\n return output.trim() || `Popped stash@{${index}}.`;\n }\n\n const output = await git.raw(['stash', 'drop', `stash@{${index}}`]);\n return output.trim() || `Dropped stash@{${index}}.`;\n}\n\nexport async function runRebaseAction(repoPath: string, options: RebaseActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'continue') {\n const output = await git.raw(['rebase', '--continue']);\n return output.trim() || 'Rebase continued.';\n }\n\n if (options.action === 'abort') {\n const output = await git.raw(['rebase', '--abort']);\n return output.trim() || 'Rebase aborted.';\n }\n\n if (options.action === 'skip') {\n const output = await git.raw(['rebase', '--skip']);\n return output.trim() || 'Rebase skipped current commit.';\n }\n\n if (!options.onto) {\n throw new Error('onto is required for rebase start.');\n }\n\n const output = await git.raw(['rebase', options.onto]);\n return output.trim() || `Rebase started onto ${options.onto}.`;\n}\n\nexport async function runCherryPickAction(repoPath: string, options: CherryPickActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'continue') {\n const output = await git.raw(['cherry-pick', '--continue']);\n return output.trim() || 'Cherry-pick continued.';\n }\n\n if (options.action === 'abort') {\n const output = await git.raw(['cherry-pick', '--abort']);\n return output.trim() || 'Cherry-pick aborted.';\n }\n\n if (!options.ref) {\n throw new Error('ref is required when cherry-pick action is start.');\n }\n\n const output = await git.raw(['cherry-pick', options.ref]);\n return output.trim() || `Cherry-picked ${options.ref}.`;\n}\n\nexport async function runBisectAction(repoPath: string, options: BisectActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n switch (options.action) {\n case 'start': {\n if (!options.badRef || !options.goodRef) {\n throw new Error('goodRef and badRef are required for bisect start.');\n }\n await git.raw(['bisect', 'start']);\n await git.raw(['bisect', 'bad', options.badRef]);\n await git.raw(['bisect', 'good', options.goodRef]);\n return `Bisect started between good=${options.goodRef} and bad=${options.badRef}.`;\n }\n case 'good': {\n const output = await git.raw(['bisect', 'good', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Marked current commit as good.';\n }\n case 'bad': {\n const output = await git.raw(['bisect', 'bad', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Marked current commit as bad.';\n }\n case 'skip': {\n const output = await git.raw(['bisect', 'skip', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Skipped current bisect commit.';\n }\n case 'run': {\n if (!options.command) {\n throw new Error('command is required for bisect run.');\n }\n const output = await git.raw(['bisect', 'run', 'sh', '-lc', options.command]);\n return output.trim() || 'Bisect run completed.';\n }\n case 'reset': {\n const output = await git.raw(['bisect', 'reset']);\n return output.trim() || 'Bisect reset.';\n }\n }\n}\n\nexport async function runTagAction(repoPath: string, options: TagActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.tags();\n return output.all.join('\\n') || 'No tags.';\n }\n\n if (options.action === 'delete') {\n if (!options.name) {\n throw new Error('name is required for delete action.');\n }\n await git.tag(['-d', options.name]);\n return `Deleted tag ${options.name}.`;\n }\n\n if (!options.name) {\n throw new Error('name is required for create action.');\n }\n\n const shouldSign = options.sign ?? AUTO_SIGN_TAGS;\n\n if (shouldSign) {\n const key = options.signingKey ?? DEFAULT_SIGNING_KEY;\n const signFlag = key ? ['-u', key] : ['-s'];\n const msgFlag = options.message ? ['-m', options.message] : ['-m', options.name];\n const targetArg = options.target ? [options.target] : [];\n await git.raw(['tag', ...signFlag, ...msgFlag, options.name, ...targetArg]);\n return `Created signed tag ${options.name}.`;\n }\n\n if (options.message) {\n await git.addAnnotatedTag(options.name, options.message);\n return `Created annotated tag ${options.name}.`;\n }\n\n // Only pass the tag name (string) to addTag\n await git.addTag(options.name);\n return `Created tag ${options.name}.`;\n}\n\nexport async function runWorktreeAction(repoPath: string, options: WorktreeActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.raw(['worktree', 'list', '--porcelain']);\n return output.trim();\n }\n\n if (options.action === 'remove') {\n if (!options.path) {\n throw new Error('path is required for worktree remove.');\n }\n await git.raw(['worktree', 'remove', options.path]);\n return `Removed worktree ${options.path}.`;\n }\n\n if (!options.path || !options.branch) {\n throw new Error('path and branch are required for worktree add.');\n }\n\n await git.raw(['worktree', 'add', options.path, options.branch]);\n return `Added worktree at ${options.path} for ${options.branch}.`;\n}\n\nexport async function runSubmoduleAction(repoPath: string, options: SubmoduleActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.raw(['submodule', 'status']);\n return output.trim() || 'No submodules.';\n }\n\n if (options.action === 'sync') {\n const args = ['submodule', 'sync'];\n if (options.recursive) {\n args.push('--recursive');\n }\n const output = await git.raw(args);\n return output.trim() || 'Submodule sync complete.';\n }\n\n if (options.action === 'update') {\n const args = ['submodule', 'update', '--init'];\n if (options.recursive) {\n args.push('--recursive');\n }\n const output = await git.raw(args);\n return output.trim() || 'Submodule update complete.';\n }\n\n if (!options.url || !options.path) {\n throw new Error('url and path are required for submodule add.');\n }\n\n await git.raw(['submodule', 'add', options.url, options.path]);\n return `Added submodule ${options.path}.`;\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { CHARACTER_LIMIT } from '../constants.js';\nimport { getGit } from '../git/client.js';\nimport { getLog, getStatus } from './inspect.service.js';\n\nexport interface ContextSummary {\n readonly branch: string;\n readonly ahead: number;\n readonly behind: number;\n readonly isClean: boolean;\n readonly changedFiles: number;\n readonly recentCommits: Array<{ hash: string; subject: string; dateIso: string }>;\n readonly remotes: string[];\n readonly inProgress: {\n rebasing: boolean;\n merging: boolean;\n cherryPicking: boolean;\n bisecting: boolean;\n };\n}\n\nexport async function getContextSummary(repoPath: string): Promise<ContextSummary> {\n const git = getGit(repoPath);\n const [status, commits, remotesRaw, gitDir] = await Promise.all([\n getStatus(repoPath),\n getLog(repoPath, { limit: 5, offset: 0 }),\n git.getRemotes(false),\n git.raw(['rev-parse', '--absolute-git-dir']).then(s => s.trim()),\n ]);\n\n const rebasing = existsSync(path.join(gitDir, 'rebase-merge')) || existsSync(path.join(gitDir, 'rebase-apply'));\n const merging = existsSync(path.join(gitDir, 'MERGE_HEAD'));\n const cherryPicking = existsSync(path.join(gitDir, 'CHERRY_PICK_HEAD'));\n const bisecting = existsSync(path.join(gitDir, 'BISECT_LOG'));\n\n return {\n branch: status.current,\n ahead: status.ahead,\n behind: status.behind,\n isClean: status.isClean,\n changedFiles: status.files.length,\n recentCommits: commits.map(commit => ({\n hash: commit.hash,\n subject: commit.subject,\n dateIso: commit.dateIso,\n })),\n remotes: remotesRaw.map(remote => remote.name),\n inProgress: {\n rebasing,\n merging,\n cherryPicking,\n bisecting,\n },\n };\n}\n\nexport async function searchHistory(repoPath: string, query: string, limit: number): Promise<string> {\n const git = getGit(repoPath);\n\n const [pickaxe, grep] = await Promise.all([\n git.raw(['log', '-S', query, '--oneline', '-n', String(limit)]),\n git.raw(['grep', '-n', '-m', String(limit), '--', query]).catch(() => ''),\n ]);\n\n const sections = [\n '## Pickaxe (-S)',\n pickaxe.trim() || 'No history matches.',\n '',\n '## grep',\n grep.trim() || 'No working-tree matches.',\n ];\n\n const combined = sections.join('\\n');\n return combined.length > CHARACTER_LIMIT\n ? `${combined.slice(0, CHARACTER_LIMIT)}\\n\\n[Output truncated at ${CHARACTER_LIMIT} characters]`\n : combined;\n}\n\nconst BLOCKED_CONFIG_KEY_PATTERNS: readonly RegExp[] = [/^credential\\./i, /^url\\./i];\n\nconst SENSITIVE_KEY_PATTERNS: readonly RegExp[] = [/(password|token|secret|auth|passphrase)/i];\n\nfunction isBlockedConfigKey(key: string): boolean {\n return BLOCKED_CONFIG_KEY_PATTERNS.some(p => p.test(key));\n}\n\nfunction redactConfigValue(key: string, value: string): string {\n if (SENSITIVE_KEY_PATTERNS.some(p => p.test(key))) {\n return '***';\n }\n // Redact credentials embedded in URLs: https://user:pass@host → https://***@host\n const stripped = value.replace(/(https?:\\/\\/)[^@\\s]+@/g, '$1***@');\n // Redact long hex strings that look like access tokens (not normal in config values)\n if (/\\b[0-9a-f]{40,}\\b/i.test(stripped)) {\n return '***';\n }\n return stripped;\n}\n\nexport async function getConfig(repoPath: string, key?: string): Promise<string> {\n const git = getGit(repoPath);\n\n if (key) {\n if (isBlockedConfigKey(key)) {\n throw new Error(`Access to git config key '${key}' is not permitted.`);\n }\n const value = await git.raw(['config', '--get', key]);\n return redactConfigValue(key, value.trim());\n }\n\n const output = await git.raw(['config', '--list']);\n const lines = output\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .flatMap(line => {\n const eq = line.indexOf('=');\n if (eq === -1) return [];\n const k = line.slice(0, eq);\n const v = line.slice(eq + 1);\n if (isBlockedConfigKey(k)) return [];\n return [`${k}=${redactConfigValue(k, v)}`];\n });\n\n return lines.join('\\n').trim();\n}\n\nexport async function setConfig(repoPath: string, key: string, value: string): Promise<string> {\n const git = getGit(repoPath);\n await git.raw(['config', key, value]);\n return `Set ${key}.`;\n}\n","import { ALLOW_FORCE_PUSH, ALLOW_NO_VERIFY } from '../config.js';\nimport { getGit } from '../git/client.js';\nimport type { RemoteInfo } from '../types.js';\n\nexport interface ManageRemoteOptions {\n readonly action: 'add' | 'remove' | 'set-url';\n readonly name: string;\n readonly url?: string;\n}\n\nexport interface FetchOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly prune: boolean;\n}\n\nexport interface PullOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly rebase: boolean;\n}\n\nexport interface PushOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly setUpstream: boolean;\n readonly forceWithLease: boolean;\n /** Hard force push. Requires ALLOW_FORCE_PUSH=true. Only use when you know what you are doing. */\n readonly force?: boolean;\n /** Pass --no-verify to bypass pre-push hooks. Requires ALLOW_NO_VERIFY=true. */\n readonly noVerify?: boolean;\n readonly tags: boolean;\n}\n\nfunction sanitizeRemoteUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n if (!parsed.username && !parsed.password) return url;\n parsed.username = '';\n parsed.password = '';\n return parsed.toString();\n } catch {\n // SCP-style URLs (e.g. git@github.com:org/repo.git) are not parseable by URL\n return url;\n }\n}\n\nexport async function listRemotes(repoPath: string): Promise<RemoteInfo[]> {\n const git = getGit(repoPath);\n const remotes = await git.getRemotes(true);\n\n return remotes.map(remote => ({\n name: remote.name,\n fetchUrl: sanitizeRemoteUrl(remote.refs.fetch),\n pushUrl: sanitizeRemoteUrl(remote.refs.push),\n }));\n}\n\nexport async function manageRemote(repoPath: string, options: ManageRemoteOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'add') {\n if (!options.url) {\n throw new Error(\"url is required for action='add'\");\n }\n await git.addRemote(options.name, options.url);\n return `Added remote ${options.name}.`;\n }\n\n if (options.action === 'remove') {\n await git.removeRemote(options.name);\n return `Removed remote ${options.name}.`;\n }\n\n if (!options.url) {\n throw new Error(\"url is required for action='set-url'\");\n }\n\n await git.remote(['set-url', options.name, options.url]);\n return `Updated remote ${options.name} URL.`;\n}\n\nexport async function fetchRemote(repoPath: string, options: FetchOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const args: string[] = [];\n if (options.prune) {\n args.push('--prune');\n }\n\n // Only pass remote and branch if they are defined, otherwise use overloads\n if (options.remote && options.branch) {\n await git.fetch(options.remote, options.branch, args);\n return `Fetched ${options.remote}/${options.branch}.`;\n } else if (options.remote) {\n await git.fetch(options.remote, args);\n return `Fetched ${options.remote}.`;\n } else {\n await git.fetch(args);\n return 'Fetched default remote.';\n }\n}\n\nexport async function pullRemote(repoPath: string, options: PullOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const pullOptions: string[] = [];\n if (options.rebase) {\n pullOptions.push('--rebase');\n }\n\n await git.pull(options.remote, options.branch, pullOptions);\n return `Pulled ${options.remote ?? 'tracking remote'}${options.branch ? `/${options.branch}` : ''}${options.rebase ? ' with rebase' : ''}.`;\n}\n\nexport async function pushRemote(repoPath: string, options: PushOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.noVerify && !ALLOW_NO_VERIFY) {\n throw new Error(\n 'no_verify is disabled on this server. Set GIT_ALLOW_NO_VERIFY=true to permit bypassing git hooks.',\n );\n }\n\n if (options.force && !ALLOW_FORCE_PUSH) {\n throw new Error(\n 'force push is disabled on this server. Set GIT_ALLOW_FORCE_PUSH=true to enable it. ' +\n 'Consider using force_with_lease instead for a safer alternative.',\n );\n }\n\n const pushOptions: string[] = [];\n if (options.setUpstream) {\n pushOptions.push('--set-upstream');\n }\n\n if (options.forceWithLease) {\n pushOptions.push('--force-with-lease');\n }\n\n if (options.force) {\n pushOptions.push('--force');\n }\n\n if (options.tags) {\n pushOptions.push('--tags');\n }\n\n if (options.noVerify) {\n pushOptions.push('--no-verify');\n }\n\n await git.push(options.remote, options.branch, pushOptions);\n return `Pushed ${options.remote ?? 'tracking remote'}${options.branch ? `/${options.branch}` : ''}.`;\n}\n","import { ALLOW_NO_VERIFY, AUTO_SIGN_COMMITS, DEFAULT_SIGNING_KEY } from '../config.js';\nimport { getGit } from '../git/client.js';\n\nexport interface GitAddOptions {\n readonly all?: boolean;\n readonly paths?: string[];\n}\n\nexport interface GitRestoreOptions {\n readonly paths: string[];\n readonly staged: boolean;\n readonly worktree: boolean;\n readonly source?: string;\n}\n\nexport interface GitCommitOptions {\n readonly message: string;\n readonly all: boolean;\n readonly amend: boolean;\n readonly noEdit: boolean;\n /** Sign the commit. Defaults to AUTO_SIGN_COMMITS server config. */\n readonly sign?: boolean;\n /** Signing key to use. Falls back to DEFAULT_SIGNING_KEY, then git's user.signingkey. */\n readonly signingKey?: string;\n /** Pass --no-verify to bypass pre-commit/commit-msg hooks. Requires ALLOW_NO_VERIFY=true. */\n readonly noVerify?: boolean;\n}\n\nexport interface GitResetOptions {\n readonly mode: 'soft' | 'mixed' | 'hard';\n readonly target?: string;\n readonly paths?: string[];\n}\n\nexport interface GitRevertOptions {\n readonly ref: string;\n readonly noCommit: boolean;\n readonly mainline?: number;\n}\n\nexport async function addFiles(repoPath: string, options: GitAddOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.all) {\n await git.add('.');\n return 'Staged all changes.';\n }\n\n const paths = options.paths ?? [];\n if (paths.length === 0) {\n throw new Error('Provide paths or set all=true.');\n }\n\n await git.add(paths);\n return `Staged ${paths.length} path(s).`;\n}\n\nexport async function restoreFiles(repoPath: string, options: GitRestoreOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (!options.staged && !options.worktree) {\n throw new Error('At least one of staged/worktree must be true.');\n }\n\n const args = ['restore'];\n\n if (options.staged) {\n args.push('--staged');\n }\n\n if (options.worktree) {\n args.push('--worktree');\n }\n\n if (options.source) {\n args.push('--source', options.source);\n }\n\n args.push('--', ...options.paths);\n\n await git.raw(args);\n return `Restored ${options.paths.length} path(s).`;\n}\n\nexport async function commitChanges(repoPath: string, options: GitCommitOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.noVerify && !ALLOW_NO_VERIFY) {\n throw new Error(\n 'no_verify is disabled on this server. Set GIT_ALLOW_NO_VERIFY=true to permit bypassing git hooks.',\n );\n }\n\n const args: string[] = [];\n if (options.all) {\n args.push('-a');\n }\n if (options.amend) {\n args.push('--amend');\n }\n if (options.noEdit) {\n args.push('--no-edit');\n }\n if (options.noVerify) {\n args.push('--no-verify');\n }\n\n const shouldSign = options.sign ?? AUTO_SIGN_COMMITS;\n if (shouldSign) {\n const key = options.signingKey ?? DEFAULT_SIGNING_KEY;\n args.push(key ? `--gpg-sign=${key}` : '--gpg-sign');\n }\n\n // simple-git expects message, then options array (as second arg), not third\n const result = await git.commit(options.message, args);\n return `Committed ${result.commit}.`;\n}\n\nexport async function resetChanges(repoPath: string, options: GitResetOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.paths && options.paths.length > 0) {\n const args = ['reset'];\n if (options.target) {\n args.push(options.target);\n }\n args.push('--', ...options.paths);\n await git.raw(args);\n return `Unstaged ${options.paths.length} path(s).`;\n }\n\n const args = ['reset', `--${options.mode}`];\n if (options.target) {\n args.push(options.target);\n }\n\n await git.raw(args);\n return `Reset completed with mode=${options.mode}.`;\n}\n\nexport async function revertCommit(repoPath: string, options: GitRevertOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const args = ['revert'];\n if (options.noCommit) {\n args.push('--no-commit');\n }\n\n if (typeof options.mainline === 'number') {\n args.push('-m', String(options.mainline));\n }\n\n args.push(options.ref);\n\n await git.raw(args);\n return `Reverted ${options.ref}.`;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { runLfsAction } from '../services/lfs.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerLfsTools(server: McpServer): void {\n server.registerTool(\n 'git_lfs',\n {\n title: 'Git LFS Actions',\n description:\n 'Manage Git Large File Storage (LFS). Supports tracking/untracking file patterns, ' +\n 'listing LFS-tracked files and status, pulling/pushing LFS objects, installing LFS ' +\n 'hooks for the repository, and migrating existing files into or out of LFS storage.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum([\n 'track',\n 'untrack',\n 'ls-files',\n 'status',\n 'pull',\n 'push',\n 'install',\n 'migrate-import',\n 'migrate-export',\n ]),\n patterns: z\n .array(z.string())\n .optional()\n .describe('File glob patterns for track/untrack (e.g. [\"*.psd\", \"*.zip\"]).'),\n remote: z.string().optional().describe('Remote name for pull/push operations.'),\n include: z.string().optional().describe('Comma-separated include patterns for migrate or pull operations.'),\n exclude: z.string().optional().describe('Comma-separated exclude patterns for migrate or pull operations.'),\n everything: z\n .boolean()\n .default(false)\n .describe('Pass --all/--everything to include all refs in push/migrate operations.'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n action,\n patterns,\n remote,\n include,\n exclude,\n everything,\n response_format,\n }: {\n repo_path: string | undefined;\n action:\n | 'track'\n | 'untrack'\n | 'ls-files'\n | 'status'\n | 'pull'\n | 'push'\n | 'install'\n | 'migrate-import'\n | 'migrate-export';\n patterns?: string[];\n remote?: string;\n include?: string;\n exclude?: string;\n everything: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runLfsAction(repoPath, {\n action,\n patterns,\n remote,\n include,\n exclude,\n everything,\n });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { getGit } from '../git/client.js';\n\nexport type LfsAction =\n | 'track'\n | 'untrack'\n | 'ls-files'\n | 'status'\n | 'pull'\n | 'push'\n | 'install'\n | 'migrate-import'\n | 'migrate-export';\n\nexport interface LfsOptions {\n readonly action: LfsAction;\n /** File patterns for track/untrack (e.g. \"*.psd\", \"*.zip\"). */\n readonly patterns?: string[];\n /** Remote name for pull/push operations. */\n readonly remote?: string;\n /** Comma-separated include patterns for migrate operations. */\n readonly include?: string;\n /** Comma-separated exclude patterns for migrate operations. */\n readonly exclude?: string;\n /** Pass --everything to migrate-import to rewrite all refs. */\n readonly everything?: boolean;\n}\n\nexport async function runLfsAction(repoPath: string, options: LfsOptions): Promise<string> {\n const git = getGit(repoPath);\n\n switch (options.action) {\n case 'install': {\n const output = await git.raw(['lfs', 'install']);\n return output.trim() || 'Git LFS installed for this repository.';\n }\n\n case 'track': {\n if (!options.patterns || options.patterns.length === 0) {\n throw new Error('patterns is required for lfs track.');\n }\n const output = await git.raw(['lfs', 'track', ...options.patterns]);\n return output.trim() || `Tracking: ${options.patterns.join(', ')}`;\n }\n\n case 'untrack': {\n if (!options.patterns || options.patterns.length === 0) {\n throw new Error('patterns is required for lfs untrack.');\n }\n const output = await git.raw(['lfs', 'untrack', ...options.patterns]);\n return output.trim() || `Untracked: ${options.patterns.join(', ')}`;\n }\n\n case 'ls-files': {\n const output = await git.raw(['lfs', 'ls-files']);\n return output.trim() || 'No LFS-tracked files found.';\n }\n\n case 'status': {\n const output = await git.raw(['lfs', 'status']);\n return output.trim() || 'No LFS status changes.';\n }\n\n case 'pull': {\n const args = ['lfs', 'pull'];\n if (options.remote) args.push(options.remote);\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS pull complete.';\n }\n\n case 'push': {\n if (!options.remote) {\n throw new Error('remote is required for lfs push.');\n }\n const args = ['lfs', 'push', options.remote];\n if (options.everything) args.push('--all');\n const output = await git.raw(args);\n return output.trim() || `LFS push to ${options.remote} complete.`;\n }\n\n case 'migrate-import': {\n const args = ['lfs', 'migrate', 'import'];\n if (options.everything) args.push('--everything');\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS migrate import complete.';\n }\n\n case 'migrate-export': {\n const args = ['lfs', 'migrate', 'export'];\n if (options.everything) args.push('--everything');\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS migrate export complete.';\n }\n }\n}\n"],"mappings":"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","names":["McpServer","z","path","path","path","server","z","server","z","text","z","existsSync","statSync","path","existsSync","statSync","mainBranch","path","render","server","z","fetch","z","output","existsSync","path","existsSync","path","args","render","parseLogLine","server","z","summary","output","payload","git","args","path","rawOutput","z","render","server","z","McpServer","z"]}