{
  "id": "B9XHO1B8oUR04nOu",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "My workflow 19",
  "tags": [],
  "nodes": [
    {
      "id": "d2cc9623-ab49-4a56-8c22-f8a014253179",
      "name": "Github Trigger",
      "type": "n8n-nodes-base.githubTrigger",
      "position": [
        -1100,
        240
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name"
        },
        "events": [
          "push"
        ],
        "options": {
          "insecureSSL": false
        },
        "repository": {
          "__rl": true,
          "mode": "list",
          "cachedResultUrl": "Your_Github_URL",
          "cachedResultName": "Your_Repository_Name"
        }
      },
      "notesInFlow": false,
      "typeVersion": 1
    },
    {
      "id": "240e79d9-9a6d-4fc9-9f46-b681577c54aa",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        -880,
        240
      ],
      "parameters": {
        "jsCode": "const inputData = $input.all();\nconst commits = inputData[0].json.body.commits;\n\nreturn commits.map(commit => {\n  const message = commit.message;\n  const timestamp = commit.timestamp;\n\n  // Match something like \"ABC-123\", case-insensitive, from the beginning\n  const match = message.match(/([A-Z]+-\\d+)/i);\n\n  const jiraId = match ? match[0].toUpperCase() : null;\n\n  return {\n    json: {\n      message,\n      timestamp,\n      jira_id: jiraId\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "c4265d41-b0d6-480e-b287-f87fc0dd383f",
      "name": "Basic LLM Chain",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -180,
        160
      ],
      "parameters": {
        "text": "=",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "type": "HumanMessagePromptTemplate",
              "message": "=You are a professional technical release manager generating production release notes for CxOs and clients.\n\nGenerate a complete release note in **HTML format**, not plain text. The content is based on the following JIRA items, each having `jira_id`, `jira_summary`, `jira_description`, and `message`.\n\nOutput structure (as HTML):\n\n1. Title and Metadata\n   - H2 tag: \"Production Deployment \u2013 [Release Date]\"\n   - Bold lines: Version, Environment, Deployment Date\n\n2. Overview\n   - Short paragraph explaining the goal of this deployment\n\n3. Key Changes\n   - Bullet list (<ul>) with one <li> per JIRA item\n   - For each bullet: Summarize `jira_description` + `message` into a business-friendly sentence\n\nRules:\n- Output as clean HTML only\n- Do not wrap in a JSON object or Markdown\n- Use simple inline styles for readability\n\nHere is the input data:\n{{ JSON.stringify($json.items, null, 2) }}\n"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "fc270e53-4599-4627-a492-d8beb3fef6f6",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -180,
        360
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.5-pro"
      },
      "typeVersion": 1
    },
    {
      "id": "aba9e0b0-56f3-412a-950b-3cf80e3cf79b",
      "name": "Send email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        300,
        160
      ],
      "parameters": {
        "html": "={{ $json.output.releasenote }}",
        "options": {},
        "subject": "Your_company_name | Location, Country \nYou\u2019re receiving this email because you are subscribed to release notifications.",
        "toEmail": "Your_receiver_email",
        "fromEmail": "Your_sender_email"
      },
      "typeVersion": 2.1,
      "alwaysOutputData": false
    },
    {
      "id": "48532ced-01bb-4e6e-b6ec-4c32f46b566c",
      "name": "Get an issue",
      "type": "n8n-nodes-base.jira",
      "position": [
        -600,
        -20
      ],
      "parameters": {
        "issueKey": "={{ $json.jira_id }}",
        "operation": "get",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "b34e967e-186b-4796-a271-c494062683a1",
      "name": "Code2",
      "type": "n8n-nodes-base.code",
      "position": [
        -400,
        -20
      ],
      "parameters": {
        "jsCode": "// Get all incoming items from the JIRA node.\nconst allItems = $input.all();\n\n// Use .map() to loop through each item and transform it.\nreturn allItems.map(item => {\n  // The full JIRA issue data for the current item in the loop\n  const issue = item.json;\n\n  // Extract the specific fields you need for this issue.\n  // Use optional chaining (?.) to prevent errors if a field is missing.\n  const jiraId = issue.key; // The JIRA ID (e.g., \"MS-6\")\n  const summary = issue.fields?.summary;\n  const description = issue.fields?.description;\n\n  // Return a new, clean object for this specific issue.\n  return {\n    json: {\n      jira_id: jiraId, // Added as requested\n      jira_summary: summary,\n      jira_description: description\n    }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "e230523a-b901-4188-8fa0-5c1fe744de67",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        -600,
        340
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "19291761-fa9d-4b44-9adf-152d69a4fdc2",
      "name": "Code3",
      "type": "n8n-nodes-base.code",
      "position": [
        -400,
        340
      ],
      "parameters": {
        "jsCode": "// This will take all input items from previous loop and combine into one array\nreturn [{\n  json: {\n    items: items.map(i => i.json)\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "9439a656-766c-4461-ae0e-df4455a15c59",
      "name": "Structured Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -20,
        360
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"releasenote\": {\n\t\t\t\"type\": \"string\"\n\t\t}\n\t}\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "1a888040-0235-488f-b674-d12f4049342b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1240,
        -60
      ],
      "parameters": {
        "color": 3,
        "width": 380,
        "height": 220,
        "content": "*Generate & Email Professional Release Notes*\n\n*Before you get started, you'll need this:*\n\n*   GitHub\n*   Google Gemini (or another PaLM/LLM provider)\n*   JIRA (Software Cloud API)    \n*   Your SMTP email server"
      },
      "typeVersion": 1
    },
    {
      "id": "c9fddf05-bf10-40e8-8712-d472eb877418",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1260,
        400
      ],
      "parameters": {
        "width": 440,
        "height": 360,
        "content": "Configure the GitHub Trigger:\n-----------------------------------------------------------\n\n\n1.  Select the Github Trigger node.. \n\n2. In the Repository Owner field, enter your GitHub username or organization name.. \n\n3. In the Repository Name field, select the repository you want to monitor.\n\n4. A unique topic for the post generation will be generated and connect with content generator node. \n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "45eff7d7-4b65-4f9b-96b3-c5fe8cb0e481",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -780,
        -240
      ],
      "parameters": {
        "color": 6,
        "width": 620,
        "height": 380,
        "content": "Verify the JIRA Integration:\n-----------------------------------------------------------\n\n\n1.  Important: This workflow assumes your commit messages contain a JIRA key (e.g., \u201cPROJ-123: Fix login bug\u201d).\n\n2. Select the first Code node. It uses a regular expression ([A-Z]\u00b1\\d+)/i to find JIRA keys. Adjust this expression if your team uses a different format.. \n\n3. Select the Get an issue node and ensure your JIRA credentials are correctly configured.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "bc9a6cc5-48c1-4dfe-80ad-a9af16760502",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -240,
        500
      ],
      "parameters": {
        "width": 460,
        "content": "Customize the AI Prompt:\n-----------------------------------------------------------\n\n\n1.  Select the Basic LLM Chain node. You can edit the prompt to change the tone, style, or structure of the generated HTML release note to match your company\u2019s standards.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "04ef71c5-356c-49fd-b107-bd780cd407fc",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        120,
        -60
      ],
      "parameters": {
        "color": 4,
        "width": 520,
        "height": 360,
        "content": "Configure Email Notifications:\n-----------------------------------------------------------\n\n\n1.  Select the Send email node.\n\n2. Update the To Email field with the recipient\u2019s email address (e.g., a team distribution list or a stakeholder\u2019s email).\n\n3. Customize the From Email and Subject line as needed. \n \n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "876e6044-75e6-4ad7-8c45-230adb40eb39",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1780,
        160
      ],
      "parameters": {
        "color": 5,
        "width": 576,
        "height": 300,
        "content": "# Need more help ?\n\n**We develop tailored workflow to save youe valuable time. Should you have any questions or wish to explore more custom automation solutions, we would be happy to connect.**\n\n### Email: hello.b@intuz.com\n### Website: https://www.intuz.com/"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "2df81f54-33ae-4201-9872-1dcc0dff8dd8",
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Get an issue",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Code2": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code3": {
      "main": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Code3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get an issue": {
      "main": [
        [
          {
            "node": "Code2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Github Trigger": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "Send email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser1": {
      "ai_outputParser": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  }
}