From ef672f69fab0e40fd1aaa97c93ef7ebfa4d7cbd2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 20:57:11 +0000 Subject: [PATCH 1/4] Initial plan From 4aa38dff3c05d48e3b24d8814925270cbb7fe8cd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 21:30:17 +0000 Subject: [PATCH 2/4] feat: expose safe-output results as workflow_call outputs - Add individual named outputs to safe_output_unified_handler_manager.cjs for first successful result of each safe output type (create_issue, create_pull_request, add_comment, push_to_pull_request_branch) - Add commit_sha to push_to_pull_request_branch.cjs return value - Add individual job-level outputs in compiler_safe_outputs_job.go for created_issue_number/url, created_pr_number/url, comment_id/url, push_commit_sha/url - Add injectWorkflowCallOutputs function in compiler_workflow_call.go to automatically inject on.workflow_call.outputs when workflow_call trigger is configured and safe-outputs are present - Update generateWorkflowBody to call injectWorkflowCallOutputs - Add comprehensive tests for the new functionality - Recompile all workflow lock files to include new outputs Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../agent-performance-analyzer.lock.yml | 4 + .github/workflows/archie.lock.yml | 2 + .github/workflows/bot-detection.lock.yml | 2 + .github/workflows/brave.lock.yml | 2 + .../breaking-change-checker.lock.yml | 2 + .github/workflows/changeset.lock.yml | 2 + .github/workflows/ci-coach.lock.yml | 2 + .github/workflows/ci-doctor.lock.yml | 4 + .../cli-consistency-checker.lock.yml | 2 + .../workflows/cli-version-checker.lock.yml | 2 + .github/workflows/cloclo.lock.yml | 4 + .../workflows/code-scanning-fixer.lock.yml | 2 + .github/workflows/code-simplifier.lock.yml | 2 + .github/workflows/contribution-check.lock.yml | 4 + .github/workflows/craft.lock.yml | 4 + .../daily-architecture-diagram.lock.yml | 2 + .../daily-assign-issue-to-user.lock.yml | 2 + .../workflows/daily-cli-performance.lock.yml | 4 + .../workflows/daily-cli-tools-tester.lock.yml | 2 + .github/workflows/daily-doc-healer.lock.yml | 4 + .github/workflows/daily-doc-updater.lock.yml | 2 + .github/workflows/daily-fact.lock.yml | 2 + .github/workflows/daily-file-diet.lock.yml | 2 + .../daily-mcp-concurrency-analysis.lock.yml | 2 + .../daily-multi-device-docs-tester.lock.yml | 2 + .../daily-rendering-scripts-verifier.lock.yml | 2 + .../daily-safe-output-optimizer.lock.yml | 2 + .../daily-safe-outputs-conformance.lock.yml | 2 + .../daily-security-red-team.lock.yml | 2 + .../daily-syntax-error-quality.lock.yml | 2 + .github/workflows/daily-team-status.lock.yml | 2 + .../daily-testify-uber-super-expert.lock.yml | 2 + .../workflows/daily-workflow-updater.lock.yml | 2 + .github/workflows/deep-report.lock.yml | 2 + .github/workflows/delight.lock.yml | 2 + .github/workflows/dependabot-burner.lock.yml | 2 + .../workflows/dependabot-go-checker.lock.yml | 2 + .github/workflows/dev-hawk.lock.yml | 2 + .github/workflows/dev.lock.yml | 2 + .../developer-docs-consolidator.lock.yml | 2 + .github/workflows/dictation-prompt.lock.yml | 2 + .../workflows/discussion-task-miner.lock.yml | 4 + .github/workflows/draft-pr-cleanup.lock.yml | 2 + .../duplicate-code-detector.lock.yml | 2 + .../workflows/functional-pragmatist.lock.yml | 2 + .../github-mcp-tools-report.lock.yml | 2 + .../workflows/glossary-maintainer.lock.yml | 2 + .github/workflows/go-logger.lock.yml | 2 + .../workflows/go-pattern-detector.lock.yml | 2 + .github/workflows/gpclean.lock.yml | 2 + .github/workflows/hourly-ci-cleaner.lock.yml | 2 + .../workflows/instructions-janitor.lock.yml | 2 + .github/workflows/issue-arborist.lock.yml | 2 + .github/workflows/issue-monster.lock.yml | 2 + .github/workflows/issue-triage-agent.lock.yml | 2 + .github/workflows/jsweep.lock.yml | 2 + .../workflows/layout-spec-maintainer.lock.yml | 2 + .github/workflows/mergefest.lock.yml | 2 + .github/workflows/pdf-summary.lock.yml | 2 + .github/workflows/plan.lock.yml | 2 + .github/workflows/poem-bot.lock.yml | 8 + .github/workflows/pr-triage-agent.lock.yml | 4 + .github/workflows/q.lock.yml | 4 + .github/workflows/refiner.lock.yml | 4 + .github/workflows/scout.lock.yml | 2 + ...ecurity-alert-burndown.campaign.g.lock.yml | 4 + .../workflows/security-compliance.lock.yml | 2 + .../semantic-function-refactor.lock.yml | 2 + .../workflows/slide-deck-maintainer.lock.yml | 2 + .github/workflows/smoke-agent.lock.yml | 2 + .github/workflows/smoke-claude.lock.yml | 6 + .github/workflows/smoke-codex.lock.yml | 4 + .github/workflows/smoke-copilot-arm.lock.yml | 4 + .github/workflows/smoke-copilot.lock.yml | 4 + .github/workflows/smoke-gemini.lock.yml | 4 + .github/workflows/smoke-multi-pr.lock.yml | 4 + .github/workflows/smoke-project.lock.yml | 6 + .github/workflows/smoke-temporary-id.lock.yml | 4 + .github/workflows/smoke-test-tools.lock.yml | 2 + .../workflows/smoke-workflow-call.lock.yml | 11 +- .../workflows/stale-repo-identifier.lock.yml | 2 + .../workflows/step-name-alignment.lock.yml | 2 + .github/workflows/sub-issue-closer.lock.yml | 2 + .github/workflows/super-linter.lock.yml | 2 + .../workflows/technical-doc-writer.lock.yml | 4 + .../test-create-pr-error-handling.lock.yml | 2 + .github/workflows/tidy.lock.yml | 4 + .../workflows/ubuntu-image-analyzer.lock.yml | 2 + .github/workflows/unbloat-docs.lock.yml | 4 + .github/workflows/video-analyzer.lock.yml | 2 + .../weekly-editors-health-check.lock.yml | 2 + .../weekly-safe-outputs-spec-review.lock.yml | 2 + .../workflow-health-manager.lock.yml | 4 + .../workflows/workflow-normalizer.lock.yml | 2 + .../workflow-skill-extractor.lock.yml | 2 + .../setup/js/push_to_pull_request_branch.cjs | 1 + .../safe_output_unified_handler_manager.cjs | 62 ++++ pkg/workflow/compiler_safe_outputs_job.go | 21 ++ pkg/workflow/compiler_workflow_call.go | 154 +++++++++ pkg/workflow/compiler_workflow_call_test.go | 304 ++++++++++++++++++ pkg/workflow/compiler_yaml.go | 8 +- 101 files changed, 805 insertions(+), 2 deletions(-) create mode 100644 pkg/workflow/compiler_workflow_call.go create mode 100644 pkg/workflow/compiler_workflow_call_test.go diff --git a/.github/workflows/agent-performance-analyzer.lock.yml b/.github/workflows/agent-performance-analyzer.lock.yml index fa3c0df55c..ff39bb4cdf 100644 --- a/.github/workflows/agent-performance-analyzer.lock.yml +++ b/.github/workflows/agent-performance-analyzer.lock.yml @@ -1336,8 +1336,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/archie.lock.yml b/.github/workflows/archie.lock.yml index 164c6773dc..cf433d386d 100644 --- a/.github/workflows/archie.lock.yml +++ b/.github/workflows/archie.lock.yml @@ -1133,6 +1133,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/bot-detection.lock.yml b/.github/workflows/bot-detection.lock.yml index baee931703..28e3a64b77 100644 --- a/.github/workflows/bot-detection.lock.yml +++ b/.github/workflows/bot-detection.lock.yml @@ -1855,6 +1855,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/brave.lock.yml b/.github/workflows/brave.lock.yml index 9a503cdef9..97cd66e053 100644 --- a/.github/workflows/brave.lock.yml +++ b/.github/workflows/brave.lock.yml @@ -1118,6 +1118,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/breaking-change-checker.lock.yml b/.github/workflows/breaking-change-checker.lock.yml index c7606df8d7..2efd80e683 100644 --- a/.github/workflows/breaking-change-checker.lock.yml +++ b/.github/workflows/breaking-change-checker.lock.yml @@ -1114,6 +1114,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/changeset.lock.yml b/.github/workflows/changeset.lock.yml index 7a480fae0f..aab6b82939 100644 --- a/.github/workflows/changeset.lock.yml +++ b/.github/workflows/changeset.lock.yml @@ -1174,6 +1174,8 @@ jobs: create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + push_commit_sha: ${{ steps.process_safe_outputs.outputs.push_commit_sha }} + push_commit_url: ${{ steps.process_safe_outputs.outputs.push_commit_url }} steps: - name: Checkout actions folder uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/ci-coach.lock.yml b/.github/workflows/ci-coach.lock.yml index f431593f48..86f4c42a90 100644 --- a/.github/workflows/ci-coach.lock.yml +++ b/.github/workflows/ci-coach.lock.yml @@ -1146,6 +1146,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml index c3c54d8388..06ef38af21 100644 --- a/.github/workflows/ci-doctor.lock.yml +++ b/.github/workflows/ci-doctor.lock.yml @@ -1324,8 +1324,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/cli-consistency-checker.lock.yml b/.github/workflows/cli-consistency-checker.lock.yml index c78543ca08..a04960cb16 100644 --- a/.github/workflows/cli-consistency-checker.lock.yml +++ b/.github/workflows/cli-consistency-checker.lock.yml @@ -1032,6 +1032,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/cli-version-checker.lock.yml b/.github/workflows/cli-version-checker.lock.yml index 0f2c077571..7f4d8fac94 100644 --- a/.github/workflows/cli-version-checker.lock.yml +++ b/.github/workflows/cli-version-checker.lock.yml @@ -1134,6 +1134,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/cloclo.lock.yml b/.github/workflows/cloclo.lock.yml index d7b95a713b..abde12ad9a 100644 --- a/.github/workflows/cloclo.lock.yml +++ b/.github/workflows/cloclo.lock.yml @@ -1505,8 +1505,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/code-scanning-fixer.lock.yml b/.github/workflows/code-scanning-fixer.lock.yml index e2f0996d40..48e97c6aa3 100644 --- a/.github/workflows/code-scanning-fixer.lock.yml +++ b/.github/workflows/code-scanning-fixer.lock.yml @@ -1256,6 +1256,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/code-simplifier.lock.yml b/.github/workflows/code-simplifier.lock.yml index 023b4ba58d..cfd2bfd286 100644 --- a/.github/workflows/code-simplifier.lock.yml +++ b/.github/workflows/code-simplifier.lock.yml @@ -1122,6 +1122,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/contribution-check.lock.yml b/.github/workflows/contribution-check.lock.yml index 3fa4eb2544..1732bac825 100644 --- a/.github/workflows/contribution-check.lock.yml +++ b/.github/workflows/contribution-check.lock.yml @@ -1111,8 +1111,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/craft.lock.yml b/.github/workflows/craft.lock.yml index 12e586c4a8..3c4c0622a5 100644 --- a/.github/workflows/craft.lock.yml +++ b/.github/workflows/craft.lock.yml @@ -1156,10 +1156,14 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + push_commit_sha: ${{ steps.process_safe_outputs.outputs.push_commit_sha }} + push_commit_url: ${{ steps.process_safe_outputs.outputs.push_commit_url }} steps: - name: Checkout actions folder uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-architecture-diagram.lock.yml b/.github/workflows/daily-architecture-diagram.lock.yml index b54325f8d8..0470ab3e03 100644 --- a/.github/workflows/daily-architecture-diagram.lock.yml +++ b/.github/workflows/daily-architecture-diagram.lock.yml @@ -1060,6 +1060,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-assign-issue-to-user.lock.yml b/.github/workflows/daily-assign-issue-to-user.lock.yml index 9300095c59..1bcc6c44ea 100644 --- a/.github/workflows/daily-assign-issue-to-user.lock.yml +++ b/.github/workflows/daily-assign-issue-to-user.lock.yml @@ -1050,6 +1050,8 @@ jobs: assign_to_user_assigned: ${{ steps.process_safe_outputs.outputs.assigned }} code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/daily-cli-performance.lock.yml b/.github/workflows/daily-cli-performance.lock.yml index 0eb5086d16..e208dfe252 100644 --- a/.github/workflows/daily-cli-performance.lock.yml +++ b/.github/workflows/daily-cli-performance.lock.yml @@ -1337,8 +1337,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-cli-tools-tester.lock.yml b/.github/workflows/daily-cli-tools-tester.lock.yml index 84df18dd79..06ed3b920f 100644 --- a/.github/workflows/daily-cli-tools-tester.lock.yml +++ b/.github/workflows/daily-cli-tools-tester.lock.yml @@ -1105,6 +1105,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-doc-healer.lock.yml b/.github/workflows/daily-doc-healer.lock.yml index ea5eb39784..263a8f02f3 100644 --- a/.github/workflows/daily-doc-healer.lock.yml +++ b/.github/workflows/daily-doc-healer.lock.yml @@ -1246,6 +1246,10 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-doc-updater.lock.yml b/.github/workflows/daily-doc-updater.lock.yml index cf2c09d95c..be8bf80eee 100644 --- a/.github/workflows/daily-doc-updater.lock.yml +++ b/.github/workflows/daily-doc-updater.lock.yml @@ -1173,6 +1173,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-fact.lock.yml b/.github/workflows/daily-fact.lock.yml index 0837a97c91..a277214281 100644 --- a/.github/workflows/daily-fact.lock.yml +++ b/.github/workflows/daily-fact.lock.yml @@ -980,6 +980,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index d1ed40ff25..45d5d2c1ba 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -1129,6 +1129,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml index 68801cb2f8..3420219a68 100644 --- a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml +++ b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml @@ -1134,6 +1134,8 @@ jobs: create_agent_session_session_url: ${{ steps.create_agent_session.outputs.session_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-multi-device-docs-tester.lock.yml b/.github/workflows/daily-multi-device-docs-tester.lock.yml index c410cd86b9..5a025a9853 100644 --- a/.github/workflows/daily-multi-device-docs-tester.lock.yml +++ b/.github/workflows/daily-multi-device-docs-tester.lock.yml @@ -1223,6 +1223,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-rendering-scripts-verifier.lock.yml b/.github/workflows/daily-rendering-scripts-verifier.lock.yml index 41c11ba5b8..2239441dc4 100644 --- a/.github/workflows/daily-rendering-scripts-verifier.lock.yml +++ b/.github/workflows/daily-rendering-scripts-verifier.lock.yml @@ -1301,6 +1301,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-safe-output-optimizer.lock.yml b/.github/workflows/daily-safe-output-optimizer.lock.yml index b72b406f65..169cb998aa 100644 --- a/.github/workflows/daily-safe-output-optimizer.lock.yml +++ b/.github/workflows/daily-safe-output-optimizer.lock.yml @@ -1267,6 +1267,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-safe-outputs-conformance.lock.yml b/.github/workflows/daily-safe-outputs-conformance.lock.yml index 93fd028878..b64b8790e2 100644 --- a/.github/workflows/daily-safe-outputs-conformance.lock.yml +++ b/.github/workflows/daily-safe-outputs-conformance.lock.yml @@ -1102,6 +1102,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-security-red-team.lock.yml b/.github/workflows/daily-security-red-team.lock.yml index 38e92b99c3..a3c05ce229 100644 --- a/.github/workflows/daily-security-red-team.lock.yml +++ b/.github/workflows/daily-security-red-team.lock.yml @@ -1106,6 +1106,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-syntax-error-quality.lock.yml b/.github/workflows/daily-syntax-error-quality.lock.yml index 96d40f1761..203f375591 100644 --- a/.github/workflows/daily-syntax-error-quality.lock.yml +++ b/.github/workflows/daily-syntax-error-quality.lock.yml @@ -1066,6 +1066,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-team-status.lock.yml b/.github/workflows/daily-team-status.lock.yml index 8ebb33601f..c02be35688 100644 --- a/.github/workflows/daily-team-status.lock.yml +++ b/.github/workflows/daily-team-status.lock.yml @@ -1099,6 +1099,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-testify-uber-super-expert.lock.yml b/.github/workflows/daily-testify-uber-super-expert.lock.yml index 9f7a283624..28591a5a5b 100644 --- a/.github/workflows/daily-testify-uber-super-expert.lock.yml +++ b/.github/workflows/daily-testify-uber-super-expert.lock.yml @@ -1229,6 +1229,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/daily-workflow-updater.lock.yml b/.github/workflows/daily-workflow-updater.lock.yml index 7181fec66a..a23d48645a 100644 --- a/.github/workflows/daily-workflow-updater.lock.yml +++ b/.github/workflows/daily-workflow-updater.lock.yml @@ -1059,6 +1059,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/deep-report.lock.yml b/.github/workflows/deep-report.lock.yml index 47a39b4b1e..acbf0ab0b7 100644 --- a/.github/workflows/deep-report.lock.yml +++ b/.github/workflows/deep-report.lock.yml @@ -1354,6 +1354,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/delight.lock.yml b/.github/workflows/delight.lock.yml index 4f7c3542f6..e793ca227a 100644 --- a/.github/workflows/delight.lock.yml +++ b/.github/workflows/delight.lock.yml @@ -1233,6 +1233,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/dependabot-burner.lock.yml b/.github/workflows/dependabot-burner.lock.yml index 0051cb70a7..36ab99dc4e 100644 --- a/.github/workflows/dependabot-burner.lock.yml +++ b/.github/workflows/dependabot-burner.lock.yml @@ -1069,6 +1069,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/dependabot-go-checker.lock.yml b/.github/workflows/dependabot-go-checker.lock.yml index d3a8f4df78..75cbf2f5e3 100644 --- a/.github/workflows/dependabot-go-checker.lock.yml +++ b/.github/workflows/dependabot-go-checker.lock.yml @@ -1079,6 +1079,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/dev-hawk.lock.yml b/.github/workflows/dev-hawk.lock.yml index 71d6df2926..dba5e9d58d 100644 --- a/.github/workflows/dev-hawk.lock.yml +++ b/.github/workflows/dev-hawk.lock.yml @@ -1151,6 +1151,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/dev.lock.yml b/.github/workflows/dev.lock.yml index 7f45065ceb..f0a2e9e82f 100644 --- a/.github/workflows/dev.lock.yml +++ b/.github/workflows/dev.lock.yml @@ -1029,6 +1029,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/developer-docs-consolidator.lock.yml b/.github/workflows/developer-docs-consolidator.lock.yml index 33ca8396dc..3851c0ff88 100644 --- a/.github/workflows/developer-docs-consolidator.lock.yml +++ b/.github/workflows/developer-docs-consolidator.lock.yml @@ -1251,6 +1251,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/dictation-prompt.lock.yml b/.github/workflows/dictation-prompt.lock.yml index ae227502eb..22e41787f3 100644 --- a/.github/workflows/dictation-prompt.lock.yml +++ b/.github/workflows/dictation-prompt.lock.yml @@ -1059,6 +1059,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/discussion-task-miner.lock.yml b/.github/workflows/discussion-task-miner.lock.yml index 38306f086f..4f7ed4c522 100644 --- a/.github/workflows/discussion-task-miner.lock.yml +++ b/.github/workflows/discussion-task-miner.lock.yml @@ -1214,8 +1214,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/draft-pr-cleanup.lock.yml b/.github/workflows/draft-pr-cleanup.lock.yml index 1bad6fcd43..40c5e42bdb 100644 --- a/.github/workflows/draft-pr-cleanup.lock.yml +++ b/.github/workflows/draft-pr-cleanup.lock.yml @@ -1080,6 +1080,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index 5bb89f5c41..d43eec4fd9 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -1075,6 +1075,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/functional-pragmatist.lock.yml b/.github/workflows/functional-pragmatist.lock.yml index 3a141e961e..4579d3c54c 100644 --- a/.github/workflows/functional-pragmatist.lock.yml +++ b/.github/workflows/functional-pragmatist.lock.yml @@ -1072,6 +1072,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/github-mcp-tools-report.lock.yml b/.github/workflows/github-mcp-tools-report.lock.yml index 93bbc113c0..d7c6e32659 100644 --- a/.github/workflows/github-mcp-tools-report.lock.yml +++ b/.github/workflows/github-mcp-tools-report.lock.yml @@ -1208,6 +1208,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/glossary-maintainer.lock.yml b/.github/workflows/glossary-maintainer.lock.yml index 25efa51e0b..551a7ead82 100644 --- a/.github/workflows/glossary-maintainer.lock.yml +++ b/.github/workflows/glossary-maintainer.lock.yml @@ -1144,6 +1144,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/go-logger.lock.yml b/.github/workflows/go-logger.lock.yml index f07ccc181d..f37eba2486 100644 --- a/.github/workflows/go-logger.lock.yml +++ b/.github/workflows/go-logger.lock.yml @@ -1335,6 +1335,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index f9b7fefc05..d95c71d311 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -1143,6 +1143,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/gpclean.lock.yml b/.github/workflows/gpclean.lock.yml index d850d3a8bb..04b9380665 100644 --- a/.github/workflows/gpclean.lock.yml +++ b/.github/workflows/gpclean.lock.yml @@ -1066,6 +1066,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/hourly-ci-cleaner.lock.yml b/.github/workflows/hourly-ci-cleaner.lock.yml index 74aad62c87..adb6758a42 100644 --- a/.github/workflows/hourly-ci-cleaner.lock.yml +++ b/.github/workflows/hourly-ci-cleaner.lock.yml @@ -1171,6 +1171,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/instructions-janitor.lock.yml b/.github/workflows/instructions-janitor.lock.yml index e8740c83a2..a01d8990e7 100644 --- a/.github/workflows/instructions-janitor.lock.yml +++ b/.github/workflows/instructions-janitor.lock.yml @@ -1163,6 +1163,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/issue-arborist.lock.yml b/.github/workflows/issue-arborist.lock.yml index 9e8f957cca..1d5b953183 100644 --- a/.github/workflows/issue-arborist.lock.yml +++ b/.github/workflows/issue-arborist.lock.yml @@ -1146,6 +1146,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/issue-monster.lock.yml b/.github/workflows/issue-monster.lock.yml index e22800643b..55a56a859a 100644 --- a/.github/workflows/issue-monster.lock.yml +++ b/.github/workflows/issue-monster.lock.yml @@ -1149,6 +1149,8 @@ jobs: assign_to_agent_assignment_errors: ${{ steps.assign_to_agent.outputs.assignment_errors }} code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/issue-triage-agent.lock.yml b/.github/workflows/issue-triage-agent.lock.yml index 171982104e..dac3551078 100644 --- a/.github/workflows/issue-triage-agent.lock.yml +++ b/.github/workflows/issue-triage-agent.lock.yml @@ -1031,6 +1031,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/jsweep.lock.yml b/.github/workflows/jsweep.lock.yml index ee8ff237d1..c8bdd615cd 100644 --- a/.github/workflows/jsweep.lock.yml +++ b/.github/workflows/jsweep.lock.yml @@ -1108,6 +1108,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/layout-spec-maintainer.lock.yml b/.github/workflows/layout-spec-maintainer.lock.yml index 401c64d15a..58bd4c6e85 100644 --- a/.github/workflows/layout-spec-maintainer.lock.yml +++ b/.github/workflows/layout-spec-maintainer.lock.yml @@ -1101,6 +1101,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/mergefest.lock.yml b/.github/workflows/mergefest.lock.yml index 3e489dfc85..1f91874f1b 100644 --- a/.github/workflows/mergefest.lock.yml +++ b/.github/workflows/mergefest.lock.yml @@ -1154,6 +1154,8 @@ jobs: create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + push_commit_sha: ${{ steps.process_safe_outputs.outputs.push_commit_sha }} + push_commit_url: ${{ steps.process_safe_outputs.outputs.push_commit_url }} steps: - name: Checkout actions folder uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/pdf-summary.lock.yml b/.github/workflows/pdf-summary.lock.yml index c100e50816..0c38e2fc79 100644 --- a/.github/workflows/pdf-summary.lock.yml +++ b/.github/workflows/pdf-summary.lock.yml @@ -1227,6 +1227,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml index 1a173f859e..68b128b2f3 100644 --- a/.github/workflows/plan.lock.yml +++ b/.github/workflows/plan.lock.yml @@ -1190,6 +1190,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/poem-bot.lock.yml b/.github/workflows/poem-bot.lock.yml index 939f01549d..8e66a4504c 100644 --- a/.github/workflows/poem-bot.lock.yml +++ b/.github/workflows/poem-bot.lock.yml @@ -1831,12 +1831,20 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_agent_session_session_number: ${{ steps.create_agent_session.outputs.session_number }} create_agent_session_session_url: ${{ steps.create_agent_session.outputs.session_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + push_commit_sha: ${{ steps.process_safe_outputs.outputs.push_commit_sha }} + push_commit_url: ${{ steps.process_safe_outputs.outputs.push_commit_url }} steps: - name: Checkout actions folder uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/pr-triage-agent.lock.yml b/.github/workflows/pr-triage-agent.lock.yml index 8b7751a4ff..c71a8f1094 100644 --- a/.github/workflows/pr-triage-agent.lock.yml +++ b/.github/workflows/pr-triage-agent.lock.yml @@ -1219,8 +1219,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/q.lock.yml b/.github/workflows/q.lock.yml index bd4732923c..7197470e63 100644 --- a/.github/workflows/q.lock.yml +++ b/.github/workflows/q.lock.yml @@ -1360,8 +1360,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/refiner.lock.yml b/.github/workflows/refiner.lock.yml index dfe035a1d6..486984fffa 100644 --- a/.github/workflows/refiner.lock.yml +++ b/.github/workflows/refiner.lock.yml @@ -1164,8 +1164,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index 856ec64a6b..89275da45f 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -1366,6 +1366,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/security-alert-burndown.campaign.g.lock.yml b/.github/workflows/security-alert-burndown.campaign.g.lock.yml index ef7e145d2b..b871b1bfac 100644 --- a/.github/workflows/security-alert-burndown.campaign.g.lock.yml +++ b/.github/workflows/security-alert-burndown.campaign.g.lock.yml @@ -1511,8 +1511,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/security-compliance.lock.yml b/.github/workflows/security-compliance.lock.yml index 35c9a4daa0..1e67eab625 100644 --- a/.github/workflows/security-compliance.lock.yml +++ b/.github/workflows/security-compliance.lock.yml @@ -1166,6 +1166,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/semantic-function-refactor.lock.yml b/.github/workflows/semantic-function-refactor.lock.yml index ba942ec26f..a8a235c776 100644 --- a/.github/workflows/semantic-function-refactor.lock.yml +++ b/.github/workflows/semantic-function-refactor.lock.yml @@ -1179,6 +1179,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/slide-deck-maintainer.lock.yml b/.github/workflows/slide-deck-maintainer.lock.yml index bfb6ae922a..5029ee5f53 100644 --- a/.github/workflows/slide-deck-maintainer.lock.yml +++ b/.github/workflows/slide-deck-maintainer.lock.yml @@ -1211,6 +1211,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-agent.lock.yml b/.github/workflows/smoke-agent.lock.yml index 48f8e9bc6b..7ff428cda7 100644 --- a/.github/workflows/smoke-agent.lock.yml +++ b/.github/workflows/smoke-agent.lock.yml @@ -1147,6 +1147,8 @@ jobs: assign_to_agent_assignment_errors: ${{ steps.assign_to_agent.outputs.assignment_errors }} code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index 0974d1bf89..27d54fda45 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -2723,10 +2723,16 @@ jobs: add_reviewer_reviewers_added: ${{ steps.process_safe_outputs.outputs.reviewers_added }} code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + push_commit_sha: ${{ steps.process_safe_outputs.outputs.push_commit_sha }} + push_commit_url: ${{ steps.process_safe_outputs.outputs.push_commit_url }} steps: - name: Checkout actions folder uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index 617072acfa..cbe5e08920 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -1617,8 +1617,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-copilot-arm.lock.yml b/.github/workflows/smoke-copilot-arm.lock.yml index c848fad0ef..4a4d252ea3 100644 --- a/.github/workflows/smoke-copilot-arm.lock.yml +++ b/.github/workflows/smoke-copilot-arm.lock.yml @@ -2141,8 +2141,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 3876e6ec5d..12ab1a8dc4 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -2138,8 +2138,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-gemini.lock.yml b/.github/workflows/smoke-gemini.lock.yml index e55fab10dd..4e76ab25bd 100644 --- a/.github/workflows/smoke-gemini.lock.yml +++ b/.github/workflows/smoke-gemini.lock.yml @@ -1359,8 +1359,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-multi-pr.lock.yml b/.github/workflows/smoke-multi-pr.lock.yml index e43c1f97ea..c275c7c34e 100644 --- a/.github/workflows/smoke-multi-pr.lock.yml +++ b/.github/workflows/smoke-multi-pr.lock.yml @@ -1231,8 +1231,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-project.lock.yml b/.github/workflows/smoke-project.lock.yml index 7999a6e109..bb2da43782 100644 --- a/.github/workflows/smoke-project.lock.yml +++ b/.github/workflows/smoke-project.lock.yml @@ -1624,8 +1624,14 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-temporary-id.lock.yml b/.github/workflows/smoke-temporary-id.lock.yml index 028baaa866..5dabd6b4c2 100644 --- a/.github/workflows/smoke-temporary-id.lock.yml +++ b/.github/workflows/smoke-temporary-id.lock.yml @@ -1229,8 +1229,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/smoke-test-tools.lock.yml b/.github/workflows/smoke-test-tools.lock.yml index 9b35e616d9..63ed4f1e72 100644 --- a/.github/workflows/smoke-test-tools.lock.yml +++ b/.github/workflows/smoke-test-tools.lock.yml @@ -1116,6 +1116,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/smoke-workflow-call.lock.yml b/.github/workflows/smoke-workflow-call.lock.yml index e988e89362..043db8e878 100644 --- a/.github/workflows/smoke-workflow-call.lock.yml +++ b/.github/workflows/smoke-workflow-call.lock.yml @@ -28,7 +28,14 @@ name: "Smoke Workflow Call" "on": workflow_call: - workflow_dispatch: + outputs: + comment_id: + description: ID of the first added comment + value: ${{ jobs.safe_outputs.outputs.comment_id }} + comment_url: + description: URL of the first added comment + value: ${{ jobs.safe_outputs.outputs.comment_url }} + workflow_dispatch: null permissions: {} @@ -1054,6 +1061,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/stale-repo-identifier.lock.yml b/.github/workflows/stale-repo-identifier.lock.yml index 5e58951587..5400571465 100644 --- a/.github/workflows/stale-repo-identifier.lock.yml +++ b/.github/workflows/stale-repo-identifier.lock.yml @@ -1194,6 +1194,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/step-name-alignment.lock.yml b/.github/workflows/step-name-alignment.lock.yml index 4109dc6d32..ecd6d830b0 100644 --- a/.github/workflows/step-name-alignment.lock.yml +++ b/.github/workflows/step-name-alignment.lock.yml @@ -1133,6 +1133,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/sub-issue-closer.lock.yml b/.github/workflows/sub-issue-closer.lock.yml index 9326611e0f..668dd611f5 100644 --- a/.github/workflows/sub-issue-closer.lock.yml +++ b/.github/workflows/sub-issue-closer.lock.yml @@ -1120,6 +1120,8 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} diff --git a/.github/workflows/super-linter.lock.yml b/.github/workflows/super-linter.lock.yml index 70d098e849..517295f970 100644 --- a/.github/workflows/super-linter.lock.yml +++ b/.github/workflows/super-linter.lock.yml @@ -1081,6 +1081,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/technical-doc-writer.lock.yml b/.github/workflows/technical-doc-writer.lock.yml index 8b79db8f12..cdf87bbbfa 100644 --- a/.github/workflows/technical-doc-writer.lock.yml +++ b/.github/workflows/technical-doc-writer.lock.yml @@ -1210,8 +1210,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/test-create-pr-error-handling.lock.yml b/.github/workflows/test-create-pr-error-handling.lock.yml index 6182c459c3..fec298541b 100644 --- a/.github/workflows/test-create-pr-error-handling.lock.yml +++ b/.github/workflows/test-create-pr-error-handling.lock.yml @@ -1135,6 +1135,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/tidy.lock.yml b/.github/workflows/tidy.lock.yml index 50fa89b8b7..c5d6be74f9 100644 --- a/.github/workflows/tidy.lock.yml +++ b/.github/workflows/tidy.lock.yml @@ -1251,8 +1251,12 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + push_commit_sha: ${{ steps.process_safe_outputs.outputs.push_commit_sha }} + push_commit_url: ${{ steps.process_safe_outputs.outputs.push_commit_url }} steps: - name: Checkout actions folder uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/ubuntu-image-analyzer.lock.yml b/.github/workflows/ubuntu-image-analyzer.lock.yml index ae64aa1126..7a0f3af557 100644 --- a/.github/workflows/ubuntu-image-analyzer.lock.yml +++ b/.github/workflows/ubuntu-image-analyzer.lock.yml @@ -1141,6 +1141,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/unbloat-docs.lock.yml b/.github/workflows/unbloat-docs.lock.yml index 0105be7497..c50db68b6a 100644 --- a/.github/workflows/unbloat-docs.lock.yml +++ b/.github/workflows/unbloat-docs.lock.yml @@ -1422,8 +1422,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/video-analyzer.lock.yml b/.github/workflows/video-analyzer.lock.yml index ff2b8a6792..ecf58b7562 100644 --- a/.github/workflows/video-analyzer.lock.yml +++ b/.github/workflows/video-analyzer.lock.yml @@ -1073,6 +1073,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/weekly-editors-health-check.lock.yml b/.github/workflows/weekly-editors-health-check.lock.yml index 0fcd39a1b1..eea4481d3f 100644 --- a/.github/workflows/weekly-editors-health-check.lock.yml +++ b/.github/workflows/weekly-editors-health-check.lock.yml @@ -1143,6 +1143,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/weekly-safe-outputs-spec-review.lock.yml b/.github/workflows/weekly-safe-outputs-spec-review.lock.yml index 2cd029b90f..f69d1805ee 100644 --- a/.github/workflows/weekly-safe-outputs-spec-review.lock.yml +++ b/.github/workflows/weekly-safe-outputs-spec-review.lock.yml @@ -1063,6 +1063,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/workflow-health-manager.lock.yml b/.github/workflows/workflow-health-manager.lock.yml index cbfbef8061..36efd8be44 100644 --- a/.github/workflows/workflow-health-manager.lock.yml +++ b/.github/workflows/workflow-health-manager.lock.yml @@ -1337,8 +1337,12 @@ jobs: outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/workflow-normalizer.lock.yml b/.github/workflows/workflow-normalizer.lock.yml index a7db5a6323..740b8aed4c 100644 --- a/.github/workflows/workflow-normalizer.lock.yml +++ b/.github/workflows/workflow-normalizer.lock.yml @@ -1116,6 +1116,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/.github/workflows/workflow-skill-extractor.lock.yml b/.github/workflows/workflow-skill-extractor.lock.yml index 00064ce423..4a063edd11 100644 --- a/.github/workflows/workflow-skill-extractor.lock.yml +++ b/.github/workflows/workflow-skill-extractor.lock.yml @@ -1119,6 +1119,8 @@ jobs: code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }} + created_issue_url: ${{ steps.process_safe_outputs.outputs.created_issue_url }} process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: diff --git a/actions/setup/js/push_to_pull_request_branch.cjs b/actions/setup/js/push_to_pull_request_branch.cjs index 76e2261a7a..485654b99d 100644 --- a/actions/setup/js/push_to_pull_request_branch.cjs +++ b/actions/setup/js/push_to_pull_request_branch.cjs @@ -491,6 +491,7 @@ async function main(config = {}) { return { success: true, branch_name: branchName, + commit_sha: commitSha, commit_url: commitUrl, }; }; diff --git a/actions/setup/js/safe_output_unified_handler_manager.cjs b/actions/setup/js/safe_output_unified_handler_manager.cjs index 3283317272..88456c51cc 100644 --- a/actions/setup/js/safe_output_unified_handler_manager.cjs +++ b/actions/setup/js/safe_output_unified_handler_manager.cjs @@ -1150,6 +1150,68 @@ async function main() { core.setOutput("issues_to_assign_copilot", ""); } + // Emit individual named outputs for the first successful result of each safe output type. + // These outputs enable workflow_call callers to access specific results. + const successfulResults = processingResult.results.filter(r => r.success && r.result); + + // create_issue: created_issue_number, created_issue_url + const firstIssueResult = successfulResults.find(r => r.type === "create_issue"); + if (firstIssueResult?.result && !Array.isArray(firstIssueResult.result)) { + const r = firstIssueResult.result; + if (r.number != null) { + core.setOutput("created_issue_number", String(r.number)); + core.info(`Exported created_issue_number: ${r.number}`); + } + if (r.url) { + core.setOutput("created_issue_url", r.url); + core.info(`Exported created_issue_url: ${r.url}`); + } + } + + // create_pull_request: created_pr_number, created_pr_url + const firstPRResult = successfulResults.find(r => r.type === "create_pull_request"); + if (firstPRResult?.result && !Array.isArray(firstPRResult.result)) { + const r = firstPRResult.result; + if (r.pull_request_number != null) { + core.setOutput("created_pr_number", String(r.pull_request_number)); + core.info(`Exported created_pr_number: ${r.pull_request_number}`); + } + if (r.pull_request_url) { + core.setOutput("created_pr_url", r.pull_request_url); + core.info(`Exported created_pr_url: ${r.pull_request_url}`); + } + } + + // add_comment: comment_id, comment_url + // add_comment handlers may return an array when multiple comments were queued for the same + // message (e.g., fallback retries). We take the first element to get the primary comment. + const firstCommentResult = successfulResults.find(r => r.type === "add_comment"); + if (firstCommentResult?.result) { + const r = Array.isArray(firstCommentResult.result) ? firstCommentResult.result[0] : firstCommentResult.result; + if (r?.commentId != null) { + core.setOutput("comment_id", String(r.commentId)); + core.info(`Exported comment_id: ${r.commentId}`); + } + if (r?.url) { + core.setOutput("comment_url", r.url); + core.info(`Exported comment_url: ${r.url}`); + } + } + + // push_to_pull_request_branch: push_commit_sha, push_commit_url + const firstPushResult = successfulResults.find(r => r.type === "push_to_pull_request_branch"); + if (firstPushResult?.result && !Array.isArray(firstPushResult.result)) { + const r = firstPushResult.result; + if (r.commit_sha) { + core.setOutput("push_commit_sha", r.commit_sha); + core.info(`Exported push_commit_sha: ${r.commit_sha}`); + } + if (r.commit_url) { + core.setOutput("push_commit_url", r.commit_url); + core.info(`Exported push_commit_url: ${r.commit_url}`); + } + } + // Ensure the manifest file always exists for artifact upload (even if no items were created). // Skip in staged mode — no real items were created so no manifest should be emitted. // Note: createManifestLogger() also calls ensureManifestExists() when the logger is created, diff --git a/pkg/workflow/compiler_safe_outputs_job.go b/pkg/workflow/compiler_safe_outputs_job.go index 83d2b08040..e7f874af23 100644 --- a/pkg/workflow/compiler_safe_outputs_job.go +++ b/pkg/workflow/compiler_safe_outputs_job.go @@ -218,6 +218,27 @@ func (c *Compiler) buildConsolidatedSafeOutputsJob(data *WorkflowData, mainJobNa outputs["assign_to_user_assigned"] = "${{ steps.process_safe_outputs.outputs.assigned }}" } + // Individual named outputs for first-created items (enables workflow_call consumers to access results) + if data.SafeOutputs.CreateIssues != nil { + outputs["created_issue_number"] = "${{ steps.process_safe_outputs.outputs.created_issue_number }}" + outputs["created_issue_url"] = "${{ steps.process_safe_outputs.outputs.created_issue_url }}" + } + + if data.SafeOutputs.CreatePullRequests != nil { + outputs["created_pr_number"] = "${{ steps.process_safe_outputs.outputs.created_pr_number }}" + outputs["created_pr_url"] = "${{ steps.process_safe_outputs.outputs.created_pr_url }}" + } + + if data.SafeOutputs.AddComments != nil { + outputs["comment_id"] = "${{ steps.process_safe_outputs.outputs.comment_id }}" + outputs["comment_url"] = "${{ steps.process_safe_outputs.outputs.comment_url }}" + } + + if data.SafeOutputs.PushToPullRequestBranch != nil { + outputs["push_commit_sha"] = "${{ steps.process_safe_outputs.outputs.push_commit_sha }}" + outputs["push_commit_url"] = "${{ steps.process_safe_outputs.outputs.push_commit_url }}" + } + // If no steps were added, return nil if len(safeOutputStepNames) == 0 { consolidatedSafeOutputsJobLog.Print("No safe output steps were added") diff --git a/pkg/workflow/compiler_workflow_call.go b/pkg/workflow/compiler_workflow_call.go new file mode 100644 index 0000000000..7c727c0cba --- /dev/null +++ b/pkg/workflow/compiler_workflow_call.go @@ -0,0 +1,154 @@ +package workflow + +import ( + "maps" + "strings" + + "github.com/github/gh-aw/pkg/logger" + "github.com/goccy/go-yaml" +) + +var workflowCallLog = logger.New("workflow:compiler_workflow_call") + +// workflowCallOutputEntry represents a single on.workflow_call.outputs entry +type workflowCallOutputEntry struct { + Description string `yaml:"description"` + Value string `yaml:"value"` +} + +// injectWorkflowCallOutputs adds on.workflow_call.outputs declarations for safe-output results +// when the workflow uses workflow_call as a trigger. +// +// This enables callers of the workflow to access results such as: +// - created_issue_number / created_issue_url (when create-issue is configured) +// - created_pr_number / created_pr_url (when create-pull-request is configured) +// - comment_id / comment_url (when add-comment is configured) +// - push_commit_sha / push_commit_url (when push-to-pull-request-branch is configured) +// +// The function is a no-op if safeOutputs is nil or workflow_call is not in the on section. +// Any outputs the user has already declared in the on.workflow_call.outputs section are preserved. +func (c *Compiler) injectWorkflowCallOutputs(onSection string, safeOutputs *SafeOutputsConfig) string { + if safeOutputs == nil || !strings.Contains(onSection, "workflow_call") { + return onSection + } + + // Build the auto-generated outputs map based on configured safe output types + generatedOutputs := buildWorkflowCallOutputsMap(safeOutputs) + if len(generatedOutputs) == 0 { + return onSection + } + + // Parse the on section YAML + var onData map[string]any + if err := yaml.Unmarshal([]byte(onSection), &onData); err != nil { + workflowCallLog.Printf("Warning: failed to parse on section for workflow_call outputs injection: %v", err) + return onSection + } + + // Get the 'on' map + onMap, ok := onData["on"].(map[string]any) + if !ok { + return onSection + } + + // Get the workflow_call entry + workflowCallVal, hasWorkflowCall := onMap["workflow_call"] + if !hasWorkflowCall { + return onSection + } + + // Convert workflow_call to a map (it may be nil if declared without options) + var workflowCallMap map[string]any + if workflowCallVal == nil { + workflowCallMap = make(map[string]any) + } else if m, ok := workflowCallVal.(map[string]any); ok { + workflowCallMap = m + } else { + workflowCallMap = make(map[string]any) + } + + // Merge auto-generated outputs with any existing user-defined outputs. + // User-defined outputs take precedence (their keys overwrite generated ones). + mergedOutputs := make(map[string]workflowCallOutputEntry) + maps.Copy(mergedOutputs, generatedOutputs) + if existingOutputs, hasOutputs := workflowCallMap["outputs"].(map[string]any); hasOutputs { + for k, v := range existingOutputs { + // User-defined entries may be maps with description+value or plain strings + if outputMap, ok := v.(map[string]any); ok { + entry := workflowCallOutputEntry{} + if desc, ok := outputMap["description"].(string); ok { + entry.Description = desc + } + if val, ok := outputMap["value"].(string); ok { + entry.Value = val + } + mergedOutputs[k] = entry + } + } + } + + workflowCallMap["outputs"] = mergedOutputs + onMap["workflow_call"] = workflowCallMap + + // Re-marshal to YAML + newOnData := map[string]any{"on": onMap} + newYAML, err := yaml.Marshal(newOnData) + if err != nil { + workflowCallLog.Printf("Warning: failed to marshal on section with workflow_call outputs: %v", err) + return onSection + } + + return strings.TrimSuffix(string(newYAML), "\n") +} + +// buildWorkflowCallOutputsMap constructs the outputs map for on.workflow_call.outputs +// based on which safe output types are configured. +func buildWorkflowCallOutputsMap(safeOutputs *SafeOutputsConfig) map[string]workflowCallOutputEntry { + outputs := make(map[string]workflowCallOutputEntry) + + if safeOutputs.CreateIssues != nil { + outputs["created_issue_number"] = workflowCallOutputEntry{ + Description: "Number of the first created issue", + Value: "${{ jobs.safe_outputs.outputs.created_issue_number }}", + } + outputs["created_issue_url"] = workflowCallOutputEntry{ + Description: "URL of the first created issue", + Value: "${{ jobs.safe_outputs.outputs.created_issue_url }}", + } + } + + if safeOutputs.CreatePullRequests != nil { + outputs["created_pr_number"] = workflowCallOutputEntry{ + Description: "Number of the first created pull request", + Value: "${{ jobs.safe_outputs.outputs.created_pr_number }}", + } + outputs["created_pr_url"] = workflowCallOutputEntry{ + Description: "URL of the first created pull request", + Value: "${{ jobs.safe_outputs.outputs.created_pr_url }}", + } + } + + if safeOutputs.AddComments != nil { + outputs["comment_id"] = workflowCallOutputEntry{ + Description: "ID of the first added comment", + Value: "${{ jobs.safe_outputs.outputs.comment_id }}", + } + outputs["comment_url"] = workflowCallOutputEntry{ + Description: "URL of the first added comment", + Value: "${{ jobs.safe_outputs.outputs.comment_url }}", + } + } + + if safeOutputs.PushToPullRequestBranch != nil { + outputs["push_commit_sha"] = workflowCallOutputEntry{ + Description: "SHA of the pushed commit", + Value: "${{ jobs.safe_outputs.outputs.push_commit_sha }}", + } + outputs["push_commit_url"] = workflowCallOutputEntry{ + Description: "URL of the pushed commit", + Value: "${{ jobs.safe_outputs.outputs.push_commit_url }}", + } + } + + return outputs +} diff --git a/pkg/workflow/compiler_workflow_call_test.go b/pkg/workflow/compiler_workflow_call_test.go new file mode 100644 index 0000000000..a4396d8b9f --- /dev/null +++ b/pkg/workflow/compiler_workflow_call_test.go @@ -0,0 +1,304 @@ +//go:build !integration + +package workflow + +import ( + "os" + "path/filepath" + "testing" + + "github.com/github/gh-aw/pkg/testutil" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestInjectWorkflowCallOutputs(t *testing.T) { + compiler := NewCompiler() + + tests := []struct { + name string + onSection string + safeOutputs *SafeOutputsConfig + expectContains []string + expectAbsent []string + expectUnchanged bool + }{ + { + name: "no workflow_call - no injection", + onSection: `"on": + push: + workflow_dispatch:`, + safeOutputs: &SafeOutputsConfig{ + CreateIssues: &CreateIssuesConfig{}, + }, + expectUnchanged: true, + }, + { + name: "nil safe outputs - no injection", + onSection: `"on": + workflow_call:`, + safeOutputs: nil, + expectUnchanged: true, + }, + { + name: "empty SafeOutputsConfig - no injection", + onSection: `"on": + workflow_call:`, + safeOutputs: &SafeOutputsConfig{}, + expectUnchanged: true, + }, + { + name: "workflow_call with create-issue outputs", + onSection: `"on": + workflow_call: + workflow_dispatch:`, + safeOutputs: &SafeOutputsConfig{ + CreateIssues: &CreateIssuesConfig{}, + }, + expectContains: []string{ + "workflow_call:", + "outputs:", + "created_issue_number:", + "created_issue_url:", + "jobs.safe_outputs.outputs.created_issue_number", + "jobs.safe_outputs.outputs.created_issue_url", + }, + }, + { + name: "workflow_call with create-pull-request outputs", + onSection: `"on": + workflow_call:`, + safeOutputs: &SafeOutputsConfig{ + CreatePullRequests: &CreatePullRequestsConfig{}, + }, + expectContains: []string{ + "created_pr_number:", + "created_pr_url:", + "jobs.safe_outputs.outputs.created_pr_number", + "jobs.safe_outputs.outputs.created_pr_url", + }, + expectAbsent: []string{ + "created_issue_number:", + }, + }, + { + name: "workflow_call with add-comment outputs", + onSection: `"on": + workflow_call:`, + safeOutputs: &SafeOutputsConfig{ + AddComments: &AddCommentsConfig{}, + }, + expectContains: []string{ + "comment_id:", + "comment_url:", + "jobs.safe_outputs.outputs.comment_id", + "jobs.safe_outputs.outputs.comment_url", + }, + }, + { + name: "workflow_call with push-to-pull-request-branch outputs", + onSection: `"on": + workflow_call:`, + safeOutputs: &SafeOutputsConfig{ + PushToPullRequestBranch: &PushToPullRequestBranchConfig{}, + }, + expectContains: []string{ + "push_commit_sha:", + "push_commit_url:", + "jobs.safe_outputs.outputs.push_commit_sha", + "jobs.safe_outputs.outputs.push_commit_url", + }, + }, + { + name: "workflow_call with multiple safe output types", + onSection: `"on": + workflow_call: + issues: + types: [opened]`, + safeOutputs: &SafeOutputsConfig{ + CreateIssues: &CreateIssuesConfig{}, + CreatePullRequests: &CreatePullRequestsConfig{}, + AddComments: &AddCommentsConfig{}, + }, + expectContains: []string{ + "created_issue_number:", + "created_issue_url:", + "created_pr_number:", + "created_pr_url:", + "comment_id:", + "comment_url:", + }, + }, + { + name: "workflow_call with no relevant safe output types", + onSection: `"on": + workflow_call:`, + safeOutputs: &SafeOutputsConfig{ + AssignToAgent: &AssignToAgentConfig{}, + }, + expectUnchanged: true, + }, + { + name: "user-defined outputs are preserved when merged", + onSection: `"on": + workflow_call: + outputs: + my_custom_output: + description: Custom output + value: ${{ jobs.my_job.outputs.my_value }}`, + safeOutputs: &SafeOutputsConfig{ + CreateIssues: &CreateIssuesConfig{}, + }, + expectContains: []string{ + "my_custom_output:", + "created_issue_number:", + "created_issue_url:", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := compiler.injectWorkflowCallOutputs(tt.onSection, tt.safeOutputs) + + if tt.expectUnchanged { + assert.Equal(t, tt.onSection, result, "on section should be unchanged") + return + } + + require.NotEmpty(t, result, "result should not be empty") + + for _, expected := range tt.expectContains { + assert.Contains(t, result, expected, + "expected result to contain %q", expected) + } + for _, absent := range tt.expectAbsent { + assert.NotContains(t, result, absent, + "expected result NOT to contain %q", absent) + } + }) + } +} + +func TestBuildWorkflowCallOutputsMap(t *testing.T) { + tests := []struct { + name string + safeOutputs *SafeOutputsConfig + expectKeys []string + absentKeys []string + }{ + { + name: "create-issue adds 2 outputs", + safeOutputs: &SafeOutputsConfig{CreateIssues: &CreateIssuesConfig{}}, + expectKeys: []string{"created_issue_number", "created_issue_url"}, + absentKeys: []string{"created_pr_number", "comment_id", "push_commit_sha"}, + }, + { + name: "create-pull-request adds 2 outputs", + safeOutputs: &SafeOutputsConfig{CreatePullRequests: &CreatePullRequestsConfig{}}, + expectKeys: []string{"created_pr_number", "created_pr_url"}, + absentKeys: []string{"created_issue_number"}, + }, + { + name: "add-comment adds 2 outputs", + safeOutputs: &SafeOutputsConfig{AddComments: &AddCommentsConfig{}}, + expectKeys: []string{"comment_id", "comment_url"}, + }, + { + name: "push-to-pull-request-branch adds 2 outputs", + safeOutputs: &SafeOutputsConfig{PushToPullRequestBranch: &PushToPullRequestBranchConfig{}}, + expectKeys: []string{"push_commit_sha", "push_commit_url"}, + }, + { + name: "no relevant types returns empty map", + safeOutputs: &SafeOutputsConfig{AssignToAgent: &AssignToAgentConfig{}}, + absentKeys: []string{"created_issue_number", "created_pr_number", "comment_id", "push_commit_sha"}, + }, + { + name: "multiple types produce all outputs", + safeOutputs: &SafeOutputsConfig{ + CreateIssues: &CreateIssuesConfig{}, + CreatePullRequests: &CreatePullRequestsConfig{}, + AddComments: &AddCommentsConfig{}, + PushToPullRequestBranch: &PushToPullRequestBranchConfig{}, + }, + expectKeys: []string{ + "created_issue_number", "created_issue_url", + "created_pr_number", "created_pr_url", + "comment_id", "comment_url", + "push_commit_sha", "push_commit_url", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := buildWorkflowCallOutputsMap(tt.safeOutputs) + + for _, key := range tt.expectKeys { + entry, ok := result[key] + assert.True(t, ok, "expected key %q in outputs map", key) + assert.NotEmpty(t, entry.Description, "description for %q should not be empty", key) + assert.NotEmpty(t, entry.Value, "value for %q should not be empty", key) + assert.Contains(t, entry.Value, "jobs.safe_outputs.outputs.", + "value for %q should reference safe_outputs job", key) + } + for _, key := range tt.absentKeys { + _, ok := result[key] + assert.False(t, ok, "key %q should not be in outputs map", key) + } + }) + } +} + +// TestWorkflowCallOutputsEndToEnd tests that compiling a workflow with workflow_call + safe-outputs +// produces the correct on.workflow_call.outputs section in the compiled YAML. +func TestWorkflowCallOutputsEndToEnd(t *testing.T) { + workflowContent := `--- +on: + workflow_call: + workflow_dispatch: +engine: copilot +safe-outputs: + create-issue: + title-prefix: "[ai] " + add-comment: + max: 1 +--- + +# Test Workflow + +Create an issue and add a comment. +` + + tmpDir := testutil.TempDir(t, "workflow-call-outputs-test") + testFile := filepath.Join(tmpDir, "test.md") + err := os.WriteFile(testFile, []byte(workflowContent), 0644) + require.NoError(t, err, "failed to write test file") + + compiler := NewCompiler() + workflowData, err := compiler.ParseWorkflowFile(testFile) + require.NoError(t, err, "failed to parse workflow file") + + yamlOutput, err := compiler.generateYAML(workflowData, testFile) + require.NoError(t, err, "failed to generate YAML") + + // Verify workflow_call outputs section is present + assert.Contains(t, yamlOutput, "workflow_call:", "should contain workflow_call trigger") + assert.Contains(t, yamlOutput, "outputs:", "should contain outputs section") + + // Verify create-issue outputs + assert.Contains(t, yamlOutput, "created_issue_number:", "should contain created_issue_number") + assert.Contains(t, yamlOutput, "created_issue_url:", "should contain created_issue_url") + assert.Contains(t, yamlOutput, "jobs.safe_outputs.outputs.created_issue_number", "should reference safe_outputs job created_issue_number") + + // Verify add-comment outputs + assert.Contains(t, yamlOutput, "comment_id:", "should contain comment_id") + assert.Contains(t, yamlOutput, "comment_url:", "should contain comment_url") + + // Verify safe_outputs job outputs contain the new individual outputs + assert.Contains(t, yamlOutput, "created_issue_number: ${{ steps.process_safe_outputs.outputs.created_issue_number }}", + "safe_outputs job should expose created_issue_number") + assert.Contains(t, yamlOutput, "comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }}", + "safe_outputs job should expose comment_id") +} diff --git a/pkg/workflow/compiler_yaml.go b/pkg/workflow/compiler_yaml.go index 640d65e55c..f0a7940530 100644 --- a/pkg/workflow/compiler_yaml.go +++ b/pkg/workflow/compiler_yaml.go @@ -150,7 +150,13 @@ func (c *Compiler) generateWorkflowHeader(yaml *strings.Builder, data *WorkflowD func (c *Compiler) generateWorkflowBody(yaml *strings.Builder, data *WorkflowData) { // Write basic workflow structure fmt.Fprintf(yaml, "name: \"%s\"\n", data.Name) - yaml.WriteString(data.On + "\n\n") + + // Inject on.workflow_call.outputs when workflow_call is configured and safe-outputs are present + onSection := data.On + if data.SafeOutputs != nil { + onSection = c.injectWorkflowCallOutputs(onSection, data.SafeOutputs) + } + yaml.WriteString(onSection + "\n\n") // Note: GitHub Actions doesn't support workflow-level if conditions // The workflow_run safety check is added to individual jobs instead From 01ceb245df00707b94fb82cfd08addc45d8394aa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 22:02:11 +0000 Subject: [PATCH 3/4] test: add compiled lock file validation tests for safe-output outputs Add compiled_lock_files_test.go with 4 test functions that validate the compiled .lock.yml files in .github/workflows/ against their source .md files: - TestCompiledLockFiles_SafeOutputsJobOutputs: verifies the safe_outputs job exposes named outputs for each configured safe-output type (79 workflows checked) - TestCompiledLockFiles_WorkflowCallOutputs: verifies on.workflow_call.outputs is correctly populated for workflow_call + safe-output workflows - TestCompiledLockFiles_NoSpuriousWorkflowCallOutputs: verifies non- workflow_call workflows don't get spurious outputs injected (78 workflows) - TestCompiledLockFiles_SmokeWorkflowCallHasExpectedOutputs: focused test on the canonical smoke-workflow-call workflow Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/compiled_lock_files_test.go | 322 +++++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 pkg/workflow/compiled_lock_files_test.go diff --git a/pkg/workflow/compiled_lock_files_test.go b/pkg/workflow/compiled_lock_files_test.go new file mode 100644 index 0000000000..a731e955ed --- /dev/null +++ b/pkg/workflow/compiled_lock_files_test.go @@ -0,0 +1,322 @@ +//go:build !integration + +package workflow + +import ( + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// workflowsDir is the path to the .github/workflows directory relative to this test file. +const workflowsDir = "../../.github/workflows" + +// lockFileOutputMapping describes what outputs a compiled lock file must expose, derived from +// the SafeOutputsConfig parsed from the source .md file. +type lockFileOutputMapping struct { + // configPresent returns true when the safe-output type is configured. + configPresent func(*SafeOutputsConfig) bool + // jobOutputKeys are the keys that must appear in the safe_outputs job's outputs section. + jobOutputKeys []string + // workflowCallOutputKeys are the keys that must appear in on.workflow_call.outputs when the + // workflow uses workflow_call as a trigger. + workflowCallOutputKeys []string +} + +// lockFileOutputMappings enumerates all safe-output types that produce named outputs. +var lockFileOutputMappings = []lockFileOutputMapping{ + { + configPresent: func(s *SafeOutputsConfig) bool { return s.CreateIssues != nil }, + jobOutputKeys: []string{"created_issue_number:", "created_issue_url:"}, + workflowCallOutputKeys: []string{"created_issue_number:", "created_issue_url:"}, + }, + { + configPresent: func(s *SafeOutputsConfig) bool { return s.CreatePullRequests != nil }, + jobOutputKeys: []string{"created_pr_number:", "created_pr_url:"}, + workflowCallOutputKeys: []string{"created_pr_number:", "created_pr_url:"}, + }, + { + configPresent: func(s *SafeOutputsConfig) bool { return s.AddComments != nil }, + jobOutputKeys: []string{"comment_id:", "comment_url:"}, + workflowCallOutputKeys: []string{"comment_id:", "comment_url:"}, + }, + { + configPresent: func(s *SafeOutputsConfig) bool { return s.PushToPullRequestBranch != nil }, + jobOutputKeys: []string{"push_commit_sha:", "push_commit_url:"}, + workflowCallOutputKeys: []string{"push_commit_sha:", "push_commit_url:"}, + }, +} + +// extractSafeOutputsJobSection returns the text of the safe_outputs job block from a lock file. +// The block starts at " safe_outputs:" and extends until the next top-level job entry or EOF. +func extractSafeOutputsJobSection(lockContent string) string { + marker := "\n safe_outputs:" + idx := strings.Index(lockContent, marker) + if idx < 0 { + return "" + } + rest := lockContent[idx+1:] // skip the leading newline + lines := strings.Split(rest, "\n") + var sb strings.Builder + for i, line := range lines { + if i == 0 { + sb.WriteString(line + "\n") + continue + } + // A new top-level job starts with exactly two spaces then a word char (not more spaces). + if len(line) > 2 && line[0] == ' ' && line[1] == ' ' && line[2] != ' ' && strings.Contains(line, ":") { + break + } + sb.WriteString(line + "\n") + } + return sb.String() +} + +// extractWorkflowCallSection returns the text of the on section (up to but not including the +// first top-level non-on key) from a compiled lock file. +func extractWorkflowCallSection(lockContent string) string { + for _, trigger := range []string{"\n\"on\":\n", "\non:\n"} { + idx := strings.Index(lockContent, trigger) + if idx < 0 { + continue + } + onStart := idx + len(trigger) + rest := lockContent[onStart:] + lines := strings.Split(rest, "\n") + var sb strings.Builder + for _, line := range lines { + // Top-level YAML key (no leading spaces) ends the "on" block. + if len(line) > 0 && line[0] != ' ' && strings.Contains(line, ":") { + break + } + sb.WriteString(line + "\n") + } + return sb.String() + } + return "" +} + +// parseSafeOutputsForLockFileTest parses the source .md workflow file and returns the +// SafeOutputsConfig and the "on" section text, using the compiler's own parsing logic. +// Returns nil config when the workflow does not have safe-outputs configured. +func parseSafeOutputsForLockFileTest(mdPath string) (*SafeOutputsConfig, string, error) { + compiler := NewCompiler() + data, err := compiler.ParseWorkflowFile(mdPath) + if err != nil { + return nil, "", err + } + return data.SafeOutputs, data.On, nil +} + +// TestCompiledLockFiles_SafeOutputsJobOutputs validates that every compiled lock file exposes +// the expected individual named outputs on its safe_outputs job, based on what safe-output +// types are configured in the corresponding source .md file. +func TestCompiledLockFiles_SafeOutputsJobOutputs(t *testing.T) { + mdFiles, err := filepath.Glob(filepath.Join(workflowsDir, "*.md")) + require.NoError(t, err, "should glob .md workflow files") + require.NotEmpty(t, mdFiles, "should find at least one .md workflow file") + + checkedWorkflows := 0 + + for _, mdPath := range mdFiles { + lockPath := strings.TrimSuffix(mdPath, ".md") + ".lock.yml" + + safeOutputs, _, parseErr := parseSafeOutputsForLockFileTest(mdPath) + if parseErr != nil || safeOutputs == nil { + continue // skip workflows without safe-outputs or that fail to parse + } + + lockBytes, err := os.ReadFile(lockPath) + if err != nil { + continue // lock file may not exist yet + } + lockContent := string(lockBytes) + + safeOutputsJob := extractSafeOutputsJobSection(lockContent) + if safeOutputsJob == "" { + continue // workflow may not produce a safe_outputs job (e.g. runtime-import) + } + + baseName := filepath.Base(mdPath) + + for _, mapping := range lockFileOutputMappings { + if !mapping.configPresent(safeOutputs) { + continue + } + for _, outputKey := range mapping.jobOutputKeys { + assert.Contains(t, safeOutputsJob, outputKey, + "lock file %s: safe_outputs job should expose %s", baseName, outputKey) + } + } + + checkedWorkflows++ + } + + assert.Positive(t, checkedWorkflows, "should have validated at least one workflow with safe-outputs") + t.Logf("Validated safe_outputs job outputs for %d workflow(s)", checkedWorkflows) +} + +// TestCompiledLockFiles_WorkflowCallOutputs validates that compiled lock files for workflows +// using workflow_call + safe-outputs automatically include on.workflow_call.outputs declarations. +func TestCompiledLockFiles_WorkflowCallOutputs(t *testing.T) { + mdFiles, err := filepath.Glob(filepath.Join(workflowsDir, "*.md")) + require.NoError(t, err, "should glob .md workflow files") + require.NotEmpty(t, mdFiles, "should find at least one .md workflow file") + + checkedWorkflows := 0 + + for _, mdPath := range mdFiles { + lockPath := strings.TrimSuffix(mdPath, ".md") + ".lock.yml" + + safeOutputs, onSection, parseErr := parseSafeOutputsForLockFileTest(mdPath) + if parseErr != nil || safeOutputs == nil { + continue + } + // Only check workflows that have workflow_call as a trigger. + if !strings.Contains(onSection, "workflow_call") { + continue + } + + lockBytes, err := os.ReadFile(lockPath) + if err != nil { + t.Errorf("lock file missing for %s: %v", filepath.Base(mdPath), err) + continue + } + lockContent := string(lockBytes) + baseName := filepath.Base(mdPath) + + onLockSection := extractWorkflowCallSection(lockContent) + + // The on section must contain a workflow_call: key. + assert.Contains(t, onLockSection, "workflow_call:", "lock file %s should have workflow_call trigger", baseName) + + workflowCallIdx := strings.Index(onLockSection, "workflow_call:") + if workflowCallIdx < 0 { + continue + } + workflowCallBlock := onLockSection[workflowCallIdx:] + + // Determine which outputs we expect based on configured safe-output types. + expectedOutputs := buildWorkflowCallOutputsMap(safeOutputs) + if len(expectedOutputs) > 0 { + assert.Contains(t, workflowCallBlock, "outputs:", + "lock file %s: on.workflow_call should contain an outputs: section", baseName) + + for _, mapping := range lockFileOutputMappings { + if !mapping.configPresent(safeOutputs) { + continue + } + for _, outputKey := range mapping.workflowCallOutputKeys { + assert.Contains(t, workflowCallBlock, outputKey, + "lock file %s: on.workflow_call.outputs should include %s", baseName, outputKey) + } + } + } + + checkedWorkflows++ + } + + assert.Positive(t, checkedWorkflows, + "should have validated at least one workflow with workflow_call + safe-outputs") + t.Logf("Validated on.workflow_call.outputs for %d workflow(s)", checkedWorkflows) +} + +// TestCompiledLockFiles_NoSpuriousWorkflowCallOutputs validates that workflows WITHOUT +// workflow_call do NOT have outputs injected into the on section. +func TestCompiledLockFiles_NoSpuriousWorkflowCallOutputs(t *testing.T) { + mdFiles, err := filepath.Glob(filepath.Join(workflowsDir, "*.md")) + require.NoError(t, err, "should glob .md workflow files") + require.NotEmpty(t, mdFiles, "should find at least one .md workflow file") + + checkedWorkflows := 0 + + for _, mdPath := range mdFiles { + lockPath := strings.TrimSuffix(mdPath, ".md") + ".lock.yml" + + safeOutputs, onSection, parseErr := parseSafeOutputsForLockFileTest(mdPath) + if parseErr != nil || safeOutputs == nil { + continue + } + // Only check workflows that have safe-outputs but do NOT use workflow_call. + if strings.Contains(onSection, "workflow_call") { + continue + } + + lockBytes, err := os.ReadFile(lockPath) + if err != nil { + continue + } + lockContent := string(lockBytes) + + onLockSection := extractWorkflowCallSection(lockContent) + baseName := filepath.Base(mdPath) + + // If the on section somehow has workflow_call, its outputs sub-key must be absent. + if strings.Contains(onLockSection, "workflow_call:") { + workflowCallIdx := strings.Index(onLockSection, "workflow_call:") + workflowCallBlock := onLockSection[workflowCallIdx:] + assert.NotContains(t, workflowCallBlock, "outputs:", + "lock file %s: on.workflow_call should NOT have outputs (no workflow_call trigger in source)", baseName) + } + + checkedWorkflows++ + } + + assert.Positive(t, checkedWorkflows, + "should have validated at least one workflow with safe-outputs but without workflow_call") + t.Logf("Validated no spurious workflow_call outputs for %d workflow(s)", checkedWorkflows) +} + +// TestCompiledLockFiles_SmokeWorkflowCallHasExpectedOutputs is a focused test on the +// smoke-workflow-call workflow, the canonical workflow_call example in this repo. +func TestCompiledLockFiles_SmokeWorkflowCallHasExpectedOutputs(t *testing.T) { + lockPath := filepath.Join(workflowsDir, "smoke-workflow-call.lock.yml") + mdPath := filepath.Join(workflowsDir, "smoke-workflow-call.md") + + safeOutputs, onSection, err := parseSafeOutputsForLockFileTest(mdPath) + require.NoError(t, err, "should parse smoke-workflow-call.md") + require.NotNil(t, safeOutputs, "smoke-workflow-call.md should have safe-outputs") + + lockBytes, err := os.ReadFile(lockPath) + require.NoError(t, err, "smoke-workflow-call.lock.yml should be readable") + lockContent := string(lockBytes) + + t.Run("SourceHasWorkflowCallTrigger", func(t *testing.T) { + assert.Contains(t, onSection, "workflow_call", "source md should have workflow_call trigger") + }) + + t.Run("LockHasWorkflowCallTrigger", func(t *testing.T) { + assert.Contains(t, lockContent, "workflow_call:", "lock file should contain workflow_call trigger") + }) + + t.Run("LockHasSafeOutputsJob", func(t *testing.T) { + assert.Contains(t, lockContent, "safe_outputs:", "lock file should contain safe_outputs job") + }) + + // The smoke workflow uses add-comment – verify its outputs appear in both places. + require.NotNil(t, safeOutputs.AddComments, "smoke-workflow-call.md should have add-comment configured") + + t.Run("WorkflowCallOutputs_CommentID", func(t *testing.T) { + onLockSection := extractWorkflowCallSection(lockContent) + workflowCallIdx := strings.Index(onLockSection, "workflow_call:") + require.GreaterOrEqual(t, workflowCallIdx, 0, "on section should contain workflow_call:") + workflowCallBlock := onLockSection[workflowCallIdx:] + assert.Contains(t, workflowCallBlock, "outputs:", "on.workflow_call should have outputs") + assert.Contains(t, workflowCallBlock, "comment_id:", "on.workflow_call.outputs should include comment_id") + assert.Contains(t, workflowCallBlock, "comment_url:", "on.workflow_call.outputs should include comment_url") + assert.Contains(t, workflowCallBlock, "jobs.safe_outputs.outputs.comment_id", + "workflow_call output value should reference safe_outputs job") + }) + + t.Run("SafeOutputsJobOutputs_CommentID", func(t *testing.T) { + safeOutputsJob := extractSafeOutputsJobSection(lockContent) + assert.Contains(t, safeOutputsJob, "comment_id:", "safe_outputs job should expose comment_id output") + assert.Contains(t, safeOutputsJob, "comment_url:", "safe_outputs job should expose comment_url output") + assert.Contains(t, safeOutputsJob, "steps.process_safe_outputs.outputs.comment_id", + "safe_outputs job output should reference process_safe_outputs step") + }) +} From 030b5b0d4f994cf6b28cae6497ef4c74e4afc2e3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 22:10:29 +0000 Subject: [PATCH 4/4] refactor: extract action output emitting to safe_outputs_action_outputs.cjs Move the block that emits individual named step outputs (created_issue_number/url, created_pr_number/url, comment_id/url, push_commit_sha/url) from safe_output_unified_handler_manager.cjs into a new dedicated module safe_outputs_action_outputs.cjs, exported as emitSafeOutputActionOutputs(). Add safe_outputs_action_outputs.test.cjs with 12 test cases covering all four safe output types, array unwrapping for add_comment, error/skip scenarios, and info logging verification. Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../safe_output_unified_handler_manager.cjs | 61 +------- .../setup/js/safe_outputs_action_outputs.cjs | 98 ++++++++++++ .../js/safe_outputs_action_outputs.test.cjs | 146 ++++++++++++++++++ 3 files changed, 246 insertions(+), 59 deletions(-) create mode 100644 actions/setup/js/safe_outputs_action_outputs.cjs create mode 100644 actions/setup/js/safe_outputs_action_outputs.test.cjs diff --git a/actions/setup/js/safe_output_unified_handler_manager.cjs b/actions/setup/js/safe_output_unified_handler_manager.cjs index 88456c51cc..6799268539 100644 --- a/actions/setup/js/safe_output_unified_handler_manager.cjs +++ b/actions/setup/js/safe_output_unified_handler_manager.cjs @@ -27,6 +27,7 @@ const { sortSafeOutputMessages } = require("./safe_output_topological_sort.cjs") const { loadCustomSafeOutputJobTypes } = require("./safe_output_helpers.cjs"); const { createReviewBuffer } = require("./pr_review_buffer.cjs"); const { createManifestLogger, ensureManifestExists, extractCreatedItemFromResult } = require("./safe_output_manifest.cjs"); +const { emitSafeOutputActionOutputs } = require("./safe_outputs_action_outputs.cjs"); /** * Handler map configuration for regular handlers @@ -1152,65 +1153,7 @@ async function main() { // Emit individual named outputs for the first successful result of each safe output type. // These outputs enable workflow_call callers to access specific results. - const successfulResults = processingResult.results.filter(r => r.success && r.result); - - // create_issue: created_issue_number, created_issue_url - const firstIssueResult = successfulResults.find(r => r.type === "create_issue"); - if (firstIssueResult?.result && !Array.isArray(firstIssueResult.result)) { - const r = firstIssueResult.result; - if (r.number != null) { - core.setOutput("created_issue_number", String(r.number)); - core.info(`Exported created_issue_number: ${r.number}`); - } - if (r.url) { - core.setOutput("created_issue_url", r.url); - core.info(`Exported created_issue_url: ${r.url}`); - } - } - - // create_pull_request: created_pr_number, created_pr_url - const firstPRResult = successfulResults.find(r => r.type === "create_pull_request"); - if (firstPRResult?.result && !Array.isArray(firstPRResult.result)) { - const r = firstPRResult.result; - if (r.pull_request_number != null) { - core.setOutput("created_pr_number", String(r.pull_request_number)); - core.info(`Exported created_pr_number: ${r.pull_request_number}`); - } - if (r.pull_request_url) { - core.setOutput("created_pr_url", r.pull_request_url); - core.info(`Exported created_pr_url: ${r.pull_request_url}`); - } - } - - // add_comment: comment_id, comment_url - // add_comment handlers may return an array when multiple comments were queued for the same - // message (e.g., fallback retries). We take the first element to get the primary comment. - const firstCommentResult = successfulResults.find(r => r.type === "add_comment"); - if (firstCommentResult?.result) { - const r = Array.isArray(firstCommentResult.result) ? firstCommentResult.result[0] : firstCommentResult.result; - if (r?.commentId != null) { - core.setOutput("comment_id", String(r.commentId)); - core.info(`Exported comment_id: ${r.commentId}`); - } - if (r?.url) { - core.setOutput("comment_url", r.url); - core.info(`Exported comment_url: ${r.url}`); - } - } - - // push_to_pull_request_branch: push_commit_sha, push_commit_url - const firstPushResult = successfulResults.find(r => r.type === "push_to_pull_request_branch"); - if (firstPushResult?.result && !Array.isArray(firstPushResult.result)) { - const r = firstPushResult.result; - if (r.commit_sha) { - core.setOutput("push_commit_sha", r.commit_sha); - core.info(`Exported push_commit_sha: ${r.commit_sha}`); - } - if (r.commit_url) { - core.setOutput("push_commit_url", r.commit_url); - core.info(`Exported push_commit_url: ${r.commit_url}`); - } - } + emitSafeOutputActionOutputs(processingResult); // Ensure the manifest file always exists for artifact upload (even if no items were created). // Skip in staged mode — no real items were created so no manifest should be emitted. diff --git a/actions/setup/js/safe_outputs_action_outputs.cjs b/actions/setup/js/safe_outputs_action_outputs.cjs new file mode 100644 index 0000000000..2c4a0f6363 --- /dev/null +++ b/actions/setup/js/safe_outputs_action_outputs.cjs @@ -0,0 +1,98 @@ +// @ts-check +/// + +/** + * Action outputs for safe-output results + * + * Emits individual named step outputs for the first successful result of each + * safe output type. These outputs allow workflow_call callers to access specific + * results without having to parse the temporary_id_map. + */ + +/** + * @typedef {Object} ProcessingResultItem + * @property {boolean} success + * @property {string} type + * @property {any} result + */ + +/** + * @typedef {Object} ProcessingResult + * @property {ProcessingResultItem[]} results + */ + +/** + * Emit individual named step outputs for the first successful result of each + * safe output type in processingResult. + * + * Output names: + * create_issue → created_issue_number, created_issue_url + * create_pull_request → created_pr_number, created_pr_url + * add_comment → comment_id, comment_url + * push_to_pull_request_branch → push_commit_sha, push_commit_url + * + * @param {ProcessingResult} processingResult - Result from processMessages() + */ +function emitSafeOutputActionOutputs(processingResult) { + const successfulResults = processingResult.results.filter(r => r.success && r.result); + + // create_issue: created_issue_number, created_issue_url + const firstIssueResult = successfulResults.find(r => r.type === "create_issue"); + if (firstIssueResult?.result && !Array.isArray(firstIssueResult.result)) { + const r = firstIssueResult.result; + if (r.number != null) { + core.setOutput("created_issue_number", String(r.number)); + core.info(`Exported created_issue_number: ${r.number}`); + } + if (r.url) { + core.setOutput("created_issue_url", r.url); + core.info(`Exported created_issue_url: ${r.url}`); + } + } + + // create_pull_request: created_pr_number, created_pr_url + const firstPRResult = successfulResults.find(r => r.type === "create_pull_request"); + if (firstPRResult?.result && !Array.isArray(firstPRResult.result)) { + const r = firstPRResult.result; + if (r.pull_request_number != null) { + core.setOutput("created_pr_number", String(r.pull_request_number)); + core.info(`Exported created_pr_number: ${r.pull_request_number}`); + } + if (r.pull_request_url) { + core.setOutput("created_pr_url", r.pull_request_url); + core.info(`Exported created_pr_url: ${r.pull_request_url}`); + } + } + + // add_comment: comment_id, comment_url + // add_comment handlers may return an array when multiple comments were queued for the same + // message (e.g., fallback retries). We take the first element to get the primary comment. + const firstCommentResult = successfulResults.find(r => r.type === "add_comment"); + if (firstCommentResult?.result) { + const r = Array.isArray(firstCommentResult.result) ? firstCommentResult.result[0] : firstCommentResult.result; + if (r?.commentId != null) { + core.setOutput("comment_id", String(r.commentId)); + core.info(`Exported comment_id: ${r.commentId}`); + } + if (r?.url) { + core.setOutput("comment_url", r.url); + core.info(`Exported comment_url: ${r.url}`); + } + } + + // push_to_pull_request_branch: push_commit_sha, push_commit_url + const firstPushResult = successfulResults.find(r => r.type === "push_to_pull_request_branch"); + if (firstPushResult?.result && !Array.isArray(firstPushResult.result)) { + const r = firstPushResult.result; + if (r.commit_sha) { + core.setOutput("push_commit_sha", r.commit_sha); + core.info(`Exported push_commit_sha: ${r.commit_sha}`); + } + if (r.commit_url) { + core.setOutput("push_commit_url", r.commit_url); + core.info(`Exported push_commit_url: ${r.commit_url}`); + } + } +} + +module.exports = { emitSafeOutputActionOutputs }; diff --git a/actions/setup/js/safe_outputs_action_outputs.test.cjs b/actions/setup/js/safe_outputs_action_outputs.test.cjs new file mode 100644 index 0000000000..3e23a4d4dd --- /dev/null +++ b/actions/setup/js/safe_outputs_action_outputs.test.cjs @@ -0,0 +1,146 @@ +// @ts-check +import { describe, it, expect, beforeEach } from "vitest"; +import { emitSafeOutputActionOutputs } from "./safe_outputs_action_outputs.cjs"; + +describe("emitSafeOutputActionOutputs", () => { + /** @type {Record} */ + let outputs; + /** @type {string[]} */ + let infoMessages; + + beforeEach(() => { + outputs = {}; + infoMessages = []; + + global.core = { + info: (/** @type {string} */ msg) => { + infoMessages.push(msg); + }, + setOutput: (/** @type {string} */ name, /** @type {string} */ value) => { + outputs[name] = value; + }, + }; + }); + + it("emits created_issue_number and created_issue_url for create_issue result", () => { + emitSafeOutputActionOutputs({ + results: [{ success: true, type: "create_issue", result: { number: 42, url: "https://github.com/owner/repo/issues/42" } }], + }); + + expect(outputs["created_issue_number"]).toBe("42"); + expect(outputs["created_issue_url"]).toBe("https://github.com/owner/repo/issues/42"); + }); + + it("emits only the first successful create_issue result", () => { + emitSafeOutputActionOutputs({ + results: [ + { success: true, type: "create_issue", result: { number: 1, url: "https://github.com/owner/repo/issues/1" } }, + { success: true, type: "create_issue", result: { number: 2, url: "https://github.com/owner/repo/issues/2" } }, + ], + }); + + expect(outputs["created_issue_number"]).toBe("1"); + expect(outputs["created_issue_url"]).toBe("https://github.com/owner/repo/issues/1"); + }); + + it("skips failed create_issue results", () => { + emitSafeOutputActionOutputs({ + results: [ + { success: false, type: "create_issue", result: { number: 99, url: "https://github.com/owner/repo/issues/99" } }, + { success: true, type: "create_issue", result: { number: 5, url: "https://github.com/owner/repo/issues/5" } }, + ], + }); + + expect(outputs["created_issue_number"]).toBe("5"); + }); + + it("emits created_pr_number and created_pr_url for create_pull_request result", () => { + emitSafeOutputActionOutputs({ + results: [{ success: true, type: "create_pull_request", result: { pull_request_number: 7, pull_request_url: "https://github.com/owner/repo/pull/7" } }], + }); + + expect(outputs["created_pr_number"]).toBe("7"); + expect(outputs["created_pr_url"]).toBe("https://github.com/owner/repo/pull/7"); + }); + + it("emits comment_id and comment_url for add_comment result", () => { + emitSafeOutputActionOutputs({ + results: [{ success: true, type: "add_comment", result: { commentId: 123, url: "https://github.com/owner/repo/issues/1#issuecomment-123" } }], + }); + + expect(outputs["comment_id"]).toBe("123"); + expect(outputs["comment_url"]).toBe("https://github.com/owner/repo/issues/1#issuecomment-123"); + }); + + it("unwraps array result for add_comment and uses the first element", () => { + emitSafeOutputActionOutputs({ + results: [ + { + success: true, + type: "add_comment", + result: [ + { commentId: 10, url: "https://github.com/owner/repo/issues/1#issuecomment-10" }, + { commentId: 20, url: "https://github.com/owner/repo/issues/1#issuecomment-20" }, + ], + }, + ], + }); + + expect(outputs["comment_id"]).toBe("10"); + expect(outputs["comment_url"]).toBe("https://github.com/owner/repo/issues/1#issuecomment-10"); + }); + + it("emits push_commit_sha and push_commit_url for push_to_pull_request_branch result", () => { + emitSafeOutputActionOutputs({ + results: [{ success: true, type: "push_to_pull_request_branch", result: { commit_sha: "abc123", commit_url: "https://github.com/owner/repo/commit/abc123" } }], + }); + + expect(outputs["push_commit_sha"]).toBe("abc123"); + expect(outputs["push_commit_url"]).toBe("https://github.com/owner/repo/commit/abc123"); + }); + + it("emits outputs for multiple different types in a single run", () => { + emitSafeOutputActionOutputs({ + results: [ + { success: true, type: "create_issue", result: { number: 1, url: "https://github.com/owner/repo/issues/1" } }, + { success: true, type: "add_comment", result: { commentId: 200, url: "https://github.com/owner/repo/issues/1#issuecomment-200" } }, + { success: true, type: "push_to_pull_request_branch", result: { commit_sha: "sha1", commit_url: "https://github.com/owner/repo/commit/sha1" } }, + ], + }); + + expect(outputs["created_issue_number"]).toBe("1"); + expect(outputs["comment_id"]).toBe("200"); + expect(outputs["push_commit_sha"]).toBe("sha1"); + }); + + it("emits no outputs when there are no successful results", () => { + emitSafeOutputActionOutputs({ + results: [{ success: false, type: "create_issue", result: null }], + }); + + expect(Object.keys(outputs)).toHaveLength(0); + }); + + it("emits no outputs when results array is empty", () => { + emitSafeOutputActionOutputs({ results: [] }); + + expect(Object.keys(outputs)).toHaveLength(0); + }); + + it("skips create_issue result with array result (not a single issue)", () => { + emitSafeOutputActionOutputs({ + results: [{ success: true, type: "create_issue", result: [{ number: 1 }] }], + }); + + expect(outputs["created_issue_number"]).toBeUndefined(); + }); + + it("logs info messages for each emitted output", () => { + emitSafeOutputActionOutputs({ + results: [{ success: true, type: "create_issue", result: { number: 3, url: "https://github.com/owner/repo/issues/3" } }], + }); + + expect(infoMessages.some(m => m.includes("created_issue_number"))).toBe(true); + expect(infoMessages.some(m => m.includes("created_issue_url"))).toBe(true); + }); +});