From 6717349e5b19f219109cc7f2b4f688e8389bf7ba Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 8 Feb 2026 17:52:16 +0900 Subject: [PATCH] feat(claude-tasks): add CLAUDE_CODE_TASK_LIST_ID env var support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Export session-storage from claude-tasks/index.ts - Add CLAUDE_CODE_TASK_LIST_ID fallback support in storage.ts - Add comprehensive tests for CLAUDE_CODE_TASK_LIST_ID handling - Prefer ULTRAWORK_TASK_LIST_ID, fall back to CLAUDE_CODE_TASK_LIST_ID - Both env vars are properly sanitized for path safety 🤖 Generated with assistance of OhMyOpenCode --- src/features/claude-tasks/index.ts | 1 + src/features/claude-tasks/storage.test.ts | 63 +++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/features/claude-tasks/index.ts b/src/features/claude-tasks/index.ts index f0d374eaa..601a9932d 100644 --- a/src/features/claude-tasks/index.ts +++ b/src/features/claude-tasks/index.ts @@ -1,2 +1,3 @@ export * from "./types" export * from "./storage" +export * from "./session-storage" diff --git a/src/features/claude-tasks/storage.test.ts b/src/features/claude-tasks/storage.test.ts index 8ceda380a..e4aed7ffc 100644 --- a/src/features/claude-tasks/storage.test.ts +++ b/src/features/claude-tasks/storage.test.ts @@ -20,6 +20,7 @@ const TEST_DIR_ABS = join(process.cwd(), TEST_DIR) describe("getTaskDir", () => { const originalTaskListId = process.env.ULTRAWORK_TASK_LIST_ID + const originalClaudeTaskListId = process.env.CLAUDE_CODE_TASK_LIST_ID beforeEach(() => { if (originalTaskListId === undefined) { @@ -27,6 +28,12 @@ describe("getTaskDir", () => { } else { process.env.ULTRAWORK_TASK_LIST_ID = originalTaskListId } + + if (originalClaudeTaskListId === undefined) { + delete process.env.CLAUDE_CODE_TASK_LIST_ID + } else { + process.env.CLAUDE_CODE_TASK_LIST_ID = originalClaudeTaskListId + } }) afterEach(() => { @@ -35,6 +42,12 @@ describe("getTaskDir", () => { } else { process.env.ULTRAWORK_TASK_LIST_ID = originalTaskListId } + + if (originalClaudeTaskListId === undefined) { + delete process.env.CLAUDE_CODE_TASK_LIST_ID + } else { + process.env.CLAUDE_CODE_TASK_LIST_ID = originalClaudeTaskListId + } }) test("returns global config path for default config", () => { @@ -62,6 +75,19 @@ describe("getTaskDir", () => { expect(result).toBe(join(configDir, "tasks", "custom-list-id")) }) + test("respects CLAUDE_CODE_TASK_LIST_ID env var when ULTRAWORK_TASK_LIST_ID not set", () => { + //#given + delete process.env.ULTRAWORK_TASK_LIST_ID + process.env.CLAUDE_CODE_TASK_LIST_ID = "claude list/id" + const configDir = getOpenCodeConfigDir({ binary: "opencode" }) + + //#when + const result = getTaskDir() + + //#then + expect(result).toBe(join(configDir, "tasks", "claude-list-id")) + }) + test("falls back to sanitized cwd basename when env var not set", () => { //#given delete process.env.ULTRAWORK_TASK_LIST_ID @@ -114,6 +140,7 @@ describe("getTaskDir", () => { describe("resolveTaskListId", () => { const originalTaskListId = process.env.ULTRAWORK_TASK_LIST_ID + const originalClaudeTaskListId = process.env.CLAUDE_CODE_TASK_LIST_ID beforeEach(() => { if (originalTaskListId === undefined) { @@ -121,6 +148,12 @@ describe("resolveTaskListId", () => { } else { process.env.ULTRAWORK_TASK_LIST_ID = originalTaskListId } + + if (originalClaudeTaskListId === undefined) { + delete process.env.CLAUDE_CODE_TASK_LIST_ID + } else { + process.env.CLAUDE_CODE_TASK_LIST_ID = originalClaudeTaskListId + } }) afterEach(() => { @@ -129,6 +162,12 @@ describe("resolveTaskListId", () => { } else { process.env.ULTRAWORK_TASK_LIST_ID = originalTaskListId } + + if (originalClaudeTaskListId === undefined) { + delete process.env.CLAUDE_CODE_TASK_LIST_ID + } else { + process.env.CLAUDE_CODE_TASK_LIST_ID = originalClaudeTaskListId + } }) test("returns env var when set", () => { @@ -142,6 +181,30 @@ describe("resolveTaskListId", () => { expect(result).toBe("custom-list") }) + test("returns CLAUDE_CODE_TASK_LIST_ID when ULTRAWORK_TASK_LIST_ID not set", () => { + //#given + delete process.env.ULTRAWORK_TASK_LIST_ID + process.env.CLAUDE_CODE_TASK_LIST_ID = "claude-list" + + //#when + const result = resolveTaskListId() + + //#then + expect(result).toBe("claude-list") + }) + + test("sanitizes CLAUDE_CODE_TASK_LIST_ID special characters", () => { + //#given + delete process.env.ULTRAWORK_TASK_LIST_ID + process.env.CLAUDE_CODE_TASK_LIST_ID = "claude list/id" + + //#when + const result = resolveTaskListId() + + //#then + expect(result).toBe("claude-list-id") + }) + test("sanitizes special characters", () => { //#given process.env.ULTRAWORK_TASK_LIST_ID = "custom list/id"