{
  "name": "Sprint Summary",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "sprint-summary",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        0,
        0
      ],
      "id": "050ce8c6-cc3e-44e4-89e5-8944f45c6a3f",
      "name": "Webhook"
    },
    {
      "parameters": {
        "url": "={{ $env.JIRA_BASE_URL + '/rest/api/3/search/jql?jql=project=' + ($env.JIRA_PROJECT_KEY || 'JAN') + '&maxResults=100&fields=summary,status,assignee' }}",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "jiraSoftwareCloudApi",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "683a50d8-34d8-4676-b49d-de179005998f",
      "name": "Get Jira Issues",
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const fullResponse = $input.item.json;\nconst issues = fullResponse.issues || [];\n\nconst statusCount = {};\n\nissues.forEach(issue => {\n  const status = issue.fields?.status?.name;\n  if (status) {\n    statusCount[status] = (statusCount[status] || 0) + 1;\n  }\n});\n\nconst total = issues.length;\nconst done = statusCount['Done'] || 0;\nconst completion = total > 0 ? Math.round((done / total) * 100) : 0;\nconst filled = Math.round(completion / 5);\nconst empty = 20 - filled;\nconst progressBar = '\u2588'.repeat(filled) + '\u2591'.repeat(empty);\nconst statusLines = Object.entries(statusCount)\n  .map(([status, count]) => `\u2022 ${status}: ${count}`)\n  .join('\\n') || '\u2022 No statuses found';\n\nconst message = `\ud83d\udcca *Board Summary (JAN)*\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\n\ud83d\udcc8 Completion: ${completion}%\n\\`${progressBar}\\`\n\n\ud83d\udcca *Status Breakdown*\n${statusLines}\n- Total Issues: ${total}\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`;\n\nreturn [{ json: { message, completion, statusCount, total } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        416,
        0
      ],
      "id": "35177461-58d4-4fb1-8b40-b3909c8a466b",
      "name": "Build Summary"
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "={{ $env.SLACK_DEFAULT_CHANNEL_ID }}",
          "mode": "id"
        },
        "text": "={{ $json.message }}",
        "otherOptions": {}
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.4,
      "position": [
        624,
        0
      ],
      "id": "d0031467-09a7-4519-b74a-089cc5fb16b7",
      "name": "Send a message",
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Get Jira Issues",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Jira Issues": {
      "main": [
        [
          {
            "node": "Build Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Summary": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false
  },
  "versionId": "8b68d01e-6c0a-4dd1-8e44-18fe77649521",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "4l82s__0vHKpkxRh4qlXU",
  "tags": []
}