From 7b1fbbe2beac5be59af78818e053e7bdb6f42e8e Mon Sep 17 00:00:00 2001
From: TIANYOU CHEN <42710806+CTY-git@users.noreply.github.com>
Date: Wed, 16 Apr 2025 12:21:47 +0800
Subject: [PATCH 1/3] add git tool

---
 patchwork/common/tools/git_tool.py         | 44 ++++++++++++++++++++++
 patchwork/common/tools/github_tool.py      |  2 +-
 patchwork/steps/GitHubAgent/GitHubAgent.py |  6 ++-
 3 files changed, 50 insertions(+), 2 deletions(-)
 create mode 100644 patchwork/common/tools/git_tool.py

diff --git a/patchwork/common/tools/git_tool.py b/patchwork/common/tools/git_tool.py
new file mode 100644
index 000000000..4b32765aa
--- /dev/null
+++ b/patchwork/common/tools/git_tool.py
@@ -0,0 +1,44 @@
+from __future__ import annotations
+
+import os
+import subprocess
+
+from patchwork.common.tools.tool import Tool
+
+
+class GitTool(Tool, tool_name="git_tool",  abc_register=False):
+    def __init__(self, path: str):
+        super().__init__()
+        self.path = path
+
+    @property
+    def json_schema(self) -> dict:
+        return {
+            "name": "git_tool",
+            "description": """\
+Access to the Git CLI, the command is also `git` all args provided are used as is
+""",
+            "input_schema": {
+                "type": "object",
+                "properties": {
+                    "args": {
+                        "type": "array",
+                        "items": {"type": "string"},
+                        "description": "The args to run `git` command with.",
+                    }
+                },
+                "required": ["args"],
+            },
+        }
+
+    def execute(self, args: list[str]) -> str:
+        env = os.environ.copy()
+        p = subprocess.run(
+            ["gh", *args],
+            env=env,
+            cwd=self.path,
+            text=True,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT,
+        )
+        return p.stdout
diff --git a/patchwork/common/tools/github_tool.py b/patchwork/common/tools/github_tool.py
index aa5d5effe..16e418c08 100644
--- a/patchwork/common/tools/github_tool.py
+++ b/patchwork/common/tools/github_tool.py
@@ -6,7 +6,7 @@
 from patchwork.common.tools.tool import Tool
 
 
-class GitHubTool(Tool, tool_name="github_tool"):
+class GitHubTool(Tool, tool_name="github_tool",  abc_register=False):
     def __init__(self, path: str, gh_token: str):
         super().__init__()
         self.path = path
diff --git a/patchwork/steps/GitHubAgent/GitHubAgent.py b/patchwork/steps/GitHubAgent/GitHubAgent.py
index bc8d319c1..0ac014538 100644
--- a/patchwork/steps/GitHubAgent/GitHubAgent.py
+++ b/patchwork/steps/GitHubAgent/GitHubAgent.py
@@ -5,6 +5,7 @@
     AgentConfig,
     AgenticStrategyV2,
 )
+from patchwork.common.tools.git_tool import GitTool
 from patchwork.common.tools.github_tool import GitHubTool
 from patchwork.common.utils.utils import mustache_render
 from patchwork.step import Step
