Standardize on top-level triggerer property (#361)
* Standardize on top-level `triggerer` property - Rename `triggeringUser` → `triggerer` as the single top-level payload property - Remove redundant `triggerer` from `FixReviewEvent`, add `approvedOnly` boolean - Auto-apply `approved_by` filtering in `get_review_comments` when `approvedOnly` is set - Auto-assign created PRs to the triggerer - Simplify `AddressReviews` mode prompt - Accept both `triggerer` and `triggeringUser` in schema for backward compat * Address review feedback: simplify approved_only, remove addAssignees, drop approved_by param * Fix formatting in `action/mcp/pr.ts` * re-add triggeringUser backward-compat fallback in payload schema * auto-assign created PRs to the triggerer * Revert "auto-assign created PRs to the triggerer" This reverts commit c088c425fea33793eb299a001ffd253798d2c674. * Revert "re-add triggeringUser backward-compat fallback in payload schema" This reverts commit ae5b3cb3f1377cd4a634b2d48962c785c31013f3. * backend compat * tweak prompt to ensure compat * Address review feedback * chore: remove triggeringUser fallback --------- Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com> Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com> Co-authored-by: Colin McDonnell <colinmcd94@gmail.com>
This commit is contained in:
committed by
pullfrog[bot]
parent
20b08b5321
commit
c456fae716
@@ -143167,8 +143167,8 @@ function CreatePullRequestTool(ctx) {
|
|||||||
base: params.base,
|
base: params.base,
|
||||||
draft: params.draft ?? false
|
draft: params.draft ?? false
|
||||||
});
|
});
|
||||||
const reviewer = ctx.payload.triggeringUser;
|
const reviewer = ctx.payload.triggerer;
|
||||||
if (reviewer && !params.draft) {
|
if (reviewer) {
|
||||||
try {
|
try {
|
||||||
log.debug(`requesting review from ${reviewer} on PR #${result.data.number}`);
|
log.debug(`requesting review from ${reviewer} on PR #${result.data.number}`);
|
||||||
await ctx.octokit.rest.pulls.requestReviewers({
|
await ctx.octokit.rest.pulls.requestReviewers({
|
||||||
@@ -143543,10 +143543,7 @@ function extractFromFilePatches(hunks, startLine, endLine, side) {
|
|||||||
}
|
}
|
||||||
var GetReviewComments = type({
|
var GetReviewComments = type({
|
||||||
pull_number: type.number.describe("The pull request number"),
|
pull_number: type.number.describe("The pull request number"),
|
||||||
review_id: type.number.describe("The review ID to get comments for"),
|
review_id: type.number.describe("The review ID to get comments for")
|
||||||
approved_by: type.string.describe(
|
|
||||||
"Optional GitHub username - only return threads where this user gave a \u{1F44D} to at least one comment"
|
|
||||||
).optional()
|
|
||||||
});
|
});
|
||||||
function hasThumbsUpFrom(comment, username) {
|
function hasThumbsUpFrom(comment, username) {
|
||||||
if (!comment.reactionGroups) return false;
|
if (!comment.reactionGroups) return false;
|
||||||
@@ -143720,16 +143717,17 @@ async function getReviewData(input) {
|
|||||||
function GetReviewCommentsTool(ctx) {
|
function GetReviewCommentsTool(ctx) {
|
||||||
return tool({
|
return tool({
|
||||||
name: "get_review_comments",
|
name: "get_review_comments",
|
||||||
description: "Get review comments for a pull request review with full thread context. When approved_by is provided, only returns threads where that user gave a \u{1F44D} to at least one comment. Returns a TOC and commentsPath pointing to a markdown file with full comment details.",
|
description: "Get review comments for a pull request review with full thread context. Automatically filters to approved comments when applicable. Returns a TOC and commentsPath pointing to a markdown file with full comment details.",
|
||||||
parameters: GetReviewComments,
|
parameters: GetReviewComments,
|
||||||
execute: execute(async (params) => {
|
execute: execute(async (params) => {
|
||||||
|
const approvedBy = ctx.payload.event.trigger === "fix_review" && ctx.payload.event.approved_only ? ctx.payload.triggerer : void 0;
|
||||||
const result = await getReviewData({
|
const result = await getReviewData({
|
||||||
octokit: ctx.octokit,
|
octokit: ctx.octokit,
|
||||||
owner: ctx.repo.owner,
|
owner: ctx.repo.owner,
|
||||||
name: ctx.repo.name,
|
name: ctx.repo.name,
|
||||||
pullNumber: params.pull_number,
|
pullNumber: params.pull_number,
|
||||||
reviewId: params.review_id,
|
reviewId: params.review_id,
|
||||||
approvedBy: params.approved_by
|
approvedBy
|
||||||
});
|
});
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return {
|
return {
|
||||||
@@ -143739,7 +143737,7 @@ function GetReviewCommentsTool(ctx) {
|
|||||||
threadCount: 0,
|
threadCount: 0,
|
||||||
commentsPath: null,
|
commentsPath: null,
|
||||||
toc: null,
|
toc: null,
|
||||||
instructions: params.approved_by ? `no threads with \u{1F44D} from ${params.approved_by}` : "no threads found for this review"
|
instructions: approvedBy ? `no threads with \u{1F44D} from ${approvedBy}` : "no threads found for this review"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const { threadBlocks, reviewer, formatted } = result;
|
const { threadBlocks, reviewer, formatted } = result;
|
||||||
@@ -147323,7 +147321,7 @@ var JsonPayload = type({
|
|||||||
version: "string",
|
version: "string",
|
||||||
"agent?": AgentName.or("undefined"),
|
"agent?": AgentName.or("undefined"),
|
||||||
prompt: "string",
|
prompt: "string",
|
||||||
"triggeringUser?": "string | undefined",
|
"triggerer?": "string | undefined",
|
||||||
"eventInstructions?": "string",
|
"eventInstructions?": "string",
|
||||||
"repoInstructions?": "string",
|
"repoInstructions?": "string",
|
||||||
"event?": "object",
|
"event?": "object",
|
||||||
@@ -147416,7 +147414,7 @@ function resolvePayload(resolvedPromptInput, repoSettings) {
|
|||||||
version: jsonPayload?.version ?? package_default.version,
|
version: jsonPayload?.version ?? package_default.version,
|
||||||
agent: resolvedAgent,
|
agent: resolvedAgent,
|
||||||
prompt,
|
prompt,
|
||||||
triggeringUser: jsonPayload?.triggeringUser ?? // it's not a common use case but GITHUB_ACTOR can be a user when the workflow is manually triggered by a user through GitHub Actions UI
|
triggerer: jsonPayload?.triggerer ?? // it's not a common use case but GITHUB_ACTOR can be a user when the workflow is manually triggered by a user through GitHub Actions UI
|
||||||
(!isPullfrog(process.env.GITHUB_ACTOR) ? process.env.GITHUB_ACTOR : void 0),
|
(!isPullfrog(process.env.GITHUB_ACTOR) ? process.env.GITHUB_ACTOR : void 0),
|
||||||
eventInstructions: jsonPayload?.eventInstructions,
|
eventInstructions: jsonPayload?.eventInstructions,
|
||||||
repoInstructions: jsonPayload?.repoInstructions,
|
repoInstructions: jsonPayload?.repoInstructions,
|
||||||
|
|||||||
+3
-3
@@ -229,8 +229,8 @@ interface FixReviewEvent extends BasePayloadEvent {
|
|||||||
issue_number: number;
|
issue_number: number;
|
||||||
is_pr: true;
|
is_pr: true;
|
||||||
review_id: number;
|
review_id: number;
|
||||||
/** username of the person who triggered this action - use with get_review_comments approved_by */
|
/** when true, only address comments the triggerer approved with 👍 (vs all comments) */
|
||||||
triggerer: string;
|
approved_only?: boolean | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ImplementPlanEvent extends BasePayloadEvent {
|
interface ImplementPlanEvent extends BasePayloadEvent {
|
||||||
@@ -273,7 +273,7 @@ export interface WriteablePayload {
|
|||||||
/** the user's actual request (body if @pullfrog tagged) */
|
/** the user's actual request (body if @pullfrog tagged) */
|
||||||
prompt: string;
|
prompt: string;
|
||||||
/** github username of the human who triggered this workflow run */
|
/** github username of the human who triggered this workflow run */
|
||||||
triggeringUser?: string | undefined;
|
triggerer?: string | undefined;
|
||||||
/** event-level instructions for this trigger type (flag-expanded server-side) */
|
/** event-level instructions for this trigger type (flag-expanded server-side) */
|
||||||
eventInstructions?: string | undefined;
|
eventInstructions?: string | undefined;
|
||||||
/** repo-level instructions (flag-expanded server-side) */
|
/** repo-level instructions (flag-expanded server-side) */
|
||||||
|
|||||||
@@ -78,9 +78,8 @@ export function CreatePullRequestTool(ctx: ToolContext) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// best-effort: request review from the user who triggered the workflow
|
// best-effort: request review from the user who triggered the workflow
|
||||||
// skip for draft PRs since they're not ready for review
|
const reviewer = ctx.payload.triggerer;
|
||||||
const reviewer = ctx.payload.triggeringUser;
|
if (reviewer) {
|
||||||
if (reviewer && !params.draft) {
|
|
||||||
try {
|
try {
|
||||||
log.debug(`requesting review from ${reviewer} on PR #${result.data.number}`);
|
log.debug(`requesting review from ${reviewer} on PR #${result.data.number}`);
|
||||||
await ctx.octokit.rest.pulls.requestReviewers({
|
await ctx.octokit.rest.pulls.requestReviewers({
|
||||||
|
|||||||
+10
-9
@@ -291,11 +291,6 @@ function extractFromFilePatches(
|
|||||||
export const GetReviewComments = type({
|
export const GetReviewComments = type({
|
||||||
pull_number: type.number.describe("The pull request number"),
|
pull_number: type.number.describe("The pull request number"),
|
||||||
review_id: type.number.describe("The review ID to get comments for"),
|
review_id: type.number.describe("The review ID to get comments for"),
|
||||||
approved_by: type.string
|
|
||||||
.describe(
|
|
||||||
"Optional GitHub username - only return threads where this user gave a 👍 to at least one comment"
|
|
||||||
)
|
|
||||||
.optional(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function hasThumbsUpFrom(comment: ReviewThreadComment, username: string): boolean {
|
function hasThumbsUpFrom(comment: ReviewThreadComment, username: string): boolean {
|
||||||
@@ -545,17 +540,23 @@ export function GetReviewCommentsTool(ctx: ToolContext) {
|
|||||||
name: "get_review_comments",
|
name: "get_review_comments",
|
||||||
description:
|
description:
|
||||||
"Get review comments for a pull request review with full thread context. " +
|
"Get review comments for a pull request review with full thread context. " +
|
||||||
"When approved_by is provided, only returns threads where that user gave a 👍 to at least one comment. " +
|
"Automatically filters to approved comments when applicable. " +
|
||||||
"Returns a TOC and commentsPath pointing to a markdown file with full comment details.",
|
"Returns a TOC and commentsPath pointing to a markdown file with full comment details.",
|
||||||
parameters: GetReviewComments,
|
parameters: GetReviewComments,
|
||||||
execute: execute(async (params) => {
|
execute: execute(async (params) => {
|
||||||
|
// auto-filter to approved comments when the event has approved_only set
|
||||||
|
const approvedBy =
|
||||||
|
ctx.payload.event.trigger === "fix_review" && ctx.payload.event.approved_only
|
||||||
|
? ctx.payload.triggerer
|
||||||
|
: undefined;
|
||||||
|
|
||||||
const result = await getReviewData({
|
const result = await getReviewData({
|
||||||
octokit: ctx.octokit,
|
octokit: ctx.octokit,
|
||||||
owner: ctx.repo.owner,
|
owner: ctx.repo.owner,
|
||||||
name: ctx.repo.name,
|
name: ctx.repo.name,
|
||||||
pullNumber: params.pull_number,
|
pullNumber: params.pull_number,
|
||||||
reviewId: params.review_id,
|
reviewId: params.review_id,
|
||||||
approvedBy: params.approved_by,
|
approvedBy,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
@@ -566,8 +567,8 @@ export function GetReviewCommentsTool(ctx: ToolContext) {
|
|||||||
threadCount: 0,
|
threadCount: 0,
|
||||||
commentsPath: null,
|
commentsPath: null,
|
||||||
toc: null,
|
toc: null,
|
||||||
instructions: params.approved_by
|
instructions: approvedBy
|
||||||
? `no threads with 👍 from ${params.approved_by}`
|
? `no threads with 👍 from ${approvedBy}`
|
||||||
: "no threads found for this review",
|
: "no threads found for this review",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41382,7 +41382,7 @@ var JsonPayload = type({
|
|||||||
version: "string",
|
version: "string",
|
||||||
"agent?": AgentName.or("undefined"),
|
"agent?": AgentName.or("undefined"),
|
||||||
prompt: "string",
|
prompt: "string",
|
||||||
"triggeringUser?": "string | undefined",
|
"triggerer?": "string | undefined",
|
||||||
"eventInstructions?": "string",
|
"eventInstructions?": "string",
|
||||||
"repoInstructions?": "string",
|
"repoInstructions?": "string",
|
||||||
"event?": "object",
|
"event?": "object",
|
||||||
|
|||||||
+4
-3
@@ -19,7 +19,8 @@ export const JsonPayload = type({
|
|||||||
version: "string",
|
version: "string",
|
||||||
"agent?": AgentName.or("undefined"),
|
"agent?": AgentName.or("undefined"),
|
||||||
prompt: "string",
|
prompt: "string",
|
||||||
"triggeringUser?": "string | undefined",
|
"triggerer?": "string | undefined",
|
||||||
|
|
||||||
"eventInstructions?": "string",
|
"eventInstructions?": "string",
|
||||||
"repoInstructions?": "string",
|
"repoInstructions?": "string",
|
||||||
"event?": "object",
|
"event?": "object",
|
||||||
@@ -167,8 +168,8 @@ export function resolvePayload(
|
|||||||
version: jsonPayload?.version ?? packageJson.version,
|
version: jsonPayload?.version ?? packageJson.version,
|
||||||
agent: resolvedAgent,
|
agent: resolvedAgent,
|
||||||
prompt,
|
prompt,
|
||||||
triggeringUser:
|
triggerer:
|
||||||
jsonPayload?.triggeringUser ??
|
jsonPayload?.triggerer ??
|
||||||
// it's not a common use case but GITHUB_ACTOR can be a user when the workflow is manually triggered by a user through GitHub Actions UI
|
// it's not a common use case but GITHUB_ACTOR can be a user when the workflow is manually triggered by a user through GitHub Actions UI
|
||||||
(!isPullfrog(process.env.GITHUB_ACTOR) ? process.env.GITHUB_ACTOR : undefined),
|
(!isPullfrog(process.env.GITHUB_ACTOR) ? process.env.GITHUB_ACTOR : undefined),
|
||||||
eventInstructions: jsonPayload?.eventInstructions,
|
eventInstructions: jsonPayload?.eventInstructions,
|
||||||
|
|||||||
Reference in New Issue
Block a user