Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion actions/setup/js/add_comment.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const { generateFooterWithMessages } = require("./messages_footer.cjs");
const { getRepositoryUrl } = require("./get_repository_url.cjs");
const { replaceTemporaryIdReferences, loadTemporaryIdMap } = require("./temporary_id.cjs");
const { getTrackerID } = require("./get_tracker_id.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

/**
* Hide/minimize a comment using the GraphQL API
Expand Down Expand Up @@ -314,7 +315,7 @@ async function main() {
core.info(`Allowed reasons for hiding: [${parsed.join(", ")}]`);
return parsed;
} catch (error) {
core.warning(`Failed to parse GH_AW_ALLOWED_REASONS: ${error instanceof Error ? error.message : String(error)}`);
core.warning(`Failed to parse GH_AW_ALLOWED_REASONS: ${getErrorMessage(error)}`);
return null;
}
})()
Expand Down
4 changes: 3 additions & 1 deletion actions/setup/js/add_copilot_reviewer.cjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// @ts-check
/// <reference types="@actions/github-script" />

const { getErrorMessage } = require("./error_helpers.cjs");

/**
* Add Copilot as a reviewer to a pull request.
*
Expand Down Expand Up @@ -52,7 +54,7 @@ Successfully added Copilot as a reviewer to PR #${prNumber}.
)
.write();
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to add Copilot as reviewer: ${errorMessage}`);
core.setFailed(`Failed to add Copilot as reviewer to PR #${prNumber}: ${errorMessage}`);
}
Expand Down
3 changes: 2 additions & 1 deletion actions/setup/js/add_labels.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

const { processSafeOutput } = require("./safe_output_processor.cjs");
const { validateLabels } = require("./safe_output_validator.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
// Use shared processor for common steps
Expand Down Expand Up @@ -117,7 +118,7 @@ ${labelsListMarkdown}
)
.write();
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to add labels: ${errorMessage}`);
core.setFailed(`Failed to add labels: ${errorMessage}`);
}
Expand Down
5 changes: 3 additions & 2 deletions actions/setup/js/add_reaction_and_edit_comment.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/// <reference types="@actions/github-script" />

const { getRunStartedMessage } = require("./messages_run_status.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
// Read inputs from environment variables
Expand Down Expand Up @@ -151,7 +152,7 @@ async function main() {
core.info(`Skipping comment for event type: ${eventName}`);
}
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to process reaction and comment creation: ${errorMessage}`);
core.setFailed(`Failed to process reaction and comment creation: ${errorMessage}`);
}
Expand Down Expand Up @@ -457,7 +458,7 @@ async function addCommentWithWorkflowLink(endpoint, runUrl, eventName) {
core.setOutput("comment-repo", `${context.repo.owner}/${context.repo.repo}`);
} catch (error) {
// Don't fail the entire job if comment creation fails - just log it
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.warning("Failed to create comment with workflow link (This is not critical - the reaction was still added successfully): " + errorMessage);
}
}
Expand Down
3 changes: 2 additions & 1 deletion actions/setup/js/add_reviewer.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/// <reference types="@actions/github-script" />

const { processSafeOutput, processItems } = require("./safe_output_processor.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

// GitHub Copilot reviewer bot username
const COPILOT_REVIEWER_BOT = "copilot-pull-request-reviewer[bot]";
Expand Down Expand Up @@ -125,7 +126,7 @@ ${reviewersListMarkdown}
)
.write();
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to add reviewers: ${errorMessage}`);
core.setFailed(`Failed to add reviewers: ${errorMessage}`);
}
Expand Down
12 changes: 8 additions & 4 deletions actions/setup/js/assign_agent_helpers.cjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// @ts-check
/// <reference types="@actions/github-script" />

const { getErrorMessage } = require("./error_helpers.cjs");

/**
* Shared helper functions for assigning coding agents (like Copilot) to issues
* These functions use GraphQL to properly assign bot actors that cannot be assigned via gh CLI
Expand All @@ -27,6 +29,8 @@ function getAgentName(assignee) {
// Normalize: remove @ prefix if present
const normalized = assignee.startsWith("@") ? assignee.slice(1) : assignee;

const { getErrorMessage } = require("./error_helpers.cjs");

// Check if it's a known agent
if (AGENT_LOGIN_NAMES[normalized]) {
return normalized;
Expand Down Expand Up @@ -118,7 +122,7 @@ async function findAgent(owner, repo, agentName) {
}
return null;
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to find ${agentName} agent: ${errorMessage}`);
return null;
}
Expand Down Expand Up @@ -163,7 +167,7 @@ async function getIssueDetails(owner, repo, issueNumber) {
currentAssignees,
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to get issue details: ${errorMessage}`);
// Re-throw the error to preserve the original error message for permission error detection
throw error;
Expand Down Expand Up @@ -208,7 +212,7 @@ async function assignAgentToIssue(issueId, agentId, currentAssignees, agentName)
core.error("Unexpected response from GitHub API");
return false;
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);

// Debug: surface the raw GraphQL error structure for troubleshooting fine-grained permission issues
try {
Expand Down Expand Up @@ -400,7 +404,7 @@ async function assignAgentToIssueByName(owner, repo, issueNumber, agentName) {
core.info(`Successfully assigned ${agentName} coding agent to issue #${issueNumber}`);
return { success: true };
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
return { success: false, error: errorMessage };
}
}
Expand Down
3 changes: 2 additions & 1 deletion actions/setup/js/assign_copilot_to_created_issues.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/// <reference types="@actions/github-script" />

const { AGENT_LOGIN_NAMES, findAgent, getIssueDetails, assignAgentToIssue, generatePermissionErrorSummary } = require("./assign_agent_helpers.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

/**
* Assign copilot to issues created by create_issue job.
Expand Down Expand Up @@ -110,7 +111,7 @@ async function main() {
success: true,
});
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to assign ${agentName} to issue #${issueNumber} in ${repoSlug}: ${errorMessage}`);
results.push({
repo: repoSlug,
Expand Down
3 changes: 2 additions & 1 deletion actions/setup/js/assign_issue.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/// <reference types="@actions/github-script" />

const { getAgentName, getIssueDetails, findAgent, assignAgentToIssue } = require("./assign_agent_helpers.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

/**
* Assign an issue to a user or bot (including copilot)
Expand Down Expand Up @@ -95,7 +96,7 @@ Successfully assigned issue #${trimmedIssueNumber} to \`${trimmedAssignee}\`.
)
.write();
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to assign issue: ${errorMessage}`);
core.setFailed(`Failed to assign issue #${trimmedIssueNumber} to ${trimmedAssignee}: ${errorMessage}`);
}
Expand Down
5 changes: 3 additions & 2 deletions actions/setup/js/assign_milestone.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/// <reference types="@actions/github-script" />

const { processSafeOutput } = require("./safe_output_processor.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
// Use shared processor for common steps
Expand Down Expand Up @@ -62,7 +63,7 @@ async function main() {
allMilestones = milestonesResponse.data;
core.info(`Fetched ${allMilestones.length} milestones from repository`);
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to fetch milestones: ${errorMessage}`);
core.setFailed(`Failed to fetch milestones for validation: ${errorMessage}`);
return;
Expand Down Expand Up @@ -119,7 +120,7 @@ async function main() {
success: true,
});
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to assign milestone #${milestoneNumber} to issue #${issueNumber}: ${errorMessage}`);
results.push({
issue_number: issueNumber,
Expand Down
3 changes: 2 additions & 1 deletion actions/setup/js/assign_to_agent.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
const { loadAgentOutput } = require("./load_agent_output.cjs");
const { generateStagedPreview } = require("./staged_preview.cjs");
const { AGENT_LOGIN_NAMES, getAvailableAgentLogins, findAgent, getIssueDetails, assignAgentToIssue, generatePermissionErrorSummary } = require("./assign_agent_helpers.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
const result = loadAgentOutput();
Expand Down Expand Up @@ -148,7 +149,7 @@ async function main() {
success: true,
});
} catch (error) {
let errorMessage = error instanceof Error ? error.message : String(error);
let errorMessage = getErrorMessage(error);
if (errorMessage.includes("coding agent is not available for this repository")) {
// Enrich with available agent logins to aid troubleshooting - uses built-in github object
try {
Expand Down
3 changes: 2 additions & 1 deletion actions/setup/js/assign_to_user.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/// <reference types="@actions/github-script" />

const { processSafeOutput, processItems } = require("./safe_output_processor.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
// Use shared processor for common steps
Expand Down Expand Up @@ -122,7 +123,7 @@ ${assigneesListMarkdown}
)
.write();
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.error(`Failed to assign users: ${errorMessage}`);
core.setFailed(`Failed to assign users: ${errorMessage}`);
}
Expand Down
4 changes: 3 additions & 1 deletion actions/setup/js/check_command_position.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
async function main() {
const command = process.env.GH_AW_COMMAND;

const { getErrorMessage } = require("./error_helpers.cjs");

if (!command) {
core.setFailed("Configuration error: GH_AW_COMMAND not specified.");
return;
Expand Down Expand Up @@ -62,7 +64,7 @@ async function main() {
core.setOutput("command_position_ok", "false");
}
} catch (error) {
core.setFailed(error instanceof Error ? error.message : String(error));
core.setFailed(getErrorMessage(error));
}
}

Expand Down
11 changes: 5 additions & 6 deletions actions/setup/js/check_permissions_utils.cjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// @ts-check
/// <reference types="@actions/github-script" />

const { getErrorMessage } = require("./error_helpers.cjs");

/**
* Shared utility for repository permission validation
* Used by both check_permissions.cjs and check_membership.cjs
Expand Down Expand Up @@ -59,14 +61,12 @@ async function checkBotStatus(actor, owner, repo) {
return { isBot: true, isActive: false };
}
// For other errors, we'll treat as inactive to be safe
// @ts-expect-error - Error handling with optional chaining
const errorMessage = botError?.message ?? String(botError);
const errorMessage = getErrorMessage(botError);
core.warning(`Failed to check bot status: ${errorMessage}`);
return { isBot: true, isActive: false, error: errorMessage };
}
} catch (error) {
// @ts-expect-error - Error handling with optional chaining
const errorMessage = error?.message ?? String(error);
const errorMessage = getErrorMessage(error);
core.warning(`Error checking bot status: ${errorMessage}`);
return { isBot: false, isActive: false, error: errorMessage };
}
Expand Down Expand Up @@ -105,8 +105,7 @@ async function checkRepositoryPermission(actor, owner, repo, requiredPermissions
core.warning(`User permission '${permission}' does not meet requirements: ${requiredPermissions.join(", ")}`);
return { authorized: false, permission };
} catch (repoError) {
// @ts-expect-error - Error handling with optional chaining
const errorMessage = repoError?.message ?? String(repoError);
const errorMessage = getErrorMessage(repoError);
core.warning(`Repository permission check failed: ${errorMessage}`);
return { authorized: false, error: errorMessage };
}
Expand Down
4 changes: 3 additions & 1 deletion actions/setup/js/check_skip_if_match.cjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// @ts-check
/// <reference types="@actions/github-script" />

const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
const skipQuery = process.env.GH_AW_SKIP_QUERY;
const workflowName = process.env.GH_AW_WORKFLOW_NAME;
Expand Down Expand Up @@ -53,7 +55,7 @@ async function main() {
core.info(`✓ Found ${totalCount} matches (below threshold of ${maxMatches}), workflow can proceed`);
core.setOutput("skip_check_ok", "true");
} catch (error) {
core.setFailed(`Failed to execute search query: ${error instanceof Error ? error.message : String(error)}`);
core.setFailed(`Failed to execute search query: ${getErrorMessage(error)}`);
return;
}
}
Expand Down
4 changes: 3 additions & 1 deletion actions/setup/js/check_workflow_timestamp_api.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
* with the compiled .lock.yml file and warns if recompilation is needed
*/

const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
const workflowFile = process.env.GH_AW_WORKFLOW_FILE;

Expand Down Expand Up @@ -52,7 +54,7 @@ async function main() {
}
return null;
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const errorMessage = getErrorMessage(error);
core.info(`Could not fetch commit for ${path}: ${errorMessage}`);
return null;
}
Expand Down
4 changes: 3 additions & 1 deletion actions/setup/js/checkout_pr_branch.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* This script handles both pull_request events and comment events on PRs
*/