@@ -34,7 +35,10 @@ def __init__(self, inputs):
                 AgentConfig(
                     name="Assistant",
                     model="gemini-2.0-flash",
-                    tool_set=dict(github_tool=GitHubTool(base_path, inputs["github_api_key"])),
+                    tool_set=dict(
+                        github_tool=GitHubTool(base_path, inputs["github_api_key"]),
+                        git_tool=GitTool(base_path),
+                    ),
                     system_prompt="""\
 You are a senior software developer helping the program manager to obtain some data from GitHub.
 You can access github through the `gh` CLI app.

From 5bafb638391958f89f114d7d0a7973200d30a9d4 Mon Sep 17 00:00:00 2001
From: TIANYOU CHEN <42710806+CTY-git@users.noreply.github.com>
Date: Wed, 16 Apr 2025 12:25:11 +0800
Subject: [PATCH 2/3] bump version

---
 pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index ab89dee54..d136584c5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "patchwork-cli"
-version = "0.0.123"
+version = "0.0.124"
 description = ""
 authors = ["patched.codes"]
 license = "AGPL"

From 94f443c845b4f51f587b5400b846c6fc2f89c46b Mon Sep 17 00:00:00 2001
From: "patched.codes[bot]"
 <298395+patched.codes[bot]@users.noreply.github.com>
Date: Wed, 16 Apr 2025 04:30:12 +0000
Subject: [PATCH 3/3] Patched diagram.md

---
 diagram.md | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 106 insertions(+)
 create mode 100644 diagram.md

diff --git a/diagram.md b/diagram.md
new file mode 100644
index 000000000..c18d87312
--- /dev/null
+++ b/diagram.md
@@ -0,0 +1,106 @@
+%%{init: {"themeVariables": {"edgeLabelBackground":"#ffffff", "tertiaryColor":"#E0E0E0"}, "theme":"base", "themeCSS": ".label { font-size: 12px; }"}}%%
+
+graph TD
+    subgraph Patchwork
+        subgraph Steps
+            A[__init__.py] --> B(AgenticLLM)
+            A --> C(AgenticLLMV2)
+            A --> D(AnalyzeImpact)
+            A --> E(BrowserUse)
+            A --> F(CallAPI)
+            A --> G(CallCode2Prompt)
+            A --> H(CallLLM)
+            A --> I(CallShell)
+            A --> J(CallSQL)
+            A --> K(Combine)
+            A --> L(CommitChanges)
+            A --> M(CreateIssue)
+            A --> N(CreateIssueComment)
+            A --> O(CreatePR)
+            A --> P(CreatePRComment)
+            A --> Q(DatabaseAgent)
+            A --> R(ExtractCode)
+            A --> S(ExtractCodeContexts)
+            A --> T(ExtractCodeMethodForCommentContexts)
+            A --> U(ExtractDiff)
+            A --> V(ExtractModelResponse)
+            A --> W(ExtractPackageManagerFile)
+            A --> X(FileAgent)
+            A --> Y(FilterBySimilarity)
+            A --> Z(FixIssue)
+            A --> AA(GetTypescriptTypeInfo)
+            A --> AB(GitHubAgent)
+            A --> AC(JoinList)
+            A --> AD(LLM)
+            A --> AE(ManageEngineAgent)
+            A --> AF(ModifyCode)
+            A --> AG(ModifyCodeOnce)
+            A --> AH(PreparePR)
+            A --> AI(PreparePrompt)
+            A --> AJ(PR)
+            A --> AK(ReadEmail)
+            A --> AL(ReadFile)
+            A --> AM(ReadIssues)
+            A --> AN(ReadPRDiffs)
+            A --> AO(ReadPRs)
+            A --> AP(ScanDepscan)
+            A --> AQ(ScanSemgrep)
+            A --> AR(ScanSonar)
+            A --> AS(SendEmail)
+            A --> AT(SimplifiedLLM)
+            A --> AU(SimplifiedLLMOnce)
+            A --> AV(SlackMessage)
+            A --> AW(ZohoDeskAgent)
+        end
+        
+        subgraph Common
+            B ==> A
+            C ==> A
+            D ==> A
+            E ==> A
+            F ==> A
+            G ==> A
+            H ==> A
+            I ==> A
+            J ==> A
+            K ==> A
+            L ==> A
+            M ==> A
+            N ==> A
+            O ==> A
+            P ==> A
+            Q ==> A
+            R ==> A
+            S ==> A
+            T ==> A
+            U ==> A
+            V ==> A
+            W ==> A
+            X ==> A
+            Y ==> A
+            Z ==> A
+            AA ==> A
+            AB ==> A
+            AC ==> A
+            AD ==> A
+            AE ==> A
+            AF ==> A
+            AG ==> A
+            AH ==> A
+            AI ==> A
+            AJ ==> A
+            AK ==> A
+            AL ==> A
+            AM ==> A
+            AN ==> A
+            AO ==> A
+            AP ==> A
+            AQ ==> A
+            AR ==> A
+            AS ==> A
+            AT ==> A
+            AU ==> A
+            AV ==> A
+            AW ==> A
+        end
+    end