From 0f5bb4890e3c21aa88a01ed185ab25d0fd80e410 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 31 Dec 2025 02:11:13 +0000 Subject: [PATCH 1/3] Initial plan From c7f9586b642f8ca4ac1ddd66516534f06b30af25 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 31 Dec 2025 02:26:07 +0000 Subject: [PATCH 2/3] Fix JavaScript tests by reading configuration from environment variables The tests were failing because the safe output handlers (create_discussion, update_issue, close_issue) were not reading configuration from environment variables, which is how the tests provide configuration. Changes: - update_runner.cjs: Read GH_AW_UPDATE_* environment variables for configuration - create_discussion.cjs: Read GH_AW_DISCUSSION_* environment variables for configuration - close_entity_helpers.cjs: Use existing parseEntityConfig to read GH_AW_CLOSE_* environment variables All 118 test files now pass with 2398 tests passing. Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/close_entity_helpers.cjs | 11 +++++++---- actions/setup/js/create_discussion.cjs | 6 +++--- actions/setup/js/update_runner.cjs | 12 ++++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/actions/setup/js/close_entity_helpers.cjs b/actions/setup/js/close_entity_helpers.cjs index 50e3cb127b..0f67843c05 100644 --- a/actions/setup/js/close_entity_helpers.cjs +++ b/actions/setup/js/close_entity_helpers.cjs @@ -240,10 +240,13 @@ async function processCloseEntityItems(config, callbacks, handlerConfig = {}) { core.info(`Found ${items.length} ${config.itemTypeDisplay} item(s)`); - // Get configuration from handlerConfig object (not environment variables) - const requiredLabels = handlerConfig.required_labels || []; - const requiredTitlePrefix = handlerConfig.required_title_prefix || ""; - const target = handlerConfig.target || "triggering"; + // Get configuration from environment variables (if set) or handlerConfig object + const envVarPrefix = config.envVarPrefix; + const parsedConfig = parseEntityConfig(envVarPrefix); + + const requiredLabels = handlerConfig.required_labels || parsedConfig.requiredLabels; + const requiredTitlePrefix = handlerConfig.required_title_prefix || parsedConfig.requiredTitlePrefix; + const target = handlerConfig.target || parsedConfig.target; core.info(`Configuration: requiredLabels=${requiredLabels.join(",")}, requiredTitlePrefix=${requiredTitlePrefix}, target=${target}`); diff --git a/actions/setup/js/create_discussion.cjs b/actions/setup/js/create_discussion.cjs index 1c0a275b05..1744bbec81 100644 --- a/actions/setup/js/create_discussion.cjs +++ b/actions/setup/js/create_discussion.cjs @@ -144,10 +144,10 @@ async function main(config = {}) { /** @type {Map}>} */ const repoInfoCache = new Map(); - // Get configuration from config object + // Get configuration from environment variables (if set) or config object const closeOlderEnabled = config.close_older_discussions === true; - const titlePrefix = config.title_prefix || ""; - const configCategory = config.category || ""; + const titlePrefix = config.title_prefix || process.env.GH_AW_DISCUSSION_TITLE_PREFIX || ""; + const configCategory = config.category || process.env.GH_AW_DISCUSSION_CATEGORY || ""; // Parse labels from config (can be array or comma-separated string) const labelsConfig = config.labels || []; const labels = Array.isArray(labelsConfig) diff --git a/actions/setup/js/update_runner.cjs b/actions/setup/js/update_runner.cjs index b92fcda59c..bd15f07137 100644 --- a/actions/setup/js/update_runner.cjs +++ b/actions/setup/js/update_runner.cjs @@ -204,12 +204,12 @@ async function runUpdateWorkflow(config) { return; } - // Get the configuration from handler config object - const updateTarget = handlerConfig.target || "triggering"; - const canUpdateStatus = handlerConfig.allow_status === true; - const canUpdateTitle = handlerConfig.allow_title === true; - const canUpdateBody = handlerConfig.allow_body === true; - const canUpdateLabels = handlerConfig.allow_labels === true; + // Get the configuration from environment variables (if set) or handler config object + const updateTarget = handlerConfig.target || process.env.GH_AW_UPDATE_TARGET || "triggering"; + const canUpdateStatus = handlerConfig.allow_status === true || process.env.GH_AW_UPDATE_STATUS === "true"; + const canUpdateTitle = handlerConfig.allow_title === true || process.env.GH_AW_UPDATE_TITLE === "true"; + const canUpdateBody = handlerConfig.allow_body === true || process.env.GH_AW_UPDATE_BODY === "true"; + const canUpdateLabels = handlerConfig.allow_labels === true || process.env.GH_AW_UPDATE_LABELS === "true"; core.info(`Update target configuration: ${updateTarget}`); if (supportsStatus) { From 593f7acdb557cb294abee1a94a45814ac4911466 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 31 Dec 2025 02:51:37 +0000 Subject: [PATCH 3/3] Revert code changes and update tests to pass config via parameter As requested, reverted changes to the three code files (update_runner.cjs, create_discussion.cjs, close_entity_helpers.cjs) and instead updated the test files to pass configuration via the config parameter rather than environment variables. Test changes: - create_discussion.test.cjs: Pass title_prefix and category via config object - update_issue.test.cjs: Pass allow_title, allow_status, allow_body, and target via config object - close_issue.test.cjs: Pass target, required_title_prefix, and required_labels via config object All 118 test files pass (2398 tests). Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/close_entity_helpers.cjs | 11 ++++------- actions/setup/js/close_issue.test.cjs | 14 ++++---------- actions/setup/js/create_discussion.cjs | 6 +++--- actions/setup/js/create_discussion.test.cjs | 15 +++++---------- actions/setup/js/update_issue.test.cjs | 20 ++++++++------------ actions/setup/js/update_runner.cjs | 12 ++++++------ 6 files changed, 30 insertions(+), 48 deletions(-) diff --git a/actions/setup/js/close_entity_helpers.cjs b/actions/setup/js/close_entity_helpers.cjs index 0f67843c05..50e3cb127b 100644 --- a/actions/setup/js/close_entity_helpers.cjs +++ b/actions/setup/js/close_entity_helpers.cjs @@ -240,13 +240,10 @@ async function processCloseEntityItems(config, callbacks, handlerConfig = {}) { core.info(`Found ${items.length} ${config.itemTypeDisplay} item(s)`); - // Get configuration from environment variables (if set) or handlerConfig object - const envVarPrefix = config.envVarPrefix; - const parsedConfig = parseEntityConfig(envVarPrefix); - - const requiredLabels = handlerConfig.required_labels || parsedConfig.requiredLabels; - const requiredTitlePrefix = handlerConfig.required_title_prefix || parsedConfig.requiredTitlePrefix; - const target = handlerConfig.target || parsedConfig.target; + // Get configuration from handlerConfig object (not environment variables) + const requiredLabels = handlerConfig.required_labels || []; + const requiredTitlePrefix = handlerConfig.required_title_prefix || ""; + const target = handlerConfig.target || "triggering"; core.info(`Configuration: requiredLabels=${requiredLabels.join(",")}, requiredTitlePrefix=${requiredTitlePrefix}, target=${target}`); diff --git a/actions/setup/js/close_issue.test.cjs b/actions/setup/js/close_issue.test.cjs index 37a6f076e9..7ed6ba06bc 100644 --- a/actions/setup/js/close_issue.test.cjs +++ b/actions/setup/js/close_issue.test.cjs @@ -51,39 +51,33 @@ const mockCore = { debug: vi.fn(), info: vi.fn(), warning: vi.fn(), error: vi.fn }), it("should close specific issue when target is *", async () => { (setAgentOutput({ items: [{ type: "close_issue", issue_number: 100, body: "Closing this issue." }] }), - (process.env.GH_AW_CLOSE_ISSUE_TARGET = "*"), mockGithub.rest.issues.get.mockResolvedValue({ data: { number: 100, title: "[refactor] Refactor Test", labels: [{ name: "refactoring" }], state: "open", html_url: "https://github.com/testowner/testrepo/issues/100" } }), mockGithub.rest.issues.createComment.mockResolvedValue({ data: { id: 456, html_url: "https://github.com/testowner/testrepo/issues/100#issuecomment-456" } }), mockGithub.rest.issues.update.mockResolvedValue({ data: { number: 100, html_url: "https://github.com/testowner/testrepo/issues/100", title: "[refactor] Refactor Test" } }), - await eval(`(async () => { ${closeIssueScript}; await main(); })()`), + await eval(`(async () => { ${closeIssueScript}; await main({ target: "*" }); })()`), expect(mockGithub.rest.issues.get).toHaveBeenCalledWith({ owner: "testowner", repo: "testrepo", issue_number: 100 }), expect(mockCore.setOutput).toHaveBeenCalledWith("issue_number", 100)); }), it("should filter by required title prefix", async () => { (setAgentOutput({ items: [{ type: "close_issue", issue_number: 50, body: "Closing this issue." }] }), - (process.env.GH_AW_CLOSE_ISSUE_TARGET = "*"), - (process.env.GH_AW_CLOSE_ISSUE_REQUIRED_TITLE_PREFIX = "[refactor] "), mockGithub.rest.issues.get.mockResolvedValue({ data: { number: 50, title: "[bug] Bug Fix", labels: [], state: "open", html_url: "https://github.com/testowner/testrepo/issues/50" } }), - await eval(`(async () => { ${closeIssueScript}; await main(); })()`), + await eval(`(async () => { ${closeIssueScript}; await main({ target: "*", required_title_prefix: "[refactor] " }); })()`), expect(mockGithub.rest.issues.get).toHaveBeenCalled(), expect(mockGithub.rest.issues.update).not.toHaveBeenCalled(), expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining("does not have required title prefix"))); }), it("should filter by required labels", async () => { (setAgentOutput({ items: [{ type: "close_issue", issue_number: 60, body: "Closing this issue." }] }), - (process.env.GH_AW_CLOSE_ISSUE_TARGET = "*"), - (process.env.GH_AW_CLOSE_ISSUE_REQUIRED_LABELS = "automated,stale"), mockGithub.rest.issues.get.mockResolvedValue({ data: { number: 60, title: "Test Issue", labels: [{ name: "bug" }], state: "open", html_url: "https://github.com/testowner/testrepo/issues/60" } }), - await eval(`(async () => { ${closeIssueScript}; await main(); })()`), + await eval(`(async () => { ${closeIssueScript}; await main({ target: "*", required_labels: ["automated", "stale"] }); })()`), expect(mockGithub.rest.issues.get).toHaveBeenCalled(), expect(mockGithub.rest.issues.update).not.toHaveBeenCalled(), expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining("does not have required labels"))); }), it("should skip already closed issues", async () => { (setAgentOutput({ items: [{ type: "close_issue", issue_number: 70, body: "Closing this issue." }] }), - (process.env.GH_AW_CLOSE_ISSUE_TARGET = "*"), mockGithub.rest.issues.get.mockResolvedValue({ data: { number: 70, title: "Already Closed", labels: [], state: "closed", html_url: "https://github.com/testowner/testrepo/issues/70" } }), - await eval(`(async () => { ${closeIssueScript}; await main(); })()`), + await eval(`(async () => { ${closeIssueScript}; await main({ target: "*" }); })()`), expect(mockGithub.rest.issues.get).toHaveBeenCalled(), expect(mockGithub.rest.issues.update).not.toHaveBeenCalled(), expect(mockCore.info).toHaveBeenCalledWith("Issue #70 is already closed, skipping")); diff --git a/actions/setup/js/create_discussion.cjs b/actions/setup/js/create_discussion.cjs index 1744bbec81..1c0a275b05 100644 --- a/actions/setup/js/create_discussion.cjs +++ b/actions/setup/js/create_discussion.cjs @@ -144,10 +144,10 @@ async function main(config = {}) { /** @type {Map}>} */ const repoInfoCache = new Map(); - // Get configuration from environment variables (if set) or config object + // Get configuration from config object const closeOlderEnabled = config.close_older_discussions === true; - const titlePrefix = config.title_prefix || process.env.GH_AW_DISCUSSION_TITLE_PREFIX || ""; - const configCategory = config.category || process.env.GH_AW_DISCUSSION_CATEGORY || ""; + const titlePrefix = config.title_prefix || ""; + const configCategory = config.category || ""; // Parse labels from config (can be array or comma-separated string) const labelsConfig = config.labels || []; const labels = Array.isArray(labelsConfig) diff --git a/actions/setup/js/create_discussion.test.cjs b/actions/setup/js/create_discussion.test.cjs index e34ca90100..cfd2dc4c4c 100644 --- a/actions/setup/js/create_discussion.test.cjs +++ b/actions/setup/js/create_discussion.test.cjs @@ -93,8 +93,7 @@ const mockCore = { mockGithub.graphql.mockResolvedValueOnce({ createDiscussion: { discussion: { id: "D_test789", number: 1, title: "[ai] Test Discussion", url: "https://github.com/testowner/testrepo/discussions/1" } } })); const validOutput = { items: [{ type: "create_discussion", title: "Test Discussion", body: "Test discussion body" }] }; (setAgentOutput(validOutput), - (process.env.GH_AW_DISCUSSION_TITLE_PREFIX = "[ai] "), - await eval(`(async () => { ${createDiscussionScript}; await main(); })()`), + await eval(`(async () => { ${createDiscussionScript}; await main({ title_prefix: "[ai] " }); })()`), expect(mockGithub.graphql).toHaveBeenCalledWith(expect.stringContaining("mutation($repositoryId: ID!, $categoryId: ID!, $title: String!, $body: String!)"), expect.objectContaining({ title: "[ai] Test Discussion" }))); }), it("should use specified category ID when configured", async () => { @@ -112,8 +111,7 @@ const mockCore = { mockGithub.graphql.mockResolvedValueOnce({ createDiscussion: { discussion: { id: "D_test789", number: 1, title: "Test Discussion", url: "https://github.com/testowner/testrepo/discussions/1" } } })); const validOutput = { items: [{ type: "create_discussion", title: "Test Discussion", body: "Test discussion body" }] }; (setAgentOutput(validOutput), - (process.env.GH_AW_DISCUSSION_CATEGORY = "DIC_custom789"), - await eval(`(async () => { ${createDiscussionScript}; await main(); })()`), + await eval(`(async () => { ${createDiscussionScript}; await main({ category: "DIC_custom789" }); })()`), expect(mockGithub.graphql).toHaveBeenCalledWith(expect.stringContaining("mutation($repositoryId: ID!, $categoryId: ID!, $title: String!, $body: String!)"), expect.objectContaining({ categoryId: "DIC_custom789" }))); }), it("should handle repositories without discussions enabled gracefully", async () => { @@ -140,8 +138,7 @@ const mockCore = { mockGithub.graphql.mockResolvedValueOnce({ createDiscussion: { discussion: { id: "D_test789", number: 1, title: "Test Discussion", url: "https://github.com/testowner/testrepo/discussions/1" } } })); const validOutput = { items: [{ type: "create_discussion", title: "Test Discussion", body: "Test discussion body" }] }; (setAgentOutput(validOutput), - (process.env.GH_AW_DISCUSSION_CATEGORY = "Custom"), - await eval(`(async () => { ${createDiscussionScript}; await main(); })()`), + await eval(`(async () => { ${createDiscussionScript}; await main({ category: "Custom" }); })()`), expect(mockCore.info).toHaveBeenCalledWith("Using category by name: Custom (DIC_custom789)"), expect(mockGithub.graphql).toHaveBeenCalledWith(expect.stringContaining("mutation($repositoryId: ID!, $categoryId: ID!, $title: String!, $body: String!)"), expect.objectContaining({ categoryId: "DIC_custom789" }))); }), @@ -160,8 +157,7 @@ const mockCore = { mockGithub.graphql.mockResolvedValueOnce({ createDiscussion: { discussion: { id: "D_test789", number: 1, title: "Test Discussion", url: "https://github.com/testowner/testrepo/discussions/1" } } })); const validOutput = { items: [{ type: "create_discussion", title: "Test Discussion", body: "Test discussion body" }] }; (setAgentOutput(validOutput), - (process.env.GH_AW_DISCUSSION_CATEGORY = "custom-category"), - await eval(`(async () => { ${createDiscussionScript}; await main(); })()`), + await eval(`(async () => { ${createDiscussionScript}; await main({ category: "custom-category" }); })()`), expect(mockCore.info).toHaveBeenCalledWith("Using category by slug: Custom Category (DIC_custom789)"), expect(mockGithub.graphql).toHaveBeenCalledWith(expect.stringContaining("mutation($repositoryId: ID!, $categoryId: ID!, $title: String!, $body: String!)"), expect.objectContaining({ categoryId: "DIC_custom789" }))); }), @@ -170,8 +166,7 @@ const mockCore = { mockGithub.graphql.mockResolvedValueOnce({ createDiscussion: { discussion: { id: "D_test789", number: 1, title: "Test Discussion", url: "https://github.com/testowner/testrepo/discussions/1" } } })); const validOutput = { items: [{ type: "create_discussion", title: "Test Discussion", body: "Test discussion body" }] }; (setAgentOutput(validOutput), - (process.env.GH_AW_DISCUSSION_CATEGORY = "NonExistent"), - await eval(`(async () => { ${createDiscussionScript}; await main(); })()`), + await eval(`(async () => { ${createDiscussionScript}; await main({ category: "NonExistent" }); })()`), expect(mockCore.warning).toHaveBeenCalledWith('Category "NonExistent" not found by ID, name, or slug. Available categories: General'), expect(mockCore.info).toHaveBeenCalledWith("Falling back to default category: General (DIC_test456)"), expect(mockGithub.graphql).toHaveBeenCalledWith(expect.stringContaining("mutation($repositoryId: ID!, $categoryId: ID!, $title: String!, $body: String!)"), expect.objectContaining({ categoryId: "DIC_test456" }))); diff --git a/actions/setup/js/update_issue.test.cjs b/actions/setup/js/update_issue.test.cjs index f60675ba00..6aefc1610d 100644 --- a/actions/setup/js/update_issue.test.cjs +++ b/actions/setup/js/update_issue.test.cjs @@ -71,10 +71,10 @@ const mockCore = { expect(mockGithub.rest.issues.update).not.toHaveBeenCalled()); }), it("should update issue title successfully", async () => { - (setAgentOutput({ items: [{ type: "update_issue", title: "Updated issue title" }] }), (process.env.GH_AW_UPDATE_TITLE = "true"), (global.context.eventName = "issues")); + (setAgentOutput({ items: [{ type: "update_issue", title: "Updated issue title" }] }), (global.context.eventName = "issues")); const mockIssue = { number: 123, title: "Updated issue title", html_url: "https://github.com/testowner/testrepo/issues/123" }; (mockGithub.rest.issues.update.mockResolvedValue({ data: mockIssue }), - await eval(`(async () => { ${updateIssueScript}; await main(); })()`), + await eval(`(async () => { ${updateIssueScript}; await main({ allow_title: true }); })()`), expect(mockGithub.rest.issues.update).toHaveBeenCalledWith({ owner: "testowner", repo: "testrepo", issue_number: 123, title: "Updated issue title" }), expect(mockCore.setOutput).toHaveBeenCalledWith("issue_number", 123), expect(mockCore.setOutput).toHaveBeenCalledWith("issue_url", mockIssue.html_url), @@ -82,28 +82,25 @@ const mockCore = { expect(mockCore.summary.write).toHaveBeenCalled()); }), it("should update issue status successfully", async () => { - (setAgentOutput({ items: [{ type: "update_issue", status: "closed" }] }), (process.env.GH_AW_UPDATE_STATUS = "true"), (global.context.eventName = "issues")); + (setAgentOutput({ items: [{ type: "update_issue", status: "closed" }] }), (global.context.eventName = "issues")); const mockIssue = { number: 123, html_url: "https://github.com/testowner/testrepo/issues/123" }; (mockGithub.rest.issues.update.mockResolvedValue({ data: mockIssue }), - await eval(`(async () => { ${updateIssueScript}; await main(); })()`), + await eval(`(async () => { ${updateIssueScript}; await main({ allow_status: true }); })()`), expect(mockGithub.rest.issues.update).toHaveBeenCalledWith({ owner: "testowner", repo: "testrepo", issue_number: 123, state: "closed" })); }), it("should update multiple fields successfully", async () => { (setAgentOutput({ items: [{ type: "update_issue", title: "New title", body: "New body content", status: "open" }] }), - (process.env.GH_AW_UPDATE_TITLE = "true"), - (process.env.GH_AW_UPDATE_BODY = "true"), - (process.env.GH_AW_UPDATE_STATUS = "true"), (global.context.eventName = "issues")); const mockIssue = { number: 123, html_url: "https://github.com/testowner/testrepo/issues/123" }; (mockGithub.rest.issues.update.mockResolvedValue({ data: mockIssue }), - await eval(`(async () => { ${updateIssueScript}; await main(); })()`), + await eval(`(async () => { ${updateIssueScript}; await main({ allow_title: true, allow_body: true, allow_status: true }); })()`), expect(mockGithub.rest.issues.update).toHaveBeenCalledWith({ owner: "testowner", repo: "testrepo", issue_number: 123, title: "New title", body: "New body content", state: "open" })); }), it('should handle explicit issue number with target "*"', async () => { - (setAgentOutput({ items: [{ type: "update_issue", issue_number: 456, title: "Updated title" }] }), (process.env.GH_AW_UPDATE_TITLE = "true"), (process.env.GH_AW_UPDATE_TARGET = "*"), (global.context.eventName = "push")); + (setAgentOutput({ items: [{ type: "update_issue", issue_number: 456, title: "Updated title" }] }), (global.context.eventName = "push")); const mockIssue = { number: 456, html_url: "https://github.com/testowner/testrepo/issues/456" }; (mockGithub.rest.issues.update.mockResolvedValue({ data: mockIssue }), - await eval(`(async () => { ${updateIssueScript}; await main(); })()`), + await eval(`(async () => { ${updateIssueScript}; await main({ allow_title: true, target: "*" }); })()`), expect(mockGithub.rest.issues.update).toHaveBeenCalledWith({ owner: "testowner", repo: "testrepo", issue_number: 456, title: "Updated title" })); }), it("should skip when no valid updates are provided", async () => { @@ -118,9 +115,8 @@ const mockCore = { }), it("should validate status values", async () => { (setAgentOutput({ items: [{ type: "update_issue", status: "invalid" }] }), - (process.env.GH_AW_UPDATE_STATUS = "true"), (global.context.eventName = "issues"), - await eval(`(async () => { ${updateIssueScript}; await main(); })()`), + await eval(`(async () => { ${updateIssueScript}; await main({ allow_status: true }); })()`), expect(mockCore.info).toHaveBeenCalledWith("Invalid status value: invalid. Must be 'open' or 'closed'"), expect(mockGithub.rest.issues.update).not.toHaveBeenCalled()); })); diff --git a/actions/setup/js/update_runner.cjs b/actions/setup/js/update_runner.cjs index bd15f07137..b92fcda59c 100644 --- a/actions/setup/js/update_runner.cjs +++ b/actions/setup/js/update_runner.cjs @@ -204,12 +204,12 @@ async function runUpdateWorkflow(config) { return; } - // Get the configuration from environment variables (if set) or handler config object - const updateTarget = handlerConfig.target || process.env.GH_AW_UPDATE_TARGET || "triggering"; - const canUpdateStatus = handlerConfig.allow_status === true || process.env.GH_AW_UPDATE_STATUS === "true"; - const canUpdateTitle = handlerConfig.allow_title === true || process.env.GH_AW_UPDATE_TITLE === "true"; - const canUpdateBody = handlerConfig.allow_body === true || process.env.GH_AW_UPDATE_BODY === "true"; - const canUpdateLabels = handlerConfig.allow_labels === true || process.env.GH_AW_UPDATE_LABELS === "true"; + // Get the configuration from handler config object + const updateTarget = handlerConfig.target || "triggering"; + const canUpdateStatus = handlerConfig.allow_status === true; + const canUpdateTitle = handlerConfig.allow_title === true; + const canUpdateBody = handlerConfig.allow_body === true; + const canUpdateLabels = handlerConfig.allow_labels === true; core.info(`Update target configuration: ${updateTarget}`); if (supportsStatus) {