From dd4fa20c86215482f27f832a3336e8bbae0dbec0 Mon Sep 17 00:00:00 2001 From: Jakob Michael Werner Date: Wed, 15 Apr 2026 01:33:53 -0500 Subject: [PATCH] fix: multiple --add-dir flags overwrite instead of combining Add "add-dir" to ACCUMULATING_FLAGS so multiple --add-dir flags accumulate instead of each overwriting the previous. Extract the accumulated values into sdkOptions.additionalDirectories (a first-class SDK property) so the SDK emits separate --add-dir flags for each path. Fixes anthropics/claude-code-action#1215 Co-Authored-By: Claude Opus 4.6 --- base-action/src/parse-sdk-options.ts | 12 +++++ base-action/test/parse-sdk-options.test.ts | 52 ++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/base-action/src/parse-sdk-options.ts b/base-action/src/parse-sdk-options.ts index ec65b8fbb..aeb3f45d5 100644 --- a/base-action/src/parse-sdk-options.ts +++ b/base-action/src/parse-sdk-options.ts @@ -19,6 +19,7 @@ const ACCUMULATING_FLAGS = new Set([ "disallowedTools", "disallowed-tools", "mcp-config", + "add-dir", ]); // Delimiter used to join accumulated flag values @@ -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 @@ -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: diff --git a/base-action/test/parse-sdk-options.test.ts b/base-action/test/parse-sdk-options.test.ts index c74d98e9c..0d29c965e 100644 --- a/base-action/test/parse-sdk-options.test.ts +++ b/base-action/test/parse-sdk-options.test.ts @@ -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 = {