mirror of
https://github.com/anthropics/claude-code-action.git
synced 2026-08-22 03:18:54 +08:00
`exclude_comments_by_actor` and `include_comments_by_actor` never matched
any bot. Both the documented `*[bot]` wildcard and exact entries such as
`dependabot[bot]` silently did nothing.
GitHub's GraphQL API returns the bare login for App actors ("dependabot"),
while REST and the GitHub UI append a suffix ("dependabot[bot]"). Filter
patterns are written in the suffixed form, so matching a GraphQL login
against them could never succeed and `actor.endsWith("[bot]")` was dead
code.
Request `__typename` on the Actor-typed author selections and normalize
App actors to their suffixed name via `resolveActorName()` before matching.
Normalizing at the filter boundary fixes the wildcard and exact-match cases
together, and leaves the author names shown in the prompt unchanged.
The existing test mocked `login: "scanner[bot]"`, a payload GraphQL never
produces, which is why the gap was invisible. It now mocks the real shape
(`__typename: "Bot", login: "scanner"`) and fails without this fix.
The commit author selection is left alone: it is a GitCommit, not an Actor.
Fixes #1514
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
138 lines
2.9 KiB
TypeScript
138 lines
2.9 KiB
TypeScript
// Types for GitHub GraphQL query responses
|
|
|
|
// GitHub's GraphQL `author`/`actor` fields resolve to null when the underlying
|
|
// account has been deleted (the "ghost" user). Any field typed as
|
|
// `GitHubAuthor | null` can therefore be null at runtime and must be guarded.
|
|
// `__typename` distinguishes an App/bot actor from a human. GraphQL's
|
|
// `Actor.login` returns the bare name for bots ("dependabot"), unlike REST which
|
|
// appends a suffix ("dependabot[bot]"), so the typename is the only reliable bot
|
|
// signal on this data. See `resolveActorName` in `utils/actor-filter.ts`.
|
|
export type GitHubAuthor = {
|
|
login: string;
|
|
name?: string;
|
|
__typename?: string;
|
|
};
|
|
|
|
export type GitHubComment = {
|
|
id: string;
|
|
databaseId: string;
|
|
body: string;
|
|
author: GitHubAuthor | null;
|
|
createdAt: string;
|
|
updatedAt?: string;
|
|
lastEditedAt?: string;
|
|
isMinimized?: boolean;
|
|
};
|
|
|
|
export type GitHubReviewComment = GitHubComment & {
|
|
path: string;
|
|
line: number | null;
|
|
diffHunk?: string | null;
|
|
};
|
|
|
|
export type GitHubCommit = {
|
|
oid: string;
|
|
message: string;
|
|
author: {
|
|
name: string;
|
|
email: string;
|
|
};
|
|
};
|
|
|
|
export type GitHubFile = {
|
|
path: string;
|
|
additions: number;
|
|
deletions: number;
|
|
changeType: string;
|
|
};
|
|
|
|
export type GitHubReview = {
|
|
id: string;
|
|
databaseId: string;
|
|
author: GitHubAuthor | null;
|
|
body: string;
|
|
state: string;
|
|
submittedAt: string;
|
|
updatedAt?: string;
|
|
lastEditedAt?: string;
|
|
comments: {
|
|
nodes: GitHubReviewComment[];
|
|
};
|
|
};
|
|
|
|
export type GitHubPullRequest = {
|
|
title: string;
|
|
body: string;
|
|
author: GitHubAuthor | null;
|
|
baseRefName: string;
|
|
headRefName: string;
|
|
headRefOid: string;
|
|
isCrossRepository: boolean;
|
|
headRepository: {
|
|
owner: {
|
|
login: string;
|
|
};
|
|
name: string;
|
|
} | null;
|
|
createdAt: string;
|
|
updatedAt?: string;
|
|
lastEditedAt?: string;
|
|
additions: number;
|
|
deletions: number;
|
|
state: string;
|
|
labels: {
|
|
nodes: Array<{
|
|
name: string;
|
|
}>;
|
|
};
|
|
commits: {
|
|
totalCount: number;
|
|
nodes: Array<{
|
|
commit: GitHubCommit;
|
|
}>;
|
|
};
|
|
// GitHub's GraphQL `files` field resolves to null when the PR's diff is too
|
|
// large for GitHub to compute (very large PRs). `changedFiles` is also
|
|
// misreported as 0 in that case, so the null must be guarded and treated as
|
|
// "file list unavailable" rather than "no files changed".
|
|
files: {
|
|
nodes: GitHubFile[];
|
|
} | null;
|
|
comments: {
|
|
nodes: GitHubComment[];
|
|
};
|
|
reviews: {
|
|
nodes: GitHubReview[];
|
|
};
|
|
};
|
|
|
|
export type GitHubIssue = {
|
|
title: string;
|
|
body: string;
|
|
author: GitHubAuthor | null;
|
|
createdAt: string;
|
|
updatedAt?: string;
|
|
lastEditedAt?: string;
|
|
state: string;
|
|
labels: {
|
|
nodes: Array<{
|
|
name: string;
|
|
}>;
|
|
};
|
|
comments: {
|
|
nodes: GitHubComment[];
|
|
};
|
|
};
|
|
|
|
export type PullRequestQueryResponse = {
|
|
repository: {
|
|
pullRequest: GitHubPullRequest;
|
|
};
|
|
};
|
|
|
|
export type IssueQueryResponse = {
|
|
repository: {
|
|
issue: GitHubIssue;
|
|
};
|
|
};
|