mirror of
https://github.com/anthropics/claude-code-action.git
synced 2026-01-23 06:54:13 +08:00
feat: add claudeArgs input for direct CLI argument passing
- Add claude_args input to both action.yml files - Implement shell-style argument parsing with quote handling - Pass arguments directly to Claude CLI for maximum flexibility - Add comprehensive tests for argument parsing - Log custom arguments for debugging Users can now pass any Claude CLI arguments directly: claude_args: '--max-turns 3 --mcp-config /path/to/config.json' This provides power users full control over Claude's behavior without waiting for specific inputs to be added to the action.
This commit is contained in:
@@ -31,6 +31,7 @@ async function run() {
|
||||
claudeEnv: process.env.INPUT_CLAUDE_ENV,
|
||||
fallbackModel: process.env.INPUT_FALLBACK_MODEL,
|
||||
model: process.env.ANTHROPIC_MODEL,
|
||||
claudeArgs: process.env.INPUT_CLAUDE_ARGS,
|
||||
});
|
||||
} catch (error) {
|
||||
core.setFailed(`Action failed with error: ${error}`);
|
||||
|
||||
@@ -22,6 +22,7 @@ export type ClaudeOptions = {
|
||||
fallbackModel?: string;
|
||||
timeoutMinutes?: string;
|
||||
model?: string;
|
||||
claudeArgs?: string;
|
||||
};
|
||||
|
||||
type PreparedConfig = {
|
||||
@@ -30,6 +31,67 @@ type PreparedConfig = {
|
||||
env: Record<string, string>;
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse shell-style arguments string into array.
|
||||
* Handles quoted strings and escaping.
|
||||
*/
|
||||
function parseShellArgs(argsString?: string): string[] {
|
||||
if (!argsString || argsString.trim() === "") {
|
||||
return [];
|
||||
}
|
||||
|
||||
const args: string[] = [];
|
||||
let current = "";
|
||||
let inSingleQuote = false;
|
||||
let inDoubleQuote = false;
|
||||
let escapeNext = false;
|
||||
|
||||
for (let i = 0; i < argsString.length; i++) {
|
||||
const char = argsString[i];
|
||||
|
||||
if (escapeNext) {
|
||||
current += char;
|
||||
escapeNext = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (char === "\\") {
|
||||
if (inSingleQuote) {
|
||||
current += char;
|
||||
} else {
|
||||
escapeNext = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (char === "'" && !inDoubleQuote) {
|
||||
inSingleQuote = !inSingleQuote;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (char === '"' && !inSingleQuote) {
|
||||
inDoubleQuote = !inDoubleQuote;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (char === " " && !inSingleQuote && !inDoubleQuote) {
|
||||
if (current) {
|
||||
args.push(current);
|
||||
current = "";
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
current += char;
|
||||
}
|
||||
|
||||
if (current) {
|
||||
args.push(current);
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
function parseCustomEnvVars(claudeEnv?: string): Record<string, string> {
|
||||
if (!claudeEnv || claudeEnv.trim() === "") {
|
||||
return {};
|
||||
@@ -66,8 +128,10 @@ export function prepareRunConfig(
|
||||
promptPath: string,
|
||||
options: ClaudeOptions,
|
||||
): PreparedConfig {
|
||||
// Start with base args
|
||||
const claudeArgs = [...BASE_ARGS];
|
||||
|
||||
// Add specific options first (these can be overridden by claudeArgs)
|
||||
if (options.allowedTools) {
|
||||
claudeArgs.push("--allowedTools", options.allowedTools);
|
||||
}
|
||||
@@ -107,6 +171,19 @@ export function prepareRunConfig(
|
||||
}
|
||||
}
|
||||
|
||||
// Parse and append custom arguments (these can override the above)
|
||||
if (options.claudeArgs) {
|
||||
const customArgs = parseShellArgs(options.claudeArgs);
|
||||
// Filter out -p flag since we handle prompt via pipe
|
||||
const filteredArgs = customArgs.filter(
|
||||
(arg, index) =>
|
||||
arg !== "-p" &&
|
||||
arg !== "--prompt" &&
|
||||
(index === 0 || (customArgs[index - 1] !== "-p" && customArgs[index - 1] !== "--prompt")),
|
||||
);
|
||||
claudeArgs.push(...filteredArgs);
|
||||
}
|
||||
|
||||
// Parse custom environment variables
|
||||
const customEnv = parseCustomEnvVars(options.claudeEnv);
|
||||
|
||||
@@ -147,8 +224,14 @@ export async function runClaude(promptPath: string, options: ClaudeOptions) {
|
||||
console.log(`Custom environment variables: ${envKeys}`);
|
||||
}
|
||||
|
||||
// Log custom arguments if any
|
||||
if (options.claudeArgs && options.claudeArgs.trim() !== "") {
|
||||
console.log(`Custom Claude arguments: ${options.claudeArgs}`);
|
||||
}
|
||||
|
||||
// Output to console
|
||||
console.log(`Running Claude with prompt from file: ${config.promptPath}`);
|
||||
console.log(`Full command: claude ${config.claudeArgs.join(" ")}`);
|
||||
|
||||
// Start sending prompt to pipe in background
|
||||
const catProcess = spawn("cat", [config.promptPath], {
|
||||
|
||||
Reference in New Issue
Block a user