Update Claude agent to use proper headless mode
- Replace --dangerously-skip-permissions with official headless mode flags - Use -p (--print) for non-interactive mode - Add --output-format json for structured responses - Use --permission-mode acceptEdits for automation - Parse JSON response and extract metadata (cost, duration, session_id) - Handle both successful and error responses properly - Reference: https://docs.anthropic.com/en/docs/claude-code/sdk/sdk-headless
This commit is contained in:
+20
-7
@@ -39,8 +39,8 @@ export class ClaudeAgent implements Agent {
|
|||||||
// Create a temporary file for the prompt
|
// Create a temporary file for the prompt
|
||||||
const promptFile = createTempFile(prompt, "prompt.txt");
|
const promptFile = createTempFile(prompt, "prompt.txt");
|
||||||
|
|
||||||
// Execute Claude Code with the prompt
|
// Execute Claude Code with the prompt using proper headless mode
|
||||||
const command = `$HOME/.local/bin/claude --dangerously-skip-permissions "${promptFile}"`;
|
const command = `$HOME/.local/bin/claude -p "${promptFile}" --output-format json --permission-mode acceptEdits`;
|
||||||
core.info(`Executing: ${command}`);
|
core.info(`Executing: ${command}`);
|
||||||
|
|
||||||
const { stdout, stderr } = await executeCommand(command, {
|
const { stdout, stderr } = await executeCommand(command, {
|
||||||
@@ -51,20 +51,33 @@ export class ClaudeAgent implements Agent {
|
|||||||
core.warning(`Claude Code stderr: ${stderr}`);
|
core.warning(`Claude Code stderr: ${stderr}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stdout) {
|
// Parse JSON response from Claude Code
|
||||||
|
let claudeResponse: any;
|
||||||
|
try {
|
||||||
|
claudeResponse = JSON.parse(stdout);
|
||||||
|
} catch {
|
||||||
|
core.warning("Failed to parse Claude Code JSON response, using raw output");
|
||||||
|
claudeResponse = { result: stdout };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (claudeResponse.result) {
|
||||||
core.info("Claude Code output:");
|
core.info("Claude Code output:");
|
||||||
console.log(stdout);
|
console.log(claudeResponse.result);
|
||||||
}
|
}
|
||||||
|
|
||||||
core.info("Claude Code executed successfully");
|
core.info("Claude Code executed successfully");
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: !claudeResponse.is_error,
|
||||||
output: stdout,
|
output: claudeResponse.result || stdout,
|
||||||
error: stderr || undefined,
|
error: claudeResponse.is_error ? claudeResponse.result : (stderr || undefined),
|
||||||
metadata: {
|
metadata: {
|
||||||
promptFile,
|
promptFile,
|
||||||
command,
|
command,
|
||||||
|
session_id: claudeResponse.session_id,
|
||||||
|
cost_usd: claudeResponse.total_cost_usd,
|
||||||
|
duration_ms: claudeResponse.duration_ms,
|
||||||
|
num_turns: claudeResponse.num_turns,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -19861,7 +19861,7 @@ var ClaudeAgent = class {
|
|||||||
core.info("Executing Claude Code...");
|
core.info("Executing Claude Code...");
|
||||||
try {
|
try {
|
||||||
const promptFile = createTempFile(prompt, "prompt.txt");
|
const promptFile = createTempFile(prompt, "prompt.txt");
|
||||||
const command = `$HOME/.local/bin/claude --dangerously-skip-permissions "${promptFile}"`;
|
const command = `$HOME/.local/bin/claude -p "${promptFile}" --output-format json --permission-mode acceptEdits`;
|
||||||
core.info(`Executing: ${command}`);
|
core.info(`Executing: ${command}`);
|
||||||
const { stdout, stderr } = await executeCommand(command, {
|
const { stdout, stderr } = await executeCommand(command, {
|
||||||
ANTHROPIC_API_KEY: this.apiKey
|
ANTHROPIC_API_KEY: this.apiKey
|
||||||
@@ -19869,18 +19869,29 @@ var ClaudeAgent = class {
|
|||||||
if (stderr) {
|
if (stderr) {
|
||||||
core.warning(`Claude Code stderr: ${stderr}`);
|
core.warning(`Claude Code stderr: ${stderr}`);
|
||||||
}
|
}
|
||||||
if (stdout) {
|
let claudeResponse;
|
||||||
|
try {
|
||||||
|
claudeResponse = JSON.parse(stdout);
|
||||||
|
} catch {
|
||||||
|
core.warning("Failed to parse Claude Code JSON response, using raw output");
|
||||||
|
claudeResponse = { result: stdout };
|
||||||
|
}
|
||||||
|
if (claudeResponse.result) {
|
||||||
core.info("Claude Code output:");
|
core.info("Claude Code output:");
|
||||||
console.log(stdout);
|
console.log(claudeResponse.result);
|
||||||
}
|
}
|
||||||
core.info("Claude Code executed successfully");
|
core.info("Claude Code executed successfully");
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: !claudeResponse.is_error,
|
||||||
output: stdout,
|
output: claudeResponse.result || stdout,
|
||||||
error: stderr || void 0,
|
error: claudeResponse.is_error ? claudeResponse.result : stderr || void 0,
|
||||||
metadata: {
|
metadata: {
|
||||||
promptFile,
|
promptFile,
|
||||||
command
|
command,
|
||||||
|
session_id: claudeResponse.session_id,
|
||||||
|
cost_usd: claudeResponse.total_cost_usd,
|
||||||
|
duration_ms: claudeResponse.duration_ms,
|
||||||
|
num_turns: claudeResponse.num_turns
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user