fix: make trigger_phrase match case-insensitive (#1279)

GitHub @-mention autocomplete inserts @Claude (capitalized) when users
pick the bot from the dropdown, but the trigger regex had no 'i' flag,
so the action would log 'No trigger was met for @claude' and exit. The
workflow's outer 'if: contains(...)' gate is case-insensitive, so the
job runs and looks like it silently ignored the user.

The regex was case-sensitive since the initial commit with no test
asserting either behavior; the existing tests focus on word-boundary
precision (email@claude.com etc.), not case.
This commit is contained in:
Justin Bisignano 2026-05-02 11:10:30 -06:00 committed by GitHub
parent fefa07e9c6
commit 38f25dd747
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 6 additions and 0 deletions

View File

@ -51,6 +51,7 @@ export function checkContainsTrigger(context: ParsedGitHubContext): boolean {
// Check for exact match with word boundaries or punctuation // Check for exact match with word boundaries or punctuation
const regex = new RegExp( const regex = new RegExp(
`(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`, `(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`,
"i",
); );
// Check in body // Check in body
@ -77,6 +78,7 @@ export function checkContainsTrigger(context: ParsedGitHubContext): boolean {
// Check for exact match with word boundaries or punctuation // Check for exact match with word boundaries or punctuation
const regex = new RegExp( const regex = new RegExp(
`(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`, `(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`,
"i",
); );
// Check in body // Check in body
@ -105,6 +107,7 @@ export function checkContainsTrigger(context: ParsedGitHubContext): boolean {
// Check for exact match with word boundaries or punctuation // Check for exact match with word boundaries or punctuation
const regex = new RegExp( const regex = new RegExp(
`(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`, `(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`,
"i",
); );
if (regex.test(reviewBody)) { if (regex.test(reviewBody)) {
console.log( console.log(
@ -125,6 +128,7 @@ export function checkContainsTrigger(context: ParsedGitHubContext): boolean {
// Check for exact match with word boundaries or punctuation // Check for exact match with word boundaries or punctuation
const regex = new RegExp( const regex = new RegExp(
`(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`, `(^|\\s)${escapeRegExp(triggerPhrase)}([\\s.,!?;:]|$)`,
"i",
); );
if (regex.test(commentBody)) { if (regex.test(commentBody)) {
console.log(`Comment contains exact trigger phrase '${triggerPhrase}'`); console.log(`Comment contains exact trigger phrase '${triggerPhrase}'`);

View File

@ -186,6 +186,8 @@ describe("checkContainsTrigger", () => {
{ issueBody: "@claude: here's the issue", expected: true }, { issueBody: "@claude: here's the issue", expected: true },
{ issueBody: "@claude; and another thing", expected: true }, { issueBody: "@claude; and another thing", expected: true },
{ issueBody: "Hey @claude, can you help?", expected: true }, { issueBody: "Hey @claude, can you help?", expected: true },
{ issueBody: "@Claude can you help?", expected: true },
{ issueBody: "@CLAUDE fix this", expected: true },
{ issueBody: "claudette contains claude", expected: false }, { issueBody: "claudette contains claude", expected: false },
{ issueBody: "email@claude.com", expected: false }, { issueBody: "email@claude.com", expected: false },
]; ];