diff --git a/src/create-prompt/index.ts b/src/create-prompt/index.ts index d498cf9..27574d6 100644 --- a/src/create-prompt/index.ts +++ b/src/create-prompt/index.ts @@ -242,7 +242,7 @@ export function prepareContext( } if (eventAction === "assigned") { - if (!assigneeTrigger) { + if (!assigneeTrigger && !directPrompt) { throw new Error( "ASSIGNEE_TRIGGER is required for issue assigned event", ); @@ -254,7 +254,7 @@ export function prepareContext( issueNumber, baseBranch, claudeBranch, - assigneeTrigger, + ...(assigneeTrigger && { assigneeTrigger }), }; } else if (eventAction === "opened") { eventData = { @@ -331,7 +331,9 @@ export function getEventTypeAndContext(envVars: PreparedContext): { } return { eventType: "ISSUE_ASSIGNED", - triggerContext: `issue assigned to '${eventData.assigneeTrigger}'`, + triggerContext: eventData.assigneeTrigger + ? `issue assigned to '${eventData.assigneeTrigger}'` + : `issue assigned event`, }; case "pull_request": diff --git a/src/create-prompt/types.ts b/src/create-prompt/types.ts index 00bba5e..4d83d97 100644 --- a/src/create-prompt/types.ts +++ b/src/create-prompt/types.ts @@ -65,7 +65,7 @@ type IssueAssignedEvent = { issueNumber: string; baseBranch: string; claudeBranch: string; - assigneeTrigger: string; + assigneeTrigger?: string; }; type PullRequestEvent = { diff --git a/test/create-prompt.test.ts b/test/create-prompt.test.ts index 472ff65..b707b0f 100644 --- a/test/create-prompt.test.ts +++ b/test/create-prompt.test.ts @@ -614,6 +614,29 @@ describe("getEventTypeAndContext", () => { expect(result.eventType).toBe("ISSUE_ASSIGNED"); expect(result.triggerContext).toBe("issue assigned to 'claude-bot'"); }); + + test("should return correct type and context for issue assigned without assigneeTrigger", () => { + const envVars: PreparedContext = { + repository: "owner/repo", + claudeCommentId: "12345", + triggerPhrase: "@claude", + directPrompt: "Please assess this issue", + eventData: { + eventName: "issues", + eventAction: "assigned", + isPR: false, + issueNumber: "999", + baseBranch: "main", + claudeBranch: "claude/issue-999-20240101_120000", + // No assigneeTrigger when using directPrompt + }, + }; + + const result = getEventTypeAndContext(envVars); + + expect(result.eventType).toBe("ISSUE_ASSIGNED"); + expect(result.triggerContext).toBe("issue assigned event"); + }); }); describe("buildAllowedToolsString", () => { diff --git a/test/prepare-context.test.ts b/test/prepare-context.test.ts index 7811c5b..904dd37 100644 --- a/test/prepare-context.test.ts +++ b/test/prepare-context.test.ts @@ -219,6 +219,55 @@ describe("parseEnvVarsWithContext", () => { ), ).toThrow("BASE_BRANCH is required for issues event"); }); + + test("should allow issue assigned event with direct_prompt and no assigneeTrigger", () => { + const contextWithDirectPrompt = createMockContext({ + ...mockIssueAssignedContext, + inputs: { + ...mockIssueAssignedContext.inputs, + assigneeTrigger: "", // No assignee trigger + directPrompt: "Please assess this issue", // But direct prompt is provided + }, + }); + + const result = prepareContext( + contextWithDirectPrompt, + "12345", + "main", + "claude/issue-123-20240101_120000", + ); + + expect(result.eventData.eventName).toBe("issues"); + expect(result.eventData.isPR).toBe(false); + expect(result.directPrompt).toBe("Please assess this issue"); + if ( + result.eventData.eventName === "issues" && + result.eventData.eventAction === "assigned" + ) { + expect(result.eventData.issueNumber).toBe("123"); + expect(result.eventData.assigneeTrigger).toBeUndefined(); + } + }); + + test("should throw error when neither assigneeTrigger nor directPrompt provided for issue assigned event", () => { + const contextWithoutTriggers = createMockContext({ + ...mockIssueAssignedContext, + inputs: { + ...mockIssueAssignedContext.inputs, + assigneeTrigger: "", // No assignee trigger + directPrompt: "", // No direct prompt + }, + }); + + expect(() => + prepareContext( + contextWithoutTriggers, + "12345", + "main", + "claude/issue-123-20240101_120000", + ), + ).toThrow("ASSIGNEE_TRIGGER is required for issue assigned event"); + }); }); describe("optional fields", () => {