From 9ebfd2e8ae3e84d76a95919aa45abff8f480a622 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:00:26 -0700 Subject: [PATCH] Reapply "feat(composer): choose a base ref in the New Workspace composer" (#21536) (#21543) This reverts commit a7b9ea59951e048749725924d75db6cea1a37b56. Co-authored-by: Vincent <47273853+Tkotm76@users.noreply.github.com> --- ...wWorkspaceComposerCard.start-from.test.tsx | 229 ++++++++++++++++++ .../automations/AutomationWorkspaceField.tsx | 2 +- .../new-workspace/ComposerBaseRefPicker.tsx | 42 ++++ .../NewWorkspaceComposerNameSection.tsx | 25 +- .../base-ref-picker-visibility.test.ts | 44 ++++ .../base-ref-picker-visibility.ts | 25 ++ .../new-workspace-composer-card-props.ts | 3 + .../CreateFromPicker.test.tsx | 36 ++- .../CreateFromPicker.tsx | 5 +- .../branch-start-point-actions.test.ts | 95 ++++++++ .../branch-start-point-actions.ts | 24 +- .../composer-state/composer-external-sync.ts | 1 + .../composer-name-source-selection.test.ts | 193 +++++++++++++++ .../composer-state/composer-source-state.ts | 6 + .../composer-state/composer-target-state.ts | 1 + .../composer-state/draft-target-sync.test.ts | 20 ++ .../hooks/composer-state/draft-target-sync.ts | 5 +- .../github-provider-selection.ts | 7 +- .../github-submit-resolution.ts | 5 + .../hooks/composer-state/identity-model.ts | 2 + .../composer-state/issue-source-actions.ts | 18 +- .../multiple-create-reset.test.ts | 2 + .../work-item-source-actions.ts | 4 + .../workspace-identity-state.ts | 23 ++ .../store/slices/ui/ui-slice-contract-core.ts | 3 + 25 files changed, 805 insertions(+), 15 deletions(-) create mode 100644 src/renderer/src/components/NewWorkspaceComposerCard.start-from.test.tsx create mode 100644 src/renderer/src/components/new-workspace/ComposerBaseRefPicker.tsx create mode 100644 src/renderer/src/components/new-workspace/base-ref-picker-visibility.test.ts create mode 100644 src/renderer/src/components/new-workspace/base-ref-picker-visibility.ts rename src/renderer/src/components/{automations => repo}/CreateFromPicker.test.tsx (74%) rename src/renderer/src/components/{automations => repo}/CreateFromPicker.tsx (97%) create mode 100644 src/renderer/src/hooks/composer-state/branch-start-point-actions.test.ts create mode 100644 src/renderer/src/hooks/composer-state/composer-name-source-selection.test.ts diff --git a/src/renderer/src/components/NewWorkspaceComposerCard.start-from.test.tsx b/src/renderer/src/components/NewWorkspaceComposerCard.start-from.test.tsx new file mode 100644 index 00000000000..5b186fc9378 --- /dev/null +++ b/src/renderer/src/components/NewWorkspaceComposerCard.start-from.test.tsx @@ -0,0 +1,229 @@ +// @vitest-environment happy-dom + +import React, { act } from 'react' +import { createRoot } from 'react-dom/client' +import { afterEach, describe, expect, it, vi } from 'vitest' +import NewWorkspaceComposerCard from './NewWorkspaceComposerCard' + +vi.mock('@/store', () => ({ + useAppStore: Object.assign( + (selector: (state: unknown) => unknown) => + selector({ + closeModal: vi.fn(), + openModal: vi.fn(), + openSettingsPage: vi.fn(), + openSettingsTarget: vi.fn(), + setRuntimeEnvironmentStatus: vi.fn(), + activeModal: 'new-workspace-composer', + settings: { defaultTuiAgent: null, disabledTuiAgents: [] }, + updateSettings: vi.fn(), + projects: [], + repos: [], + worktreesByRepo: {} + }), + { getState: () => ({}) } + ) +})) + +vi.mock('@/components/contextual-tours/use-contextual-tour', () => ({ + useContextualTour: vi.fn() +})) + +vi.mock('@/components/ui/tooltip', () => ({ + Tooltip: ({ children }: { children: React.ReactNode }) => <>{children}>, + TooltipContent: ({ children }: { children: React.ReactNode }) => <>{children}>, + TooltipTrigger: ({ children }: { children: React.ReactNode }) => <>{children}> +})) + +vi.mock('@/components/agent/AgentCombobox', () => ({ + default: () => +})) + +vi.mock('@/components/sidebar/AddRemoteHostDialog', () => ({ + AddRemoteHostDialog: () => null +})) + +vi.mock('@/components/new-workspace/SmartWorkspaceNameField', () => ({ + default: () => +})) + +vi.mock('@/components/new-workspace/ProjectCombobox', () => ({ + default: () =>
+})) + +// Why: the picker owns its own test; here it only has to report its value and emit picks. +vi.mock('@/components/repo/CreateFromPicker', () => ({ + CreateFromPicker: ({ + value, + onValueChange + }: { + value: string + onValueChange: (next: string) => void + }) => ( +{resetHint}
: null} +