mirror of
https://github.com/anthropics/claude-code-action.git
synced 2026-01-23 06:54:13 +08:00
118 lines
3.3 KiB
TypeScript
118 lines
3.3 KiB
TypeScript
import * as core from "@actions/core";
|
|
import { mkdir, writeFile } from "fs/promises";
|
|
import type { Mode, ModeOptions, ModeResult } from "../types";
|
|
import { isAutomationContext } from "../../github/context";
|
|
|
|
/**
|
|
* Agent mode implementation.
|
|
*
|
|
* This mode is specifically designed for automation events (workflow_dispatch and schedule).
|
|
* It bypasses the standard trigger checking and comment tracking used by tag mode,
|
|
* making it ideal for scheduled tasks and manual workflow runs.
|
|
*/
|
|
export const agentMode: Mode = {
|
|
name: "agent",
|
|
description: "Automation mode for workflow_dispatch and schedule events",
|
|
|
|
shouldTrigger(context) {
|
|
// Only trigger for automation events
|
|
return isAutomationContext(context);
|
|
},
|
|
|
|
prepareContext(context) {
|
|
// Agent mode doesn't use comment tracking or branch management
|
|
return {
|
|
mode: "agent",
|
|
githubContext: context,
|
|
};
|
|
},
|
|
|
|
getAllowedTools() {
|
|
return [];
|
|
},
|
|
|
|
getDisallowedTools() {
|
|
return [];
|
|
},
|
|
|
|
shouldCreateTrackingComment() {
|
|
return false;
|
|
},
|
|
|
|
async prepare({ context }: ModeOptions): Promise<ModeResult> {
|
|
// Agent mode handles automation events (workflow_dispatch, schedule) only
|
|
|
|
// Create prompt directory
|
|
await mkdir(`${process.env.RUNNER_TEMP}/claude-prompts`, {
|
|
recursive: true,
|
|
});
|
|
|
|
// Write the prompt file - the base action requires a prompt_file parameter,
|
|
// so we must create this file even though agent mode typically uses
|
|
// override_prompt or direct_prompt. If neither is provided, we write
|
|
// a minimal prompt with just the repository information.
|
|
const promptContent =
|
|
context.inputs.overridePrompt ||
|
|
context.inputs.directPrompt ||
|
|
`Repository: ${context.repository.owner}/${context.repository.repo}`;
|
|
|
|
await writeFile(
|
|
`${process.env.RUNNER_TEMP}/claude-prompts/claude-prompt.txt`,
|
|
promptContent,
|
|
);
|
|
|
|
// Export tool environment variables for agent mode
|
|
const baseTools = [
|
|
"Edit",
|
|
"MultiEdit",
|
|
"Glob",
|
|
"Grep",
|
|
"LS",
|
|
"Read",
|
|
"Write",
|
|
];
|
|
|
|
// Add user-specified tools
|
|
const allowedTools = [...baseTools, ...context.inputs.allowedTools];
|
|
const disallowedTools = [
|
|
"WebSearch",
|
|
"WebFetch",
|
|
...context.inputs.disallowedTools,
|
|
];
|
|
|
|
core.exportVariable("ALLOWED_TOOLS", allowedTools.join(","));
|
|
core.exportVariable("DISALLOWED_TOOLS", disallowedTools.join(","));
|
|
|
|
// Agent mode uses a minimal MCP configuration
|
|
// We don't need comment servers or PR-specific tools for automation
|
|
const mcpConfig: any = {
|
|
mcpServers: {},
|
|
};
|
|
|
|
// Add user-provided additional MCP config if any
|
|
const additionalMcpConfig = process.env.MCP_CONFIG || "";
|
|
if (additionalMcpConfig.trim()) {
|
|
try {
|
|
const additional = JSON.parse(additionalMcpConfig);
|
|
if (additional && typeof additional === "object") {
|
|
Object.assign(mcpConfig, additional);
|
|
}
|
|
} catch (error) {
|
|
core.warning(`Failed to parse additional MCP config: ${error}`);
|
|
}
|
|
}
|
|
|
|
core.setOutput("mcp_config", JSON.stringify(mcpConfig));
|
|
|
|
return {
|
|
commentId: undefined,
|
|
branchInfo: {
|
|
baseBranch: "",
|
|
currentBranch: "",
|
|
claudeBranch: undefined,
|
|
},
|
|
mcpConfig: JSON.stringify(mcpConfig),
|
|
};
|
|
},
|
|
};
|