{
  "name": "AI Code Reviewer",
  "nodes": [
    {
      "parameters": {
        "events": [
          "pull_request"
        ],
        "additionalParameters": {
          "action": "opened"
        },
        "options": {}
      },
      "id": "c9d0e1f2-9999-4000-8000-000000000001",
      "name": "GitHub Trigger",
      "type": "n8n-nodes-base.githubTrigger",
      "typeVersion": 1,
      "position": [
        250,
        300
      ],
      "credentials": {
        "githubApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "owner": "={{ $json.repository.owner.login }}",
        "repository": "={{ $json.repository.name }}",
        "operation": "get",
        "resource": "file",
        "filePath": "",
        "additionalParameters": {},
        "requestOptions": {
          "url": "={{ $json.pull_request.diff_url }}"
        }
      },
      "id": "c9d0e1f2-9999-4000-8000-000000000002",
      "name": "GitHub Get Diff",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        500,
        300
      ],
      "parameters_overwrite": {
        "method": "GET",
        "url": "={{ $json.pull_request.diff_url }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "chat",
        "operation": "message",
        "model": "gpt-4o",
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are an expert code reviewer. Review the following pull request diff and provide constructive feedback. Focus on:\n\n1. **Bugs & Logic Errors**: Identify potential bugs, edge cases, or logic issues\n2. **Security**: Flag any security vulnerabilities (SQL injection, XSS, exposed secrets, etc.)\n3. **Performance**: Note any performance concerns or optimization opportunities\n4. **Code Quality**: Comment on readability, naming, structure, and adherence to best practices\n5. **Testing**: Suggest missing test cases\n\nFormat your review as:\n## Summary\n<1-2 sentence overview>\n\n## Issues Found\n- :red_circle: **Critical**: <issue>\n- :yellow_circle: **Warning**: <issue>\n- :blue_circle: **Suggestion**: <issue>\n\n## Positive Notes\n- <what was done well>\n\n## Recommended Changes\n1. <specific change>\n\nKeep feedback constructive and actionable. Reference specific line numbers when possible."
            },
            {
              "role": "user",
              "content": "=PR Title: {{ $('GitHub Trigger').item.json.pull_request.title }}\nPR Description: {{ $('GitHub Trigger').item.json.pull_request.body || 'No description provided' }}\nAuthor: {{ $('GitHub Trigger').item.json.pull_request.user.login }}\n\nDiff:\n{{ $json.data ? $json.data.substring(0, 12000) : 'Unable to fetch diff' }}"
            }
          ]
        },
        "options": {
          "temperature": 0.3,
          "maxTokens": 2048
        }
      },
      "id": "c9d0e1f2-9999-4000-8000-000000000003",
      "name": "OpenAI Review Code",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.6,
      "position": [
        750,
        300
      ],
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://api.github.com/repos/{{ $('GitHub Trigger').item.json.repository.full_name }}/issues/{{ $('GitHub Trigger').item.json.pull_request.number }}/comments",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ body: '## :robot: AI Code Review\\n\\n' + $json.text + '\\n\\n---\\n*This review was generated by an AI assistant. Please use your judgment when applying suggestions.*' }) }}",
        "options": {}
      },
      "id": "c9d0e1f2-9999-4000-8000-000000000004",
      "name": "GitHub Post Comment",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1000,
        300
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "channel": "#code-reviews",
        "text": "=:mag: *AI Code Review Posted*\n\n*PR:* <{{ $('GitHub Trigger').item.json.pull_request.html_url }}|{{ $('GitHub Trigger').item.json.pull_request.title }}>\n*Author:* {{ $('GitHub Trigger').item.json.pull_request.user.login }}\n*Repository:* {{ $('GitHub Trigger').item.json.repository.full_name }}\n\nAI review has been posted as a comment on the PR.",
        "otherOptions": {}
      },
      "id": "c9d0e1f2-9999-4000-8000-000000000005",
      "name": "Slack Notify",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        1250,
        300
      ],
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "GitHub Trigger": {
      "main": [
        [
          {
            "node": "GitHub Get Diff",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GitHub Get Diff": {
      "main": [
        [
          {
            "node": "OpenAI Review Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Review Code": {
      "main": [
        [
          {
            "node": "GitHub Post Comment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GitHub Post Comment": {
      "main": [
        [
          {
            "node": "Slack Notify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null
}