- Add new progress MCP server for reporting task status via API
- Support repository_dispatch events with task description and progress endpoint
- Introduce isDispatch flag to unify dispatch event handling
- Make GitHub data optional for dispatch events without issues/PRs
- Update prompt generation with dispatch-specific instructions
Enables triggering Claude via repository_dispatch with:
{
"event_type": "claude_task",
"client_payload": {
"description": "Task description",
"progress_endpoint": "https://api.example.com/progress"
}
}
80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
/**
|
|
* 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<ModeName, Mode>;
|
|
|
|
/**
|
|
* 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);
|
|
}
|