const { getErrorMessage } = require("./error_helpers.cjs");

async function main() {
const eventName = context.eventName;
const pullRequest = context.payload.pull_request;
Expand Down Expand Up @@ -38,7 +40,7 @@ async function main() {
core.info(`✅ Successfully checked out PR #${prNumber}`);
}
} catch (error) {
core.setFailed(`Failed to checkout PR branch: ${error instanceof Error ? error.message : String(error)}`);
core.setFailed(`Failed to checkout PR branch: ${getErrorMessage(error)}`);
}
}

Expand Down
12 changes: 10 additions & 2 deletions actions/setup/js/checkout_pr_branch.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,20 @@ describe("checkout_pr_branch.cjs", () => {
const scriptPath = path.join(import.meta.dirname, "checkout_pr_branch.cjs");
const scriptContent = fs.readFileSync(scriptPath, "utf8");

// Mock require for the script
const mockRequire = module => {
if (module === "./error_helpers.cjs") {
return { getErrorMessage: error => (error instanceof Error ? error.message : String(error)) };
}
throw new Error(`Module ${module} not mocked in test`);
};

// Execute the script in a new context with our mocks
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
const wrappedScript = new AsyncFunction("core", "exec", "context", scriptContent.replace(/module\.exports = \{ main \};?\s*$/s, "await main();"));
const wrappedScript = new AsyncFunction("core", "exec", "context", "require", scriptContent.replace(/module\.exports = \{ main \};?\s*$/s, "await main();"));

try {
await wrappedScript(mockCore, mockExec, mockContext);
await wrappedScript(mockCore, mockExec, mockContext, mockRequire);
} catch (error) {
// Errors are handled by the script itself via core.setFailed
}
Expand Down
3 changes: 2 additions & 1 deletion actions/setup/js/close_discussion.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const { loadAgentOutput } = require("./load_agent_output.cjs");
const { generateFooter } = require("./generate_footer.cjs");
const { getTrackerID } = require("./get_tracker_id.cjs");
const { getRepositoryUrl } = require("./get_repository_url.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");

/**
* Get discussion details using GraphQL
Expand Down Expand Up @@ -294,7 +295,7 @@ async function main() {
core.setOutput("comment_url", comment.url);
}
} catch (error) {
core.error(`✗ Failed to close discussion #${discussionNumber}: ${error instanceof Error ? error.message : String(error)}`);
core.error(`✗ Failed to close discussion #${discussionNumber}: ${getErrorMessage(error)}`);
throw error;
}
}
Expand Down
Loading