Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions base-action/src/parse-sdk-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const ACCUMULATING_FLAGS = new Set([
"disallowedTools",
"disallowed-tools",
"mcp-config",
"add-dir",
]);

// Delimiter used to join accumulated flag values
Expand Down Expand Up @@ -211,6 +212,15 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions {
delete extraArgs["disallowedTools"];
delete extraArgs["disallowed-tools"];

// Extract --add-dir values into additionalDirectories array
const addDirValues = extraArgs["add-dir"]
? extraArgs["add-dir"]
.split(ACCUMULATE_DELIMITER)
.map((d) => d.trim())
.filter(Boolean)
: [];
delete extraArgs["add-dir"];

// Merge multiple --mcp-config values by combining their mcpServers objects
// The action prepends its config (github_comment, github_ci, etc.) as inline JSON,
// and users may provide their own config as inline JSON or file path
Expand Down Expand Up @@ -256,6 +266,8 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions {
// Build SDK options - use merged tools from both direct options and claudeArgs
const sdkOptions: SdkOptions = {
// Direct options from ClaudeOptions inputs
additionalDirectories:
addDirValues.length > 0 ? addDirValues : undefined,
model: options.model,
maxTurns: options.maxTurns ? parseInt(options.maxTurns, 10) : undefined,
allowedTools:
Expand Down
52 changes: 52 additions & 0 deletions base-action/test/parse-sdk-options.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,58 @@ describe("parseSdkOptions", () => {
});
});

describe("add-dir accumulation", () => {
test("should pass through single --add-dir", () => {
const options: ClaudeOptions = {
claudeArgs: '--add-dir "/path/to/dir-a"',
};

const result = parseSdkOptions(options);

expect(result.sdkOptions.additionalDirectories).toEqual(["/path/to/dir-a"]);
expect(result.sdkOptions.extraArgs?.["add-dir"]).toBeUndefined();
});

test("should accumulate multiple --add-dir flags", () => {
const options: ClaudeOptions = {
claudeArgs: '--add-dir "/path/to/dir-a" --add-dir "/path/to/dir-b"',
};

const result = parseSdkOptions(options);

expect(result.sdkOptions.additionalDirectories).toEqual([
"/path/to/dir-a",
"/path/to/dir-b",
]);
expect(result.sdkOptions.extraArgs?.["add-dir"]).toBeUndefined();
});

test("should accumulate --add-dir mixed with other flags", () => {
const options: ClaudeOptions = {
claudeArgs:
'--add-dir "/path/to/dir-a" --model "claude-3" --add-dir "/path/to/dir-b"',
};

const result = parseSdkOptions(options);

expect(result.sdkOptions.additionalDirectories).toEqual([
"/path/to/dir-a",
"/path/to/dir-b",
]);
expect(result.sdkOptions.extraArgs?.["model"]).toBe("claude-3");
});

test("should return undefined additionalDirectories when no --add-dir is present", () => {
const options: ClaudeOptions = {
claudeArgs: '--model "claude-3-5-sonnet"',
};

const result = parseSdkOptions(options);

expect(result.sdkOptions.additionalDirectories).toBeUndefined();
});
});

describe("other extraArgs passthrough", () => {
test("should pass through json-schema in extraArgs", () => {
const options: ClaudeOptions = {
Expand Down