LintBot: Tu asistente automatizado para la calidad del código

Avanzado

Este es unEngineering, AIflujo de automatización del dominio deautomatización que contiene 20 nodos.Utiliza principalmente nodos como Set, Code, Webhook, Aggregate, HttpRequest, combinando tecnología de inteligencia artificial para lograr automatización inteligente. Automatización de la revisión de código PR de GitHub y la reparación automática usando Google Gemini AI

Requisitos previos
  • Punto final de HTTP Webhook (n8n generará automáticamente)
  • Pueden requerirse credenciales de autenticación para la API de destino
  • Clave de API de Google Gemini
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "id": "mfAxsn2XqfEzDtYr",
  "meta": {
    "instanceId": "24ca526572eca60ee26bbee4ba7087b1023a6874af4ebeed61b2d126e50e531b",
    "templateCredsSetupCompleted": true
  },
  "name": "LintBot: Your Automated Code Quality Assistant",
  "tags": [],
  "nodes": [
    {
      "id": "8dedfb4b-d477-4fa5-9a9b-68b74450d1fe",
      "name": "Escuchar Activador desde Github Workflow",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -1040,
        -540
      ],
      "webhookId": "1da5a6e1-9453-4a65-bbac-a1fed633f6ad",
      "parameters": {
        "path": "1da5a6e1-9453-4a65-bbac-a1fed633f6ad",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          }
        },
        "responseMode": "responseNode"
      },
      "typeVersion": 1
    },
    {
      "id": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
      "name": "Agente de IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1780,
        -580
      ],
      "parameters": {
        "text": "=<files>\n{{ JSON.stringify($json.data) }}\n</files>",
        "options": {
          "systemMessage": "=You are an expert at code linting. Your job is to receive a JSON-formatted request with various file paths and the code inside each file.\n\nYou will:\n\n1. Look for and fix any linting issues in the files.\n2. First, check if a branch exists and if, create a new branch using the name {{ $('Get PR GitHub Branch').item.json.head.ref }}-linting-fix. If so, use the existing branch.\n3. Commit the new files with fixes to the branch.\n4. Create a PR from that branch with the name: \"Linting fixes for PR:{{ $('Listen for Trigger from Github Workflow').item.json.pull_request_number }}\""
        },
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "0e043c94-5b69-41f5-9f27-9dd5ea45a628",
      "name": "Responder a Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        2200,
        -660
      ],
      "parameters": {
        "options": {},
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.2
    },
    {
      "id": "68047540-a8ea-4836-9d5b-3b81515f98fc",
      "name": "Obtener Archivos del PR",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        360,
        -540
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/pulls/{{ $('Listen for Trigger from Github Workflow').item.json.pull_request_number }}/files",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "29b9cace-ceaa-446c-a547-ac25c4331d5a",
      "name": "Obtener Contenido de Archivos",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        580,
        -540
      ],
      "parameters": {
        "url": "={{ $json.contents_url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "a8920578-706a-4ed6-8c58-9be88f16420c",
      "name": "Convertir Base64 a Archivo de Texto",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        780,
        -540
      ],
      "parameters": {
        "options": {},
        "operation": "toBinary",
        "sourceProperty": "content"
      },
      "typeVersion": 1.1
    },
    {
      "id": "1fccb56b-ca82-4c9b-9ede-f669a97067f6",
      "name": "Extraer de Archivo",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        980,
        -560
      ],
      "parameters": {
        "options": {},
        "operation": "text"
      },
      "typeVersion": 1
    },
    {
      "id": "543be972-e489-4ca0-8a43-d77442081016",
      "name": "Crear Objeto Código/Ruta de Archivo",
      "type": "n8n-nodes-base.set",
      "position": [
        1200,
        -560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d18801c8-8c93-4c66-add8-0a5915ac3a6f",
              "name": "code",
              "type": "string",
              "value": "={{ $json.data }}"
            },
            {
              "id": "6da8a116-f59e-481c-a815-acda60e19398",
              "name": "filePath",
              "type": "string",
              "value": "={{ $('Get File Contents').item.json.path }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ac2ac571-5a1c-4f06-b45f-296fc43557c8",
      "name": "Recopilar Todos los Archivos Modificados",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1440,
        -560
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "9062c98b-6937-4411-9a21-6f047084ab78",
      "name": "Obtener Rama GitHub del PR",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -580,
        -520
      ],
      "parameters": {
        "url": "={{ $json.gitHubApiBaseEndpointUri }}/pulls/{{ $('Listen for Trigger from Github Workflow').item.json.pull_request_number }}",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8c9f3d57-b73d-46a1-a7f8-b8ea49fbdbd0",
      "name": "Crear Blob GitHub",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        1660,
        -120
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/blobs",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "content",
              "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', ``, 'string') }}"
            },
            {
              "name": "encoding",
              "value": "utf-8"
            }
          ]
        },
        "toolDescription": "Creates a GitHub blob for a file",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3bba3645-f54e-46aa-866f-426404581221",
      "name": "Crear Árbol GitHub",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        1880,
        -120
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/trees",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"base_tree\": \"{{ $('Get Latest Main Branch Tree Hash').item.json.tree.sha }}\",\n  \"tree\": {{ $fromAI('json_array_of_files','','string') }}\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "toolDescription": "Creates a GitHub tree object with one file",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "26213bce-5117-475c-98a1-926140cdeec4",
      "name": "Crear Commit GitHub",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        2080,
        -140
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/commits",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"message\": \"{{ $fromAI('message', '', 'string').replace(/\\n/g, '\\\\n') }}\",\n  \"tree\": \"{{ $fromAI('treeHash', '', 'string') }}\",\n  \"parents\": [\n    \"{{ $('Get Latest Main Branch Commit SHA').item.json.object.sha }}\"\n  ]\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "toolDescription": "Creates a commit from the new tree. ",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "cb6918d1-4345-4f77-8667-c4ae6c790db5",
      "name": "Crear Pull Request",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        2580,
        -520
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/pulls",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"title\": \"{{ $fromAI('title','','string') }}\",\n  \"head\": \"refs/heads/{{ $fromAI('head','','string') }}\",\n  \"base\": \"main\",\n  \"body\": \"{{ $fromAI('body','','string') }}\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "toolDescription": "Creates a Pull Request",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8b9240b2-e23a-4f49-851a-1810d24f1bf3",
      "name": "Crear Rama",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        2480,
        -300
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/refs",
        "method": "POST",
        "options": {},
        "jsonBody": "=  {\n    \"ref\": \"refs/heads/{{ $fromAI('branch_ref','','string') }}\",\n    \"sha\": \"{{ $fromAI('commit_sha','','string') }}\"\n  }",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "toolDescription": "Creates a branch to point to the new commit",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ea314631-174f-4d03-a947-0710b2870ed1",
      "name": "Obtener SHA del Último Commit en Main",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -340,
        -540
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/ref/heads/main",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "36633281-8335-4381-9393-cb1f64390bee",
      "name": "Obtener Hash del Árbol de la Rama Main Más Reciente",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        140,
        -540
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/git/commits/{{ $json.object.sha }}",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "435d5b12-3a71-4dbf-9d5d-97b30b249414",
      "name": "Obtener Rama",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        2280,
        -200
      ],
      "parameters": {
        "url": "={{ $('Set Common Fields').item.json.gitHubApiBaseEndpointUri }}/branches/{{ $fromAI('branch_name','','string') }}",
        "options": {},
        "authentication": "predefinedCredentialType",
        "toolDescription": "Get a branch from the GitHub repo",
        "nodeCredentialType": "githubApi"
      },
      "credentials": {
        "githubApi": {
          "id": "MI5Ul9UqEbdI0RRe",
          "name": "GitHub account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b26415fa-b898-4d79-a7da-8f66451f0747",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1500,
        -340
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.0-flash"
      },
      "credentials": {
        "googlePalmApi": {
          "id": "ARYVKWu9TZzwQ3fB",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9ec4b763-a3c8-4d5b-a50c-64842038a4ba",
      "name": "Establecer Campos Comunes",
      "type": "n8n-nodes-base.code",
      "position": [
        -820,
        -540
      ],
      "parameters": {
        "jsCode": "const commonFields = {\n  'gitHubRepoName': 'my-membership',\n  'gitHubOrgName': 'carved-rock-fitness-gym'\n}\ncommonFields['gitHubApiBaseEndpointUri'] = `https://api.github.com/repos/${commonFields.gitHubOrgName}/${commonFields.gitHubRepoName}`\n\nreturn commonFields"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "pinData": {
    "Listen for Trigger from Github Workflow": [
      {
        "json": {
          "pull_request_number": 204
        }
      }
    ]
  },
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "17951810-1716-46ae-90bb-d698a6062483",
  "connections": {
    "4bec8f3a-5670-4fe5-916f-b7fab3165880": {
      "main": [
        [
          {
            "node": "0e043c94-5b69-41f5-9f27-9dd5ea45a628",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "435d5b12-3a71-4dbf-9d5d-97b30b249414": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "68047540-a8ea-4836-9d5b-3b81515f98fc": {
      "main": [
        [
          {
            "node": "29b9cace-ceaa-446c-a547-ac25c4331d5a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8b9240b2-e23a-4f49-851a-1810d24f1bf3": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "1fccb56b-ca82-4c9b-9ede-f669a97067f6": {
      "main": [
        [
          {
            "node": "543be972-e489-4ca0-8a43-d77442081016",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "29b9cace-ceaa-446c-a547-ac25c4331d5a": {
      "main": [
        [
          {
            "node": "a8920578-706a-4ed6-8c58-9be88f16420c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9ec4b763-a3c8-4d5b-a50c-64842038a4ba": {
      "main": [
        [
          {
            "node": "9062c98b-6937-4411-9a21-6f047084ab78",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8c9f3d57-b73d-46a1-a7f8-b8ea49fbdbd0": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "3bba3645-f54e-46aa-866f-426404581221": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "cb6918d1-4345-4f77-8667-c4ae6c790db5": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "26213bce-5117-475c-98a1-926140cdeec4": {
      "ai_tool": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "9062c98b-6937-4411-9a21-6f047084ab78": {
      "main": [
        [
          {
            "node": "ea314631-174f-4d03-a947-0710b2870ed1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b26415fa-b898-4d79-a7da-8f66451f0747": {
      "ai_languageModel": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "ac2ac571-5a1c-4f06-b45f-296fc43557c8": {
      "main": [
        [
          {
            "node": "4bec8f3a-5670-4fe5-916f-b7fab3165880",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a8920578-706a-4ed6-8c58-9be88f16420c": {
      "main": [
        [
          {
            "node": "1fccb56b-ca82-4c9b-9ede-f669a97067f6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "543be972-e489-4ca0-8a43-d77442081016": {
      "main": [
        [
          {
            "node": "ac2ac571-5a1c-4f06-b45f-296fc43557c8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "36633281-8335-4381-9393-cb1f64390bee": {
      "main": [
        [
          {
            "node": "68047540-a8ea-4836-9d5b-3b81515f98fc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ea314631-174f-4d03-a947-0710b2870ed1": {
      "main": [
        [
          {
            "node": "36633281-8335-4381-9393-cb1f64390bee",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8dedfb4b-d477-4fa5-9a9b-68b74450d1fe": {
      "main": [
        [
          {
            "node": "9ec4b763-a3c8-4d5b-a50c-64842038a4ba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Avanzado - Ingeniería, Inteligencia Artificial

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Avanzado
Número de nodos20
Categoría2
Tipos de nodos11
Descripción de la dificultad

Adecuado para usuarios avanzados, flujos de trabajo complejos con 16+ nodos

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34