mirror of
https://github.com/anthropics/claude-code-action.git
synced 2026-01-22 22:44:13 +08:00
* feat: send user request as separate content block for slash command support When in tag mode with the SDK path, extracts the user's request from the trigger comment (text after @claude) and sends it as a separate content block. This enables the CLI to process slash commands like "/review-pr". - Add extract-user-request utility to parse trigger comments - Write user request to separate file during prompt generation - Send multi-block SDKUserMessage when user request file exists - Add tests for the extraction utility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: address PR feedback - Fix potential ReDoS vulnerability by using string operations instead of regex - Remove unused extractUserRequestFromEvent function and tests - Extract USER_REQUEST_FILENAME to shared constants - Conditionally log user request based on showFullOutput setting - Add JSDoc documentation to extractUserRequestFromContext --------- Co-authored-by: Claude <noreply@anthropic.com>
78 lines
2.3 KiB
TypeScript
78 lines
2.3 KiB
TypeScript
import { describe, test, expect } from "bun:test";
|
|
import { extractUserRequest } from "../src/utils/extract-user-request";
|
|
|
|
describe("extractUserRequest", () => {
|
|
test("extracts text after @claude trigger", () => {
|
|
expect(extractUserRequest("@claude /review-pr", "@claude")).toBe(
|
|
"/review-pr",
|
|
);
|
|
});
|
|
|
|
test("extracts slash command with arguments", () => {
|
|
expect(
|
|
extractUserRequest(
|
|
"@claude /review-pr please check the auth module",
|
|
"@claude",
|
|
),
|
|
).toBe("/review-pr please check the auth module");
|
|
});
|
|
|
|
test("handles trigger phrase with extra whitespace", () => {
|
|
expect(extractUserRequest("@claude /review-pr", "@claude")).toBe(
|
|
"/review-pr",
|
|
);
|
|
});
|
|
|
|
test("handles trigger phrase at start of multiline comment", () => {
|
|
const comment = `@claude /review-pr
|
|
Please review this PR carefully.
|
|
Focus on security issues.`;
|
|
expect(extractUserRequest(comment, "@claude")).toBe(
|
|
`/review-pr
|
|
Please review this PR carefully.
|
|
Focus on security issues.`,
|
|
);
|
|
});
|
|
|
|
test("handles trigger phrase in middle of text", () => {
|
|
expect(
|
|
extractUserRequest("Hey team, @claude can you review this?", "@claude"),
|
|
).toBe("can you review this?");
|
|
});
|
|
|
|
test("returns null for empty comment body", () => {
|
|
expect(extractUserRequest("", "@claude")).toBeNull();
|
|
});
|
|
|
|
test("returns null for undefined comment body", () => {
|
|
expect(extractUserRequest(undefined, "@claude")).toBeNull();
|
|
});
|
|
|
|
test("returns null when trigger phrase not found", () => {
|
|
expect(extractUserRequest("Please review this PR", "@claude")).toBeNull();
|
|
});
|
|
|
|
test("returns null when only trigger phrase with no request", () => {
|
|
expect(extractUserRequest("@claude", "@claude")).toBeNull();
|
|
});
|
|
|
|
test("handles custom trigger phrase", () => {
|
|
expect(extractUserRequest("/claude help me", "/claude")).toBe("help me");
|
|
});
|
|
|
|
test("handles trigger phrase with special regex characters", () => {
|
|
expect(
|
|
extractUserRequest("@claude[bot] do something", "@claude[bot]"),
|
|
).toBe("do something");
|
|
});
|
|
|
|
test("is case insensitive", () => {
|
|
expect(extractUserRequest("@CLAUDE /review-pr", "@claude")).toBe(
|
|
"/review-pr",
|
|
);
|
|
expect(extractUserRequest("@Claude /review-pr", "@claude")).toBe(
|
|
"/review-pr",
|
|
);
|
|
});
|
|
});
|