From f748ac78299034298afedd14052d0c6d5ca95ecc Mon Sep 17 00:00:00 2001 From: tomjuggler Date: Mon, 10 Nov 2025 08:18:00 +0200 Subject: [PATCH 1/7] feat: add git_branch and git_remote tools Co-authored-by: aider (deepseek/deepseek-reasoner) --- aider/tools/__init__.py | 4 +++ aider/tools/git_branch.py | 52 ++++++++++++++++++++++++++++++++++++++ aider/tools/git_remote.py | 53 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 aider/tools/git_branch.py create mode 100644 aider/tools/git_remote.py diff --git a/aider/tools/__init__.py b/aider/tools/__init__.py index c1b2f6c710d..60b3b06c5af 100644 --- a/aider/tools/__init__.py +++ b/aider/tools/__init__.py @@ -10,8 +10,10 @@ delete_lines, extract_lines, finished, + git_branch, git_diff, git_log, + git_remote, git_show, git_status, grep, @@ -43,8 +45,10 @@ delete_lines, extract_lines, finished, + git_branch, git_diff, git_log, + git_remote, git_show, git_status, grep, diff --git a/aider/tools/git_branch.py b/aider/tools/git_branch.py new file mode 100644 index 00000000000..c43615b6493 --- /dev/null +++ b/aider/tools/git_branch.py @@ -0,0 +1,52 @@ +from aider.repo import ANY_GIT_ERROR + +schema = { + "type": "function", + "function": { + "name": "GitBranch", + "description": "List branches in the repository.", + "parameters": { + "type": "object", + "properties": {}, + "required": [], + }, + }, +} + +# Normalized tool name for lookup +NORM_NAME = "gitbranch" + + +def _execute_git_branch(coder): + """ + List branches in the repository. + """ + if not coder.repo: + return "Not in a git repository." + + try: + # Get all branches and current branch + branches = [] + current_branch = coder.repo.repo.active_branch.name + for branch in coder.repo.repo.heads: + prefix = "* " if branch.name == current_branch else " " + branches.append(f"{prefix}{branch.name}") + return "\n".join(branches) + except ANY_GIT_ERROR as e: + coder.io.tool_error(f"Error running git branch: {e}") + return f"Error running git branch: {e}" + + +def process_response(coder, params): + """ + Process the GitBranch tool response. + + Args: + coder: The Coder instance + params: Dictionary of parameters (should be empty for GitBranch) + + Returns: + str: Result message + """ + # GitBranch tool has no parameters to validate + return _execute_git_branch(coder) \ No newline at end of file diff --git a/aider/tools/git_remote.py b/aider/tools/git_remote.py new file mode 100644 index 00000000000..d5813972e5f --- /dev/null +++ b/aider/tools/git_remote.py @@ -0,0 +1,53 @@ +from aider.repo import ANY_GIT_ERROR + +schema = { + "type": "function", + "function": { + "name": "GitRemote", + "description": "List remote repositories.", + "parameters": { + "type": "object", + "properties": {}, + "required": [], + }, + }, +} + +# Normalized tool name for lookup +NORM_NAME = "gitremote" + + +def _execute_git_remote(coder): + """ + List remote repositories. + """ + if not coder.repo: + return "Not in a git repository." + + try: + remotes = coder.repo.repo.remotes + if not remotes: + return "No remotes configured." + + result = [] + for remote in remotes: + result.append(f"{remote.name}\t{remote.url}") + return "\n".join(result) + except ANY_GIT_ERROR as e: + coder.io.tool_error(f"Error running git remote: {e}") + return f"Error running git remote: {e}" + + +def process_response(coder, params): + """ + Process the GitRemote tool response. + + Args: + coder: The Coder instance + params: Dictionary of parameters (should be empty for GitRemote) + + Returns: + str: Result message + """ + # GitRemote tool has no parameters to validate + return _execute_git_remote(coder) \ No newline at end of file From 32317fb5525fbf86cf3097210f6aae9b7b196cb5 Mon Sep 17 00:00:00 2001 From: tomjuggler Date: Mon, 10 Nov 2025 08:21:36 +0200 Subject: [PATCH 2/7] Nicer looking code with black --- aider/tools/git_branch.py | 2 +- aider/tools/git_remote.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/tools/git_branch.py b/aider/tools/git_branch.py index c43615b6493..cdb20ced6df 100644 --- a/aider/tools/git_branch.py +++ b/aider/tools/git_branch.py @@ -49,4 +49,4 @@ def process_response(coder, params): str: Result message """ # GitBranch tool has no parameters to validate - return _execute_git_branch(coder) \ No newline at end of file + return _execute_git_branch(coder) diff --git a/aider/tools/git_remote.py b/aider/tools/git_remote.py index d5813972e5f..5f839683c17 100644 --- a/aider/tools/git_remote.py +++ b/aider/tools/git_remote.py @@ -50,4 +50,4 @@ def process_response(coder, params): str: Result message """ # GitRemote tool has no parameters to validate - return _execute_git_remote(coder) \ No newline at end of file + return _execute_git_remote(coder) From 878253914137b3d5bc9025e6cc805446bc4cb4ce Mon Sep 17 00:00:00 2001 From: tomjuggler Date: Mon, 10 Nov 2025 08:32:21 +0200 Subject: [PATCH 3/7] feat: add git_branch and git_remote tools to agent_coder Co-authored-by: aider (deepseek/deepseek-reasoner) --- aider/coders/agent_coder.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/aider/coders/agent_coder.py b/aider/coders/agent_coder.py index c97bd041410..1ce15b86162 100644 --- a/aider/coders/agent_coder.py +++ b/aider/coders/agent_coder.py @@ -23,6 +23,7 @@ from aider.mcp.server import LocalServer from aider.repo import ANY_GIT_ERROR +# Import tool modules for registry # Import tool modules for registry from aider.tools import ( command, @@ -32,8 +33,10 @@ delete_lines, extract_lines, finished, + git_branch, git_diff, git_log, + git_remote, git_show, git_status, grep, @@ -159,8 +162,10 @@ def _build_tool_registry(self): delete_lines, extract_lines, finished, + git_branch, git_diff, git_log, + git_remote, git_show, git_status, grep, @@ -2158,4 +2163,4 @@ def cmd_context_blocks(self, args=""): self.context_blocks_cache = {} self.tokens_calculated = False - return True + return True \ No newline at end of file From b0788a7c08c3f4cf985b7035f734adec11c22e8e Mon Sep 17 00:00:00 2001 From: tomjuggler Date: Mon, 10 Nov 2025 08:39:22 +0200 Subject: [PATCH 4/7] code formatting with black --- aider/coders/agent_coder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/coders/agent_coder.py b/aider/coders/agent_coder.py index 1ce15b86162..f11de0976a1 100644 --- a/aider/coders/agent_coder.py +++ b/aider/coders/agent_coder.py @@ -2163,4 +2163,4 @@ def cmd_context_blocks(self, args=""): self.context_blocks_cache = {} self.tokens_calculated = False - return True \ No newline at end of file + return True From 3ec9bc5b7d6ae7aee475d9340ed640cb19c251d7 Mon Sep 17 00:00:00 2001 From: tomjuggler Date: Mon, 10 Nov 2025 08:56:58 +0200 Subject: [PATCH 5/7] feat: add support for critical git branch flags Co-authored-by: aider (deepseek/deepseek-reasoner) --- aider/tools/git_branch.py | 94 +++++++++++++++++++++++++++++++++------ 1 file changed, 80 insertions(+), 14 deletions(-) diff --git a/aider/tools/git_branch.py b/aider/tools/git_branch.py index cdb20ced6df..6c935828a04 100644 --- a/aider/tools/git_branch.py +++ b/aider/tools/git_branch.py @@ -4,10 +4,47 @@ "type": "function", "function": { "name": "GitBranch", - "description": "List branches in the repository.", + "description": "List branches in the repository with various filtering and formatting options.", "parameters": { "type": "object", - "properties": {}, + "properties": { + "remotes": { + "type": "boolean", + "description": "List remote-tracking branches (-r/--remotes flag)", + }, + "all": { + "type": "boolean", + "description": "List both local and remote branches (-a/--all flag)", + }, + "verbose": { + "type": "boolean", + "description": "Show verbose information including commit hash and subject (-v flag)", + }, + "very_verbose": { + "type": "boolean", + "description": "Show very verbose information including upstream branch (-vv flag)", + }, + "merged": { + "type": "string", + "description": "Show branches merged into specified commit (--merged flag)", + }, + "no_merged": { + "type": "string", + "description": "Show branches not merged into specified commit (--no-merged flag)", + }, + "sort": { + "type": "string", + "description": "Sort branches by key (committerdate, authordate, refname, etc.) (--sort flag)", + }, + "format": { + "type": "string", + "description": "Custom output format using placeholders (--format flag)", + }, + "show_current": { + "type": "boolean", + "description": "Show only current branch name (--show-current flag)", + }, + }, "required": [], }, }, @@ -17,21 +54,51 @@ NORM_NAME = "gitbranch" -def _execute_git_branch(coder): +def _execute_git_branch(coder, params=None): """ - List branches in the repository. + List branches in the repository with various filtering and formatting options. """ if not coder.repo: return "Not in a git repository." try: - # Get all branches and current branch - branches = [] - current_branch = coder.repo.repo.active_branch.name - for branch in coder.repo.repo.heads: - prefix = "* " if branch.name == current_branch else " " - branches.append(f"{prefix}{branch.name}") - return "\n".join(branches) + # Build git command arguments + args = ["branch"] + + # Handle boolean flags + if params: + if params.get("remotes"): + args.append("--remotes") + if params.get("all"): + args.append("--all") + if params.get("verbose"): + args.append("--verbose") + if params.get("very_verbose"): + args.append("--verbose") + args.append("--verbose") + if params.get("show_current"): + args.append("--show-current") + + # Handle string parameters + if params.get("merged"): + args.extend(["--merged", params["merged"]]) + if params.get("no_merged"): + args.extend(["--no-merged", params["no_merged"]]) + if params.get("sort"): + args.extend(["--sort", params["sort"]]) + if params.get("format"): + args.extend(["--format", params["format"]]) + + # Execute git command + result = coder.repo.repo.git.branch(*args) + + # If no result and show_current was used, get current branch directly + if not result and params and params.get("show_current"): + current_branch = coder.repo.repo.active_branch.name + return current_branch + + return result if result else "No branches found matching the criteria." + except ANY_GIT_ERROR as e: coder.io.tool_error(f"Error running git branch: {e}") return f"Error running git branch: {e}" @@ -43,10 +110,9 @@ def process_response(coder, params): Args: coder: The Coder instance - params: Dictionary of parameters (should be empty for GitBranch) + params: Dictionary of parameters for GitBranch Returns: str: Result message """ - # GitBranch tool has no parameters to validate - return _execute_git_branch(coder) + return _execute_git_branch(coder, params) From e840585c36e66354718a4c33535e280a42088b2c Mon Sep 17 00:00:00 2001 From: tomjuggler Date: Mon, 10 Nov 2025 08:57:39 +0200 Subject: [PATCH 6/7] ran black code formatter --- aider/tools/git_branch.py | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/aider/tools/git_branch.py b/aider/tools/git_branch.py index 6c935828a04..6ce2460f601 100644 --- a/aider/tools/git_branch.py +++ b/aider/tools/git_branch.py @@ -4,7 +4,9 @@ "type": "function", "function": { "name": "GitBranch", - "description": "List branches in the repository with various filtering and formatting options.", + "description": ( + "List branches in the repository with various filtering and formatting options." + ), "parameters": { "type": "object", "properties": { @@ -13,28 +15,37 @@ "description": "List remote-tracking branches (-r/--remotes flag)", }, "all": { - "type": "boolean", + "type": "boolean", "description": "List both local and remote branches (-a/--all flag)", }, "verbose": { "type": "boolean", - "description": "Show verbose information including commit hash and subject (-v flag)", + "description": ( + "Show verbose information including commit hash and subject (-v flag)" + ), }, "very_verbose": { "type": "boolean", - "description": "Show very verbose information including upstream branch (-vv flag)", + "description": ( + "Show very verbose information including upstream branch (-vv flag)" + ), }, "merged": { "type": "string", "description": "Show branches merged into specified commit (--merged flag)", }, "no_merged": { - "type": "string", - "description": "Show branches not merged into specified commit (--no-merged flag)", + "type": "string", + "description": ( + "Show branches not merged into specified commit (--no-merged flag)" + ), }, "sort": { "type": "string", - "description": "Sort branches by key (committerdate, authordate, refname, etc.) (--sort flag)", + "description": ( + "Sort branches by key (committerdate, authordate, refname, etc.) (--sort" + " flag)" + ), }, "format": { "type": "string", @@ -64,7 +75,7 @@ def _execute_git_branch(coder, params=None): try: # Build git command arguments args = ["branch"] - + # Handle boolean flags if params: if params.get("remotes"): @@ -78,7 +89,7 @@ def _execute_git_branch(coder, params=None): args.append("--verbose") if params.get("show_current"): args.append("--show-current") - + # Handle string parameters if params.get("merged"): args.extend(["--merged", params["merged"]]) @@ -88,17 +99,17 @@ def _execute_git_branch(coder, params=None): args.extend(["--sort", params["sort"]]) if params.get("format"): args.extend(["--format", params["format"]]) - + # Execute git command result = coder.repo.repo.git.branch(*args) - + # If no result and show_current was used, get current branch directly if not result and params and params.get("show_current"): current_branch = coder.repo.repo.active_branch.name return current_branch - + return result if result else "No branches found matching the criteria." - + except ANY_GIT_ERROR as e: coder.io.tool_error(f"Error running git branch: {e}") return f"Error running git branch: {e}" From 4bcab112f5ba39eff6bf57f159c8e3f1f8d29a37 Mon Sep 17 00:00:00 2001 From: tomjuggler Date: Mon, 10 Nov 2025 09:06:49 +0200 Subject: [PATCH 7/7] fix: remove incorrect 'branch' argument from git branch command Co-authored-by: aider (deepseek/deepseek-reasoner) --- aider/tools/git_branch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/tools/git_branch.py b/aider/tools/git_branch.py index 6ce2460f601..6a8d2c75d3d 100644 --- a/aider/tools/git_branch.py +++ b/aider/tools/git_branch.py @@ -74,7 +74,7 @@ def _execute_git_branch(coder, params=None): try: # Build git command arguments - args = ["branch"] + args = [] # Handle boolean flags if params: