From dbc296e97ad91b953357b4007137b3d7cdc12588 Mon Sep 17 00:00:00 2001 From: nrslib <38722970+nrslib@users.noreply.github.com> Date: Tue, 10 Feb 2026 23:52:52 +0900 Subject: [PATCH] =?UTF-8?q?Issue=20=E3=80=80=E4=BD=9C=E6=88=90=E6=99=82?= =?UTF-8?q?=E3=81=AB=E3=82=BF=E3=82=B9=E3=82=AF=E3=82=92=E7=A9=8D=E3=82=80?= =?UTF-8?q?=E3=81=8B=E3=82=92=E7=A2=BA=E8=AA=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cli-routing-issue-resolve.test.ts | 23 ++++++++++++++++++- src/app/cli/routing.ts | 5 +++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/__tests__/cli-routing-issue-resolve.test.ts b/src/__tests__/cli-routing-issue-resolve.test.ts index 5e7fb93..74c3de9 100644 --- a/src/__tests__/cli-routing-issue-resolve.test.ts +++ b/src/__tests__/cli-routing-issue-resolve.test.ts @@ -14,6 +14,10 @@ vi.mock('../shared/ui/index.js', () => ({ withProgress: vi.fn(async (_start, _done, operation) => operation()), })); +vi.mock('../shared/prompt/index.js', () => ({ + confirm: vi.fn(() => true), +})); + vi.mock('../shared/utils/index.js', async (importOriginal) => ({ ...(await importOriginal>()), createLogger: () => ({ @@ -88,6 +92,7 @@ import { checkGhCli, fetchIssue, formatIssueAsTask, parseIssueNumbers } from '.. import { selectAndExecuteTask, determinePiece, createIssueAndSaveTask } from '../features/tasks/index.js'; import { interactiveMode, selectRecentSession } from '../features/interactive/index.js'; import { loadGlobalConfig } from '../infra/config/index.js'; +import { confirm } from '../shared/prompt/index.js'; import { isDirectTask } from '../app/cli/helpers.js'; import { executeDefaultAction } from '../app/cli/routing.js'; import type { GitHubIssue } from '../infra/github/types.js'; @@ -102,6 +107,7 @@ const mockCreateIssueAndSaveTask = vi.mocked(createIssueAndSaveTask); const mockInteractiveMode = vi.mocked(interactiveMode); const mockSelectRecentSession = vi.mocked(selectRecentSession); const mockLoadGlobalConfig = vi.mocked(loadGlobalConfig); +const mockConfirm = vi.mocked(confirm); const mockIsDirectTask = vi.mocked(isDirectTask); function createMockIssue(number: number): GitHubIssue { @@ -123,6 +129,7 @@ beforeEach(() => { // Default setup mockDeterminePiece.mockResolvedValue('default'); mockInteractiveMode.mockResolvedValue({ action: 'execute', task: 'summarized task' }); + mockConfirm.mockResolvedValue(true); mockIsDirectTask.mockReturnValue(false); mockParseIssueNumbers.mockReturnValue([]); }); @@ -273,9 +280,10 @@ describe('Issue resolution in routing', () => { }); describe('create_issue action', () => { - it('should delegate to createIssueAndSaveTask with cwd, task, and pieceId', async () => { + it('should delegate to createIssueAndSaveTask with cwd, task, and pieceId when confirmed', async () => { // Given mockInteractiveMode.mockResolvedValue({ action: 'create_issue', task: 'New feature request' }); + mockConfirm.mockResolvedValue(true); // When await executeDefaultAction(); @@ -288,9 +296,22 @@ describe('Issue resolution in routing', () => { ); }); + it('should skip createIssueAndSaveTask when not confirmed', async () => { + // Given + mockInteractiveMode.mockResolvedValue({ action: 'create_issue', task: 'New feature request' }); + mockConfirm.mockResolvedValue(false); + + // When + await executeDefaultAction(); + + // Then: task should not be added when user declines + expect(mockCreateIssueAndSaveTask).not.toHaveBeenCalled(); + }); + it('should not call selectAndExecuteTask when create_issue action is chosen', async () => { // Given mockInteractiveMode.mockResolvedValue({ action: 'create_issue', task: 'New feature request' }); + mockConfirm.mockResolvedValue(true); // When await executeDefaultAction(); diff --git a/src/app/cli/routing.ts b/src/app/cli/routing.ts index b485477..7073aeb 100644 --- a/src/app/cli/routing.ts +++ b/src/app/cli/routing.ts @@ -6,6 +6,7 @@ */ import { info, error, withProgress } from '../../shared/ui/index.js'; +import { confirm } from '../../shared/prompt/index.js'; import { getErrorMessage } from '../../shared/utils/index.js'; import { getLabel } from '../../shared/i18n/index.js'; import { fetchIssue, formatIssueAsTask, checkGhCli, parseIssueNumbers, type GitHubIssue } from '../../infra/github/index.js'; @@ -204,7 +205,9 @@ export async function executeDefaultAction(task?: string): Promise { break; case 'create_issue': - await createIssueAndSaveTask(resolvedCwd, result.task, pieceId); + if (await confirm('Add this issue to tasks?', true)) { + await createIssueAndSaveTask(resolvedCwd, result.task, pieceId); + } break; case 'save_task':