feat: add push event support for automation workflows

Add support for `push` events as an automation event type, enabling
workflows triggered by pushes to use claude-code-action.

Changes:
- Add PushEvent to automation event types in context.ts
- Add case handler for push events in parseGitHubContext()
- Add isPushEvent() type guard
- Add test for push event mode detection

This enables use cases like auto-rebasing PRs when main is updated,
where a workflow triggers on push to main and uses a prompt to
instruct Claude to merge main into stale PR branches.
This commit is contained in:
Boris Cherny
2026-01-01 13:05:06 -08:00
parent 154d0de144
commit 8151408b90
2 changed files with 27 additions and 2 deletions

View File

@@ -6,6 +6,7 @@ import type {
PullRequestEvent,
PullRequestReviewEvent,
PullRequestReviewCommentEvent,
PushEvent,
WorkflowRunEvent,
} from "@octokit/webhooks-types";
import { CLAUDE_APP_BOT_ID, CLAUDE_BOT_LOGIN } from "./constants";
@@ -65,6 +66,7 @@ const AUTOMATION_EVENT_NAMES = [
"repository_dispatch",
"schedule",
"workflow_run",
"push",
] as const;
// Derive types from constants for better maintainability
@@ -112,14 +114,15 @@ export type ParsedGitHubContext = BaseContext & {
isPR: boolean;
};
// Context for automation events (workflow_dispatch, repository_dispatch, schedule, workflow_run)
// Context for automation events (workflow_dispatch, repository_dispatch, schedule, workflow_run, push)
export type AutomationContext = BaseContext & {
eventName: AutomationEventName;
payload:
| WorkflowDispatchEvent
| RepositoryDispatchEvent
| ScheduleEvent
| WorkflowRunEvent;
| WorkflowRunEvent
| PushEvent;
};
// Union type for all contexts
@@ -235,6 +238,13 @@ export function parseGitHubContext(): GitHubContext {
payload: context.payload as unknown as WorkflowRunEvent,
};
}
case "push": {
return {
...commonFields,
eventName: "push",
payload: context.payload as unknown as PushEvent,
};
}
default:
throw new Error(`Unsupported event type: ${context.eventName}`);
}
@@ -276,6 +286,12 @@ export function isIssuesAssignedEvent(
return isIssuesEvent(context) && context.eventAction === "assigned";
}
export function isPushEvent(
context: GitHubContext,
): context is AutomationContext & { payload: PushEvent } {
return context.eventName === "push";
}
// Type guard to check if context is an entity context (has entityNumber and isPR)
export function isEntityContext(
context: GitHubContext,

View File

@@ -60,6 +60,15 @@ describe("Mode Registry", () => {
expect(mode.name).toBe("agent");
});
test("getMode auto-detects agent for push event", () => {
const pushContext = createMockAutomationContext({
eventName: "push",
});
const mode = getMode(pushContext);
expect(mode).toBe(agentMode);
expect(mode.name).toBe("agent");
});
test("getMode auto-detects agent for repository_dispatch with client_payload", () => {
const contextWithPayload = createMockAutomationContext({
eventName: "repository_dispatch",