diff --git a/.github/workflows/brave.lock.yml b/.github/workflows/brave.lock.yml index e7a666b451..30827f54d9 100644 --- a/.github/workflows/brave.lock.yml +++ b/.github/workflows/brave.lock.yml @@ -4117,8 +4117,23 @@ jobs: GITHUB_AW_WORKFLOW_NAME: "Brave Web Search Agent" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -4252,6 +4267,11 @@ jobs: core.info('Target is "triggering" but not running in issue, pull request, or discussion context, skipping comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < commentItems.length; i++) { const commentItem = commentItems[i]; @@ -4318,7 +4338,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; if (isDiscussion) { diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml index 622ea278f7..d2771eb0a4 100644 --- a/.github/workflows/ci-doctor.lock.yml +++ b/.github/workflows/ci-doctor.lock.yml @@ -3518,8 +3518,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3575,6 +3590,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -3625,7 +3645,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); @@ -3761,8 +3794,23 @@ jobs: GITHUB_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/main/workflows/ci-doctor.md" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3896,6 +3944,11 @@ jobs: core.info('Target is "triggering" but not running in issue, pull request, or discussion context, skipping comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < commentItems.length; i++) { const commentItem = commentItems[i]; @@ -3962,7 +4015,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; if (isDiscussion) { diff --git a/.github/workflows/dev.lock.yml b/.github/workflows/dev.lock.yml index 04fdbff9f3..172343d904 100644 --- a/.github/workflows/dev.lock.yml +++ b/.github/workflows/dev.lock.yml @@ -3352,8 +3352,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3409,6 +3424,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -3459,7 +3479,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index 590911b752..bc8b352512 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -3036,8 +3036,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3093,6 +3108,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -3143,7 +3163,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/example-workflow-analyzer.lock.yml b/.github/workflows/example-workflow-analyzer.lock.yml index e9eb954ae4..55bd5174cd 100644 --- a/.github/workflows/example-workflow-analyzer.lock.yml +++ b/.github/workflows/example-workflow-analyzer.lock.yml @@ -3006,8 +3006,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3063,6 +3078,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -3113,7 +3133,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 7f715beda2..51d91342a0 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -3122,8 +3122,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3179,6 +3194,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -3229,7 +3249,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/pdf-summary.lock.yml b/.github/workflows/pdf-summary.lock.yml index 8dabdf6344..ee41184626 100644 --- a/.github/workflows/pdf-summary.lock.yml +++ b/.github/workflows/pdf-summary.lock.yml @@ -4071,8 +4071,23 @@ jobs: GITHUB_AW_WORKFLOW_NAME: "Resource Summarizer Agent" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -4206,6 +4221,11 @@ jobs: core.info('Target is "triggering" but not running in issue, pull request, or discussion context, skipping comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < commentItems.length; i++) { const commentItem = commentItems[i]; @@ -4272,7 +4292,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; if (isDiscussion) { diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml index 1bc51e0fc0..7932311318 100644 --- a/.github/workflows/plan.lock.yml +++ b/.github/workflows/plan.lock.yml @@ -3958,8 +3958,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -4015,6 +4030,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -4065,7 +4085,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/poem-bot.lock.yml b/.github/workflows/poem-bot.lock.yml index 14acfb09dd..062eae267b 100644 --- a/.github/workflows/poem-bot.lock.yml +++ b/.github/workflows/poem-bot.lock.yml @@ -4110,8 +4110,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -4167,6 +4182,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -4217,7 +4237,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); @@ -4351,8 +4384,23 @@ jobs: GITHUB_AW_SAFE_OUTPUTS_STAGED: "true" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -4486,6 +4534,11 @@ jobs: core.info('Target is "triggering" but not running in issue, pull request, or discussion context, skipping comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < commentItems.length; i++) { const commentItem = commentItems[i]; @@ -4552,7 +4605,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; if (isDiscussion) { @@ -4621,8 +4682,23 @@ jobs: GITHUB_AW_SAFE_OUTPUTS_STAGED: "true" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -4711,6 +4787,11 @@ jobs: core.info('Target is "triggering" but not running in pull request context, skipping review comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < reviewCommentItems.length; i++) { const commentItem = reviewCommentItems[i]; @@ -4811,7 +4892,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); core.info( `Creating review comment on PR #${pullRequestNumber} at ${commentItem.path}:${line}${startLine ? ` (lines ${startLine}-${line})` : ""} [${side}]` ); diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index fbe48af7d5..4943a66f18 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -4439,8 +4439,23 @@ jobs: GITHUB_AW_WORKFLOW_NAME: "Scout" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -4574,6 +4589,11 @@ jobs: core.info('Target is "triggering" but not running in issue, pull request, or discussion context, skipping comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < commentItems.length; i++) { const commentItem = commentItems[i]; @@ -4640,7 +4660,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; if (isDiscussion) { diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index 6980374674..d2d9130094 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -2964,8 +2964,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3021,6 +3036,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -3071,7 +3091,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index 89c7505b54..f523970bf6 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -2782,8 +2782,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -2839,6 +2854,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -2889,7 +2909,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 5fd15eef25..fdcf8006dc 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -3350,8 +3350,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3407,6 +3422,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -3457,7 +3477,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/smoke-genaiscript.lock.yml b/.github/workflows/smoke-genaiscript.lock.yml index fef8fa5e17..997bf9e44d 100644 --- a/.github/workflows/smoke-genaiscript.lock.yml +++ b/.github/workflows/smoke-genaiscript.lock.yml @@ -2143,8 +2143,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -2200,6 +2215,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -2250,7 +2270,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/smoke-opencode.lock.yml b/.github/workflows/smoke-opencode.lock.yml index fa6eec16c4..29db310842 100644 --- a/.github/workflows/smoke-opencode.lock.yml +++ b/.github/workflows/smoke-opencode.lock.yml @@ -2111,8 +2111,23 @@ jobs: sanitized = sanitized.replace(/[<>&'"]/g, ""); return sanitized.trim(); } - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -2168,6 +2183,11 @@ jobs: return; } const parentIssueNumber = context.payload?.issue?.number; + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -2218,7 +2238,20 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/.github/workflows/technical-doc-writer.lock.yml b/.github/workflows/technical-doc-writer.lock.yml index 9924d8dd0e..9bfe13e12c 100644 --- a/.github/workflows/technical-doc-writer.lock.yml +++ b/.github/workflows/technical-doc-writer.lock.yml @@ -3328,8 +3328,23 @@ jobs: GITHUB_AW_WORKFLOW_NAME: "Technical Documentation Writer for GitHub Actions" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3463,6 +3478,11 @@ jobs: core.info('Target is "triggering" but not running in issue, pull request, or discussion context, skipping comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < commentItems.length; i++) { const commentItem = commentItems[i]; @@ -3529,7 +3549,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; if (isDiscussion) { diff --git a/.github/workflows/unbloat-docs.lock.yml b/.github/workflows/unbloat-docs.lock.yml index c3fc33f000..b373e92792 100644 --- a/.github/workflows/unbloat-docs.lock.yml +++ b/.github/workflows/unbloat-docs.lock.yml @@ -3658,8 +3658,23 @@ jobs: GITHUB_AW_WORKFLOW_NAME: "Documentation Unbloat" with: script: | - function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { + function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -3793,6 +3808,11 @@ jobs: core.info('Target is "triggering" but not running in issue, pull request, or discussion context, skipping comment creation'); return; } + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; const createdComments = []; for (let i = 0; i < commentItems.length; i++) { const commentItem = commentItems[i]; @@ -3859,7 +3879,15 @@ jobs: const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; if (isDiscussion) { diff --git a/pkg/workflow/js/add_comment.cjs b/pkg/workflow/js/add_comment.cjs index 5a88640c4b..e729e56051 100644 --- a/pkg/workflow/js/add_comment.cjs +++ b/pkg/workflow/js/add_comment.cjs @@ -4,11 +4,31 @@ * @param {string} runUrl - URL of the workflow run * @param {string} workflowSource - Source of the workflow (owner/repo/path@ref) * @param {string} workflowSourceURL - GitHub URL for the workflow source + * @param {number|undefined} triggeringIssueNumber - Issue number that triggered this workflow + * @param {number|undefined} triggeringPRNumber - Pull request number that triggered this workflow + * @param {number|undefined} triggeringDiscussionNumber - Discussion number that triggered this workflow * @returns {string} Footer text */ -function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { +function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber +) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + // Add reference to triggering issue/PR/discussion if available + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } + if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -194,6 +214,13 @@ async function main() { return; } + // Extract triggering context for footer generation + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; + const createdComments = []; // Process each comment item @@ -272,7 +299,15 @@ async function main() { const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); try { let comment; diff --git a/pkg/workflow/js/add_comment.test.cjs b/pkg/workflow/js/add_comment.test.cjs index 8a89f35dd7..1e20750b6b 100644 --- a/pkg/workflow/js/add_comment.test.cjs +++ b/pkg/workflow/js/add_comment.test.cjs @@ -384,4 +384,74 @@ describe("add_comment.cjs", () => { expect(callArgs.body).toContain("Test content with fallback"); expect(callArgs.body).toContain("https://github.com/testowner/testrepo/actions/runs/12345"); }); + + it("should include triggering issue number in footer when in issue context", async () => { + process.env.GITHUB_AW_AGENT_OUTPUT = JSON.stringify({ + items: [ + { + type: "add_comment", + body: "Comment from issue context", + }, + ], + }); + process.env.GITHUB_AW_WORKFLOW_NAME = "Test Workflow"; + + // Simulate issue context + global.context.eventName = "issues"; + global.context.payload.issue = { number: 42 }; + + const mockComment = { + id: 789, + html_url: "https://github.com/testowner/testrepo/issues/42#issuecomment-789", + }; + + mockGithub.rest.issues.createComment.mockResolvedValue({ data: mockComment }); + + // Execute the script + await eval(`(async () => { ${createCommentScript} })()`); + + const callArgs = mockGithub.rest.issues.createComment.mock.calls[0][0]; + + // Check that the footer includes reference to triggering issue + expect(callArgs.body).toContain("Comment from issue context"); + expect(callArgs.body).toContain("AI generated by [Test Workflow]"); + expect(callArgs.body).toContain("for #42"); + }); + + it("should include triggering PR number in footer when in PR context", async () => { + process.env.GITHUB_AW_AGENT_OUTPUT = JSON.stringify({ + items: [ + { + type: "add_comment", + body: "Comment from PR context", + }, + ], + }); + process.env.GITHUB_AW_WORKFLOW_NAME = "Test Workflow"; + + // Simulate PR context + global.context.eventName = "pull_request"; + delete global.context.payload.issue; + global.context.payload.pull_request = { number: 123 }; + + const mockComment = { + id: 890, + html_url: "https://github.com/testowner/testrepo/pull/123#issuecomment-890", + }; + + mockGithub.rest.issues.createComment.mockResolvedValue({ data: mockComment }); + + // Execute the script + await eval(`(async () => { ${createCommentScript} })()`); + + const callArgs = mockGithub.rest.issues.createComment.mock.calls[0][0]; + + // Check that the footer includes reference to triggering PR + expect(callArgs.body).toContain("Comment from PR context"); + expect(callArgs.body).toContain("AI generated by [Test Workflow]"); + expect(callArgs.body).toContain("for #123"); + + // Clean up + delete global.context.payload.pull_request; + }); }); diff --git a/pkg/workflow/js/create_issue.cjs b/pkg/workflow/js/create_issue.cjs index 4519e92f37..1a44d2c328 100644 --- a/pkg/workflow/js/create_issue.cjs +++ b/pkg/workflow/js/create_issue.cjs @@ -19,11 +19,31 @@ function sanitizeLabelContent(content) { * @param {string} runUrl - URL of the workflow run * @param {string} workflowSource - Source of the workflow (owner/repo/path@ref) * @param {string} workflowSourceURL - GitHub URL for the workflow source + * @param {number|undefined} triggeringIssueNumber - Issue number that triggered this workflow + * @param {number|undefined} triggeringPRNumber - Pull request number that triggered this workflow + * @param {number|undefined} triggeringDiscussionNumber - Discussion number that triggered this workflow * @returns {string} Footer text */ -function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { +function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber +) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + // Add reference to triggering issue/PR/discussion if available + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } + if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -81,6 +101,14 @@ async function main() { return; } const parentIssueNumber = context.payload?.issue?.number; + + // Extract triggering context for footer generation + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; + const labelsEnv = process.env.GITHUB_AW_ISSUE_LABELS; let envLabels = labelsEnv ? labelsEnv @@ -132,7 +160,20 @@ async function main() { const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - bodyLines.push(``, ``, generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL).trimEnd(), ""); + bodyLines.push( + ``, + ``, + generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ).trimEnd(), + "" + ); const body = bodyLines.join("\n").trim(); core.info(`Creating issue with title: ${title}`); core.info(`Labels: ${labels}`); diff --git a/pkg/workflow/js/create_issue.test.cjs b/pkg/workflow/js/create_issue.test.cjs index 974331c2aa..63771628e3 100644 --- a/pkg/workflow/js/create_issue.test.cjs +++ b/pkg/workflow/js/create_issue.test.cjs @@ -603,4 +603,113 @@ describe("create_issue.cjs", () => { expect(callArgs.body).not.toContain("gh aw add"); expect(callArgs.body).not.toContain("usage guide"); }); + + it("should include triggering issue number in footer when in issue context", async () => { + process.env.GITHUB_AW_AGENT_OUTPUT = JSON.stringify({ + items: [ + { + type: "create_issue", + title: "New issue from issue context", + body: "Created from issue #42", + }, + ], + }); + process.env.GITHUB_AW_WORKFLOW_NAME = "Test Workflow"; + + // Simulate issue context + global.context.payload.issue = { number: 42 }; + + const mockIssue = { + number: 999, + html_url: "https://github.com/testowner/testrepo/issues/999", + }; + + mockGithub.rest.issues.create.mockResolvedValue({ data: mockIssue }); + + // Mock graphql for sub-issue linking + mockGithub.graphql.mockResolvedValue({ + repository: { issue: { id: "test-id" } }, + addSubIssue: { subIssue: { id: "test-id", number: 999 } }, + }); + + // Execute the script + await eval(`(async () => { ${createIssueScript} })()`); + + const callArgs = mockGithub.rest.issues.create.mock.calls[0][0]; + + // Check that the footer includes reference to triggering issue + expect(callArgs.body).toContain("AI generated by [Test Workflow]"); + expect(callArgs.body).toContain("for #42"); + }); + + it("should include triggering PR number in footer when in PR context", async () => { + process.env.GITHUB_AW_AGENT_OUTPUT = JSON.stringify({ + items: [ + { + type: "create_issue", + title: "New issue from PR context", + body: "Created from PR", + }, + ], + }); + process.env.GITHUB_AW_WORKFLOW_NAME = "Test Workflow"; + + // Simulate PR context (issue with pull_request object) + delete global.context.payload.issue; + global.context.payload.pull_request = { number: 123 }; + + const mockIssue = { + number: 888, + html_url: "https://github.com/testowner/testrepo/issues/888", + }; + + mockGithub.rest.issues.create.mockResolvedValue({ data: mockIssue }); + + // Execute the script + await eval(`(async () => { ${createIssueScript} })()`); + + const callArgs = mockGithub.rest.issues.create.mock.calls[0][0]; + + // Check that the footer includes reference to triggering PR + expect(callArgs.body).toContain("AI generated by [Test Workflow]"); + expect(callArgs.body).toContain("for #123"); + + // Clean up + delete global.context.payload.pull_request; + }); + + it("should not include triggering reference when no context available", async () => { + process.env.GITHUB_AW_AGENT_OUTPUT = JSON.stringify({ + items: [ + { + type: "create_issue", + title: "New issue without context", + body: "No triggering context", + }, + ], + }); + process.env.GITHUB_AW_WORKFLOW_NAME = "Test Workflow"; + + // Ensure no context + delete global.context.payload.issue; + delete global.context.payload.pull_request; + delete global.context.payload.discussion; + + const mockIssue = { + number: 777, + html_url: "https://github.com/testowner/testrepo/issues/777", + }; + + mockGithub.rest.issues.create.mockResolvedValue({ data: mockIssue }); + + // Execute the script + await eval(`(async () => { ${createIssueScript} })()`); + + const callArgs = mockGithub.rest.issues.create.mock.calls[0][0]; + + // Check that the footer does not include "for #" reference + expect(callArgs.body).toContain("AI generated by [Test Workflow]"); + expect(callArgs.body).not.toMatch(/for #\d+/); + expect(callArgs.body).not.toMatch(/for discussion #\d+/); + }); }); diff --git a/pkg/workflow/js/create_pr_review_comment.cjs b/pkg/workflow/js/create_pr_review_comment.cjs index c114daa50e..2c39b2dcd5 100644 --- a/pkg/workflow/js/create_pr_review_comment.cjs +++ b/pkg/workflow/js/create_pr_review_comment.cjs @@ -4,11 +4,31 @@ * @param {string} runUrl - URL of the workflow run * @param {string} workflowSource - Source of the workflow (owner/repo/path@ref) * @param {string} workflowSourceURL - GitHub URL for the workflow source + * @param {number|undefined} triggeringIssueNumber - Issue number that triggered this workflow + * @param {number|undefined} triggeringPRNumber - Pull request number that triggered this workflow + * @param {number|undefined} triggeringDiscussionNumber - Discussion number that triggered this workflow * @returns {string} Footer text */ -function generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL) { +function generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber +) { let footer = `\n\n> AI generated by [${workflowName}](${runUrl})`; + // Add reference to triggering issue/PR/discussion if available + if (triggeringIssueNumber) { + footer += ` for #${triggeringIssueNumber}`; + } else if (triggeringPRNumber) { + footer += ` for #${triggeringPRNumber}`; + } else if (triggeringDiscussionNumber) { + footer += ` for discussion #${triggeringDiscussionNumber}`; + } + if (workflowSource && workflowSourceURL) { footer += `\n>\n> To add this workflow in your repository, run \`gh aw add ${workflowSource}\`. See [usage guide](https://githubnext.github.io/gh-aw/tools/cli/).`; } @@ -131,6 +151,13 @@ async function main() { return; } + // Extract triggering context for footer generation + const triggeringIssueNumber = + context.payload?.issue?.number && !context.payload?.issue?.pull_request ? context.payload.issue.number : undefined; + const triggeringPRNumber = + context.payload?.pull_request?.number || (context.payload?.issue?.pull_request ? context.payload.issue.number : undefined); + const triggeringDiscussionNumber = context.payload?.discussion?.number; + const createdComments = []; // Process each review comment item @@ -258,7 +285,15 @@ async function main() { const runUrl = context.payload.repository ? `${context.payload.repository.html_url}/actions/runs/${runId}` : `${githubServer}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`; - body += generateFooter(workflowName, runUrl, workflowSource, workflowSourceURL); + body += generateFooter( + workflowName, + runUrl, + workflowSource, + workflowSourceURL, + triggeringIssueNumber, + triggeringPRNumber, + triggeringDiscussionNumber + ); core.info( `Creating review comment on PR #${pullRequestNumber} at ${commentItem.path}:${line}${startLine ? ` (lines ${startLine}-${line})` : ""} [${side}]` diff --git a/pkg/workflow/js/create_pr_review_comment.test.cjs b/pkg/workflow/js/create_pr_review_comment.test.cjs index 7b9dc0735e..8f23f64fb0 100644 --- a/pkg/workflow/js/create_pr_review_comment.test.cjs +++ b/pkg/workflow/js/create_pr_review_comment.test.cjs @@ -678,4 +678,42 @@ describe("create_pr_review_comment.cjs", () => { expect(callArgs.body).not.toContain("gh aw add"); expect(callArgs.body).not.toContain("usage guide"); }); + + it("should include triggering PR number in footer when in PR context", async () => { + process.env.GITHUB_AW_AGENT_OUTPUT = JSON.stringify({ + items: [ + { + type: "create_pull_request_review_comment", + body: "Review comment from PR context", + path: "test.js", + line: 10, + }, + ], + }); + process.env.GITHUB_AW_WORKFLOW_NAME = "Test Workflow"; + + // Simulate PR context + global.context.eventName = "pull_request"; + global.context.payload.pull_request = { + number: 123, + head: { sha: "abc123" }, + }; + + const mockComment = { + id: 999, + html_url: "https://github.com/testowner/testrepo/pull/123#discussion_r999", + }; + + mockGithub.rest.pulls.createReviewComment.mockResolvedValue({ data: mockComment }); + + // Execute the script + await eval(`(async () => { ${createPRReviewCommentScript} })()`); + + const callArgs = mockGithub.rest.pulls.createReviewComment.mock.calls[0][0]; + + // Check that the footer includes reference to triggering PR + expect(callArgs.body).toContain("Review comment from PR context"); + expect(callArgs.body).toContain("AI generated by [Test Workflow]"); + expect(callArgs.body).toContain("for #123"); + }); });