/** * Mode Registry for claude-code-action * * This module provides access to all available execution modes. * * To add a new mode: * 1. Add the mode name to VALID_MODES below * 2. Create the mode implementation in a new directory (e.g., src/modes/new-mode/) * 3. Import and add it to the modes object below * 4. Update action.yml description to mention the new mode */ import type { Mode, ModeName } from "./types"; import { tagMode } from "./tag"; import { agentMode } from "./agent"; import { reviewMode } from "./review"; import type { GitHubContext } from "../github/context"; import { isAutomationContext } from "../github/context"; import { remoteAgentMode } from "./remote-agent"; export const DEFAULT_MODE = "tag" as const; export const VALID_MODES = [ "tag", "agent", "remote-agent", "experimental-review", ] as const; /** * All available modes. * Add new modes here as they are created. */ const modes = { tag: tagMode, agent: agentMode, "experimental-review": reviewMode, "remote-agent": remoteAgentMode, } as const satisfies Record; /** * Retrieves a mode by name and validates it can handle the event type. * @param name The mode name to retrieve * @param context The GitHub context to validate against * @returns The requested mode * @throws Error if the mode is not found or cannot handle the event */ export function getMode(name: ModeName, context: GitHubContext): Mode { const mode = modes[name]; if (!mode) { const validModes = VALID_MODES.join("', '"); throw new Error( `Invalid mode '${name}'. Valid modes are: '${validModes}'. Please check your workflow configuration.`, ); } // Validate mode can handle the event type if (name === "tag" && isAutomationContext(context)) { throw new Error( `Tag mode cannot handle ${context.eventName} events. Use 'agent' mode for automation events or 'remote-agent' mode for repository_dispatch events.`, ); } if (name === "remote-agent" && context.eventName !== "repository_dispatch") { throw new Error( `Remote agent mode can only handle repository_dispatch events. Use 'tag' mode for @claude mentions or 'agent' mode for other automation events.`, ); } return mode; } /** * Type guard to check if a string is a valid mode name. * @param name The string to check * @returns True if the name is a valid mode name */ export function isValidMode(name: string): name is ModeName { return VALID_MODES.includes(name as ModeName); }