{
  "name": "Auto-create GitHub PRs & JIRA updates from git commit commands (multi-repo)",
  "nodes": [
    {
      "id": "2dff9822-74ef-47b9-8eda-db563f4718d9",
      "name": "Commit Message Breakdown",
      "type": "n8n-nodes-base.code",
      "position": [
        -2220,
        1360
      ]
    },
    {
      "id": "40c7ec38-ce05-4cf0-b685-764fb1e3e8f8",
      "name": "Check for PR commands",
      "type": "n8n-nodes-base.if",
      "position": [
        -1500,
        1360
      ]
    },
    {
      "id": "dde2e24e-2ade-4422-90e5-4d340551797f",
      "name": "Request to create PR",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        920,
        680
      ]
    },
    {
      "id": "b5066bae-dfa3-45ab-9858-37bb5461de7e",
      "name": "Invalid commit message",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        -860,
        2500
      ]
    },
    {
      "id": "ce18dcbc-9708-44a1-8b21-2230bfc6478f",
      "name": "JIRA Task does not exist",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        1400,
        1280
      ]
    },
    {
      "id": "d2779f44-67c3-419e-8957-4963360f6071",
      "name": "Check for task completed command",
      "type": "n8n-nodes-base.if",
      "position": [
        -1140,
        1840
      ]
    },
    {
      "id": "c21c433f-1b97-485d-8936-79f9b884cd28",
      "name": "Get task details for PR",
      "type": "n8n-nodes-base.jira",
      "position": [
        -1140,
        700
      ]
    },
    {
      "id": "87aa1a73-12bb-4cf7-bf83-b2a552c41b71",
      "name": "Get Task Details without PR.",
      "type": "n8n-nodes-base.jira",
      "position": [
        -420,
        2020
      ]
    },
    {
      "id": "43311650-47f2-4166-b916-2f956605504a",
      "name": "Check if task exist",
      "type": "n8n-nodes-base.if",
      "position": [
        1540,
        540
      ]
    },
    {
      "id": "07939a6f-184b-4552-9b9b-2e64a7547a40",
      "name": "Update task status after PR",
      "type": "n8n-nodes-base.jira",
      "position": [
        2120,
        880
      ]
    },
    {
      "id": "f3dd4a57-565a-461b-bf87-2a4f33da045f",
      "name": "Check whether a PR already exists",
      "type": "n8n-nodes-base.if",
      "position": [
        660,
        420
      ]
    },
    {
      "id": "8a138396-1513-4542-bd88-9d24d99caf51",
      "name": "Update the task status without PR",
      "type": "n8n-nodes-base.jira",
      "position": [
        1220,
        2140
      ]
    },
    {
      "id": "98cf28cc-9ac3-4109-bfc6-1e8c1e2a48ee",
      "name": "Check if PR exists",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -400,
        420
      ]
    },
    {
      "id": "7a6ead0b-7975-4695-94b8-208620dd3402",
      "name": "Check if task exists",
      "type": "n8n-nodes-base.if",
      "position": [
        100,
        2140
      ]
    },
    {
      "id": "0295041e-7f62-42af-bdc7-9e0d8a920053",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        140,
        300
      ]
    },
    {
      "id": "c38d3be6-25bc-4373-8b9c-50644ebfb387",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        260,
        720
      ]
    },
    {
      "id": "866cd55e-0b51-4451-b5a2-bd6420d6f686",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -2940,
        1380
      ]
    },
    {
      "id": "2c37d886-5822-4c87-a2bb-e68c84a07e3f",
      "name": "Send message in slack with PR",
      "type": "n8n-nodes-base.slack",
      "position": [
        2780,
        700
      ]
    },
    {
      "id": "0df5af64-7250-4cfb-b050-91440a90efcf",
      "name": "Send message in slack without PR",
      "type": "n8n-nodes-base.slack",
      "position": [
        2020,
        1800
      ]
    },
    {
      "id": "c4615c8a-9d1e-4ab1-acce-cbbfc3857f54",
      "name": "Append a block in notion with PR",
      "type": "n8n-nodes-base.notion",
      "position": [
        2780,
        1140
      ]
    },
    {
      "id": "2f8f6c68-2a63-4a20-8771-9b616b1e37b9",
      "name": "Append a block in notion without PR",
      "type": "n8n-nodes-base.notion",
      "position": [
        2040,
        2360
      ]
    },
    {
      "id": "0acdb107-372c-46ae-8be1-1dfca5c03f08",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2800,
        400
      ],
      "parameters": {
        "width": 680,
        "height": 280,
        "content": "## 🔧 Quick Setup Required!\n\nWelcome! To make this workflow yours, you just need to do two things:\n\n1.  **Connect Your Accounts:** Click on the GitHub and Jira nodes and select your credentials. Also, "
      }
    },
    {
      "id": "00004e99-bfa8-41ba-bff6-0e9b0a882c4c",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3160,
        1040
      ],
      "parameters": {
        "width": 540,
        "height": 320,
        "content": "### Step 1: Webhook Activated! 🪝\n\nThis is the entry point of the workflow.\n\nIt acts as a **listener for GitHub push events**, tapping into your repositories to catch every new commit.\n\nHere’s what it "
      }
    },
    {
      "id": "ee39ccc2-c7d8-4783-bc79-b7710dda0cb8",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2460,
        1520
      ],
      "parameters": {
        "width": 560,
        "height": 280,
        "content": "### Step 2: The Decoder Ring 🧠\n\nThis is where the magic happens! Think of this node as a translator.\n\nIt carefully reads the commit message you wrote (e.g., \"FF-1196...[auto-pr]...\") and intelligently"
      }
    },
    {
      "id": "5abbabd7-f911-4905-a810-fb473cceb6f8",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1820,
        1040
      ],
      "parameters": {
        "width": 480,
        "height": 300,
        "content": "### Step 3: To PR, or Not to PR? 🤔\n\nThis is a checkpoint that gives you control.\n\nIt asks a simple question: \"Did the developer include the `[auto-pr]` command?\"\n\n- If **YES**, we proceed down the \"Tr"
      }
    },
    {
      "id": "f5b6e4b5-130f-4ebc-8e76-d968642404c1",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1300,
        380
      ],
      "parameters": {
        "width": 400,
        "height": 260,
        "content": "### Step 4: Task Intel Incoming! 🕵️‍♂️\n\nThis node is your mission control for task details.\n\nIt takes the **Jira ticket number** extracted in Step 2 and dives into your project management system to fe"
      }
    },
    {
      "id": "8994f439-0876-4a7f-97b6-00a7df59ecfe",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -540,
        100
      ],
      "parameters": {
        "width": 420,
        "height": 280,
        "content": "### Step 5: PR Radar Activated! 📡\n\nThis node is on patrol to prevent duplicates.\n\nIt scans the repository to check if a **Pull Request already exists** from the current branch. Why? Because creating m"
      }
    },
    {
      "id": "2795b793-1389-4459-814e-29fed2455ef7",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -60,
        -40
      ],
      "parameters": {
        "width": 580,
        "height": 300,
        "content": "### Step 6: PR Data Extractor 🧠📄\n\nThis node digs into GitHub to check if a **Pull Request already exists** for the current branch.\n\nHere’s what it does:\n\n- ✅ **If a PR exists**: It extracts and format"
      }
    },
    {
      "id": "b087e06b-7ac1-4c31-9312-3fcd4828a2a6",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        60,
        880
      ],
      "parameters": {
        "width": 520,
        "height": 360,
        "content": "### Step 7: PR Data Merge Hub 🔗🧩\n\nThis node acts as a smart **merge point** for Pull Request data.\n\nIt brings together inputs from:\n\n- 🧠 **Extracted PR details** (if a PR already exists).\n- ✅ **PR exi"
      }
    },
    {
      "id": "f91c2b1d-80a5-4563-9c00-37f8216985bb",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        740,
        860
      ],
      "parameters": {
        "width": 480,
        "height": 300,
        "content": "### Step 8: Launch the PR! 🚀\n\nThis is the final move—the grand finale.\n\nIf everything checks out, this node **creates the Pull Request** automatically using the details we gathered earlier (task info,"
      }
    },
    {
      "id": "bdd25203-fe9c-434e-a4bd-967c3e3632a6",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1940,
        460
      ],
      "parameters": {
        "width": 620,
        "height": 320,
        "content": "### Step 7: Status Update Sent! 📬\n\nTime to close the loop with Jira.\n\nThis node takes care of updating the **task status to “Development Done”** once the PR is successfully created.\n\nWhy does this mat"
      }
    },
    {
      "id": "4a379c5e-bc5d-4ce5-818b-68aca73c45ce",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1560,
        1160
      ],
      "parameters": {
        "width": 580,
        "height": 300,
        "content": "### Heads-Up Node: Something’s Missing! ⚠️\n\nThis node acts as a checkpoint when things don’t go as planned.\n\nIt checks two key conditions:\n\n1. ❌ The **Jira task** couldn’t be found based on the commit"
      }
    },
    {
      "id": "4040caf2-2b6d-4194-afc5-e1fa376b6c7a",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2980,
        820
      ],
      "parameters": {
        "width": 640,
        "height": 300,
        "content": "### Step 8: Spread the Word! 📣\n\nTime to notify the crew.\n\nThese nodes send out alerts that a **Pull Request has been created** and the **Jira task status has been updated**—all in real-time.\n\nWhere do"
      }
    },
    {
      "id": "12c79a7b-edb9-4233-9fd4-33ff9efdf462",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        2680
      ],
      "parameters": {
        "width": 540,
        "height": 320,
        "content": "### Halt! Invalid Commit Detected 🚫\n\nThis node is the gatekeeper for clean automation.\n\nIt checks if the commit message is **missing the required format or commands** (like `[auto-pr]`, `[taskcomplete"
      }
    },
    {
      "id": "b007ed13-aaef-4f7d-bea4-7ae2aa77a213",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1200,
        1440
      ],
      "parameters": {
        "width": 480,
        "height": 340,
        "content": "### Step 4: Task Completion Check ✅❓\n\nThis node plays detective for the `[taskcompleted]` command.\n\nIt scans the commit message to see if you’ve marked the task as complete—by including the `[taskcomp"
      }
    },
    {
      "id": "38fa4c21-97e6-4cbb-bd56-01b22ab9dcaf",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        1760
      ],
      "parameters": {
        "width": 500,
        "height": 320,
        "content": "### Step 5: Task Hunt Begins! 🔍\n\nThis node verifies whether the **Jira task actually exists**.\n\nUsing the ticket number extracted earlier, it queries Jira to confirm that the task is valid and accessi"
      }
    },
    {
      "id": "f9dc7b51-164b-493a-88f3-123e80fb4d1d",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        940,
        1800
      ],
      "parameters": {
        "width": 580,
        "height": 300,
        "content": "### Step 6: Silent Status Update 🤫✅\n\nThis node updates the **Jira task status to “Development Done”**, but skips the PR creation process.\n\nWhy would this happen?\n\n- The commit message includes `[taskc"
      }
    },
    {
      "id": "39389ae3-505b-4c2d-8747-8d95bf22613b",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2200,
        2000
      ],
      "parameters": {
        "width": 560,
        "height": 260,
        "content": "### Step 7: Task Update Broadcast! 📢\n\nThis node handles communication after the Jira task status has been updated.\n\nIt sends out friendly alerts to keep everyone in the loop:\n\n- 💬 **Slack** – So your "
      }
    },
    {
      "id": "7fc5e9aa-2bfe-4bb8-b7e9-1c6c587769b3",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3780,
        180
      ],
      "parameters": {
        "width": 900,
        "height": 700,
        "content": "\n\n### ✍️ Commit Message Command Guide\n\nYour `git commit` message is the remote control for this automation. Use the format below to trigger specific actions.\n\n**Base Format:**\n`TICKET-ID Your descript"
      }
    }
  ],
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Check whether a PR already exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Request to create PR",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Commit Message Breakdown",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if PR exists": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check if task exist": {
      "main": [
        [
          {
            "node": "Update task status after PR",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "JIRA Task does not exist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if task exists": {
      "main": [
        [
          {
            "node": "Update the task status without PR",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "JIRA Task does not exist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Request to create PR": {
      "main": [
        [
          {
            "node": "Check if task exist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for PR commands": {
      "main": [
        [
          {
            "node": "Get task details for PR",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Check for task completed command",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get task details for PR": {
      "main": [
        [
          {
            "node": "Check if PR exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Commit Message Breakdown": {
      "main": [
        [
          {
            "node": "Check for PR commands",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update task status after PR": {
      "main": [
        [
          {
            "node": "Send message in slack with PR",
            "type": "main",
            "index": 0
          },
          {
            "node": "Append a block in notion with PR",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Task Details without PR.": {
      "main": [
        [
          {
            "node": "Check if task exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for task completed command": {
      "main": [
        [
          {
            "node": "Get Task Details without PR.",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Invalid commit message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check whether a PR already exists": {
      "main": [
        [
          {
            "node": "Check if task exist",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update the task status without PR": {
      "main": [
        [
          {
            "node": "Send message in slack without PR",
            "type": "main",
            "index": 0
          },
          {
            "node": "Append a block in notion without PR",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}