The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "jump-section: Planning Pipeline",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"weeksInterval": 1,
"triggerAtDay": [
1
],
"triggerAtHour": 9,
"triggerAtMinute": 0
}
]
}
},
"id": "schedule-trigger",
"name": "Schedule (\ub9e4\uc8fc \uc6d4\uc694\uc77c 09:00)",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
240,
300
]
},
{
"parameters": {
"method": "GET",
"url": "https://api.github.com/repos/bae080311/jump-section/issues",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Accept",
"value": "application/vnd.github+json"
},
{
"name": "X-GitHub-Api-Version",
"value": "2022-11-28"
},
{
"name": "Authorization",
"value": "=Bearer {{ $env.GITHUB_TOKEN }}"
}
]
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "state",
"value": "open"
},
{
"name": "per_page",
"value": "20"
}
]
},
"options": {}
},
"id": "get-open-issues",
"name": "GitHub: Open Issues \uc870\ud68c",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
460,
300
]
},
{
"parameters": {
"method": "GET",
"url": "https://api.github.com/repos/bae080311/jump-section/commits",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Accept",
"value": "application/vnd.github+json"
},
{
"name": "X-GitHub-Api-Version",
"value": "2022-11-28"
},
{
"name": "Authorization",
"value": "=Bearer {{ $env.GITHUB_TOKEN }}"
}
]
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "since",
"value": "={{ new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString() }}"
},
{
"name": "per_page",
"value": "20"
}
]
},
"options": {}
},
"id": "get-recent-commits",
"name": "GitHub: \ucd5c\uadfc \ucee4\ubc0b \uc870\ud68c",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
300
]
},
{
"parameters": {
"jsCode": "const issues = $('GitHub: Open Issues \uc870\ud68c').all().map(i => i.json);\nconst commits = $('GitHub: \ucd5c\uadfc \ucee4\ubc0b \uc870\ud68c').all().map(c => c.json);\n\nconst issuesSummary = issues\n .slice(0, 10)\n .map(i => `#${i.number}: ${i.title} [${(i.labels || []).map(l => l.name).join(', ')}]`)\n .join('\\n') || '\uc5c6\uc74c';\n\nconst commitsSummary = commits\n .slice(0, 10)\n .map(c => `- ${c.commit.message.split('\\n')[0]}`)\n .join('\\n') || '\uc5c6\uc74c';\n\nconst userPrompt = `## \ud504\ub85c\uc81d\ud2b8: jump-section\\n- \uc124\uba85: IntersectionObserver \uae30\ubc18 \uc139\uc158 \uc2a4\ud06c\ub864 \uad00\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac\\n- \ud328\ud0a4\uc9c0: @jump-section/core, /react, /vue, /svelte\\n\\n## \ud604\uc7ac Open Issues\\n${issuesSummary}\\n\\n## \uc9c0\ub09c 7\uc77c \ucee4\ubc0b\\n${commitsSummary}\\n\\n\ub2e4\uc74c JSON \ubc30\uc5f4 \ud615\uc2dd\uc73c\ub85c\ub9cc \uac1c\uc120 \uc544\uc774\ub514\uc5b4 5\uac1c\ub97c \uc81c\uc548\ud558\uc138\uc694:\\n[\\n {\\n \"title\": \"\uc774\uc288 \uc81c\ubaa9 (\uc601\uc5b4, 50\uc790 \uc774\ub0b4)\",\\n \"body\": \"## Summary\\\\n\\\\n\uc124\uba85\\\\n\\\\n## Proposed Solution\\\\n\\\\n\uad6c\ud604 \ubc29\ud5a5\\\\n\\\\n## Acceptance Criteria\\\\n\\\\n- [ ] \uc870\uac74\",\\n \"labels\": [\"enhancement\", \"ai-proposal\", \"gemini\"]\\n }\\n]`;\n\nconst geminiPayload = {\n system_instruction: {\n parts: [{ text: '\ub2f9\uc2e0\uc740 \uc624\ud508\uc18c\uc2a4 JavaScript \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \uae30\uc220 \uae30\ud68d\uc790\uc785\ub2c8\ub2e4. \ubc18\ub4dc\uc2dc JSON \ubc30\uc5f4\ub9cc \uc751\ub2f5\ud558\uc138\uc694. \ub9c8\ud06c\ub2e4\uc6b4 \ucf54\ub4dc\ube14\ub85d \uc5c6\uc774 \uc21c\uc218 JSON\ub9cc \ucd9c\ub825\ud558\uc138\uc694.' }]\n },\n contents: [{ role: 'user', parts: [{ text: userPrompt }] }],\n generationConfig: { maxOutputTokens: 4096, responseMimeType: 'application/json' }\n};\n\nreturn [{ json: { geminiPayload } }];"
},
"id": "prepare-context",
"name": "\ucee8\ud14d\uc2a4\ud2b8 \uc900\ube44",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
900,
300
]
},
{
"parameters": {
"method": "POST",
"url": "=https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key={{ $env.GEMINI_API_KEY }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ $json.geminiPayload }}",
"options": {}
},
"id": "gemini-planning",
"name": "Gemini: \uae30\ud68d \uc544\uc774\ub514\uc5b4",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1120,
300
]
},
{
"parameters": {
"jsCode": "const geminiResponse = $('Gemini: \uae30\ud68d \uc544\uc774\ub514\uc5b4').first().json;\nconst geminiText = geminiResponse.candidates[0].content.parts[0].text.trim();\n\nfunction parseIdeas(text) {\n try {\n return JSON.parse(text);\n } catch (e) {\n const match = text.match(/\\[([\\s\\S]*?)\\]/);\n if (!match) return [];\n try { return JSON.parse('[' + match[1] + ']'); } catch(e2) { return []; }\n }\n}\n\nconst ideas = parseIdeas(geminiText);\nif (ideas.length === 0) throw new Error('Gemini \uc544\uc774\ub514\uc5b4 \ud30c\uc2f1 \uc2e4\ud328. \uc751\ub2f5: ' + geminiText.slice(0, 300));\n\nreturn ideas.map(idea => ({ json: { ...idea, _source: 'Gemini' } }));"
},
"id": "parse-ideas",
"name": "\uc544\uc774\ub514\uc5b4 \ud30c\uc2f1",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1340,
300
]
},
{
"parameters": {
"method": "POST",
"url": "https://api.github.com/repos/bae080311/jump-section/issues",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Accept",
"value": "application/vnd.github+json"
},
{
"name": "X-GitHub-Api-Version",
"value": "2022-11-28"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Authorization",
"value": "=Bearer {{ $env.GITHUB_TOKEN }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { title: $json.title, body: $json.body + '\\n\\n---\\n*\ud83e\udd16 ' + $json._source + ' AI\uac00 \uc790\ub3d9 \uc0dd\uc131\ud55c \uae30\ud68d \uc774\uc288\uc785\ub2c8\ub2e4. \uad6c\ud604\ud558\ub824\uba74 `ai-implement` \ub77c\ubca8\uc744 \ucd94\uac00\ud558\uc138\uc694.*', labels: $json.labels } }}",
"options": {}
},
"id": "create-issue",
"name": "GitHub: Issue \uc0dd\uc131",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1560,
300
]
},
{
"parameters": {
"jsCode": "const allItems = $('GitHub: Issue \uc0dd\uc131').all();\nconst issues = allItems.map(item => ({\n number: item.json.number,\n title: item.json.title,\n url: item.json.html_url\n}));\n\nconst lines = issues.map(i => `\u2022 [#${i.number}](${i.url}) ${i.title}`).join('\\n');\n\nreturn [{ json: { issueCount: issues.length, issueLines: lines } }];"
},
"id": "aggregate-issues",
"name": "\uc774\uc288 \uc9d1\uacc4",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1780,
300
]
},
{
"parameters": {
"method": "POST",
"url": "={{ $env.DISCORD_WEBHOOK_URL }}",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { embeds: [{ title: '\ud83d\uddd3\ufe0f \uc8fc\uac04 \uae30\ud68d \uc644\ub8cc', description: 'Gemini AI\uac00 \uc774\ubc88 \uc8fc **' + $json.issueCount + '\uac1c**\uc758 \uac1c\uc120 \uc774\uc288\ub97c \uc0dd\uc131\ud588\uc2b5\ub2c8\ub2e4.', color: 5814783, fields: [{ name: '\uc0dd\uc131\ub41c \uc774\uc288', value: $json.issueLines, inline: false }], footer: { text: 'jump-section AI Pipeline \u2022 Gemini' }, timestamp: new Date().toISOString() }] } }}",
"options": {}
},
"id": "discord-planning",
"name": "Discord: \uae30\ud68d \uc644\ub8cc \uc54c\ub9bc",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
2000,
300
]
}
],
"connections": {
"Schedule (\ub9e4\uc8fc \uc6d4\uc694\uc77c 09:00)": {
"main": [
[
{
"node": "GitHub: Open Issues \uc870\ud68c",
"type": "main",
"index": 0
}
]
]
},
"GitHub: Open Issues \uc870\ud68c": {
"main": [
[
{
"node": "GitHub: \ucd5c\uadfc \ucee4\ubc0b \uc870\ud68c",
"type": "main",
"index": 0
}
]
]
},
"GitHub: \ucd5c\uadfc \ucee4\ubc0b \uc870\ud68c": {
"main": [
[
{
"node": "\ucee8\ud14d\uc2a4\ud2b8 \uc900\ube44",
"type": "main",
"index": 0
}
]
]
},
"\ucee8\ud14d\uc2a4\ud2b8 \uc900\ube44": {
"main": [
[
{
"node": "Gemini: \uae30\ud68d \uc544\uc774\ub514\uc5b4",
"type": "main",
"index": 0
}
]
]
},
"Gemini: \uae30\ud68d \uc544\uc774\ub514\uc5b4": {
"main": [
[
{
"node": "\uc544\uc774\ub514\uc5b4 \ud30c\uc2f1",
"type": "main",
"index": 0
}
]
]
},
"\uc544\uc774\ub514\uc5b4 \ud30c\uc2f1": {
"main": [
[
{
"node": "GitHub: Issue \uc0dd\uc131",
"type": "main",
"index": 0
}
]
]
},
"GitHub: Issue \uc0dd\uc131": {
"main": [
[
{
"node": "\uc774\uc288 \uc9d1\uacc4",
"type": "main",
"index": 0
}
]
]
},
"\uc774\uc288 \uc9d1\uacc4": {
"main": [
[
{
"node": "Discord: \uae30\ud68d \uc644\ub8cc \uc54c\ub9bc",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"tags": [
{
"name": "jump-section"
},
{
"name": "planning"
}
]
}
About this workflow
jump-section: Planning Pipeline. Uses scheduleTrigger, httpRequest. Scheduled trigger; 9 nodes.
Source: https://github.com/bae080311/jump-section/blob/c566471882fa8b8f0e4d00704693b7c92d62c519/.n8n/workflows/planning-pipeline.json — original creator credit. Request a take-down →