From ec8f4dd8bd018ddd1e304e49871f53d75cfa16db Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Mon, 26 Oct 2026 23:05:39 -0700 Subject: [PATCH] refactor: group repository source-control AI settings (#34278) --- config/scripts/ci-shard-timings.json | 4 +- .../components/settings/RepositoryPane.tsx | 2 +- ...ry-source-control-ai-action-agent-draft.ts | 2 +- ...repository-source-control-ai-text-draft.ts | 4 +- .../RepositorySourceControlAiActionRows.tsx | 79 ++++++------------- ...RepositorySourceControlAiCustomCommand.tsx | 8 +- .../RepositorySourceControlAiEnablement.tsx | 6 +- ...orySourceControlAiHostedReviewDefaults.tsx | 6 +- .../RepositorySourceControlAiSection.test.ts | 32 ++++---- .../RepositorySourceControlAiSection.tsx | 20 +++-- ...ory-source-control-ai-action-rows-props.ts | 39 +++++++++ .../repository-source-control-ai-draft.ts | 14 ++-- ...sitory-source-control-ai-global-ux.test.ts | 20 +++-- .../repository-source-control-ai-global-ux.ts | 22 +++--- .../repository-source-control-ai-labels.ts | 10 +-- ...e-control-action-permission-draft.test.tsx | 2 +- 16 files changed, 135 insertions(+), 135 deletions(-) rename src/renderer/src/components/settings/{ => repository/source-control}/RepositorySourceControlAiActionRows.tsx (85%) rename src/renderer/src/components/settings/{ => repository/source-control}/RepositorySourceControlAiCustomCommand.tsx (95%) rename src/renderer/src/components/settings/{ => repository/source-control}/RepositorySourceControlAiEnablement.tsx (94%) rename src/renderer/src/components/settings/{ => repository/source-control}/RepositorySourceControlAiHostedReviewDefaults.tsx (96%) rename src/renderer/src/components/settings/{ => repository/source-control}/RepositorySourceControlAiSection.test.ts (94%) rename src/renderer/src/components/settings/{ => repository/source-control}/RepositorySourceControlAiSection.tsx (83%) create mode 100644 src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-action-rows-props.ts rename src/renderer/src/components/settings/{ => repository/source-control}/repository-source-control-ai-draft.ts (94%) rename src/renderer/src/components/settings/{ => repository/source-control}/repository-source-control-ai-global-ux.test.ts (95%) rename src/renderer/src/components/settings/{ => repository/source-control}/repository-source-control-ai-global-ux.ts (92%) rename src/renderer/src/components/settings/{ => repository/source-control}/repository-source-control-ai-labels.ts (89%) diff --git a/config/scripts/ci-shard-timings.json b/config/scripts/ci-shard-timings.json index 806aec63bec..badc0a493e5 100644 --- a/config/scripts/ci-shard-timings.json +++ b/config/scripts/ci-shard-timings.json @@ -8744,7 +8744,7 @@ "src/renderer/src/components/settings/RepositoryGitHubAccountSection.inventory-lifetime.test.tsx": 587, "src/renderer/src/components/settings/RepositoryGitHubAccountSection.test.tsx": 662, "src/renderer/src/components/settings/RepositoryPane.test.ts": 2778, - "src/renderer/src/components/settings/RepositorySourceControlAiSection.test.ts": 365, + "src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiSection.test.ts": 365, "src/renderer/src/components/settings/RuntimeEnvironmentsPane.test.ts": 201, "src/renderer/src/components/settings/RuntimeHostAccessForm.test.tsx": 307, "src/renderer/src/components/settings/RuntimePairingGeneratorForm.test.tsx": 306, @@ -8824,7 +8824,7 @@ "src/renderer/src/components/settings/notification-host-pending-save.test.tsx": 1663, "src/renderer/src/components/settings/plugin-install-source.test.ts": 110, "src/renderer/src/components/settings/provider-account-visibility.test.ts": 49, - "src/renderer/src/components/settings/repository-source-control-ai-global-ux.test.ts": 585, + "src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-global-ux.test.ts": 585, "src/renderer/src/components/settings/repository/RepositoryJiraProjectSection.test.tsx": 292, "src/renderer/src/components/settings/repository/RepositoryPaneDraftInput.test.tsx": 428, "src/renderer/src/components/settings/repository/execution/RepositoryHooksSection.test.ts": 715, diff --git a/src/renderer/src/components/settings/RepositoryPane.tsx b/src/renderer/src/components/settings/RepositoryPane.tsx index feb381a3853..6e895a303ca 100644 --- a/src/renderer/src/components/settings/RepositoryPane.tsx +++ b/src/renderer/src/components/settings/RepositoryPane.tsx @@ -12,7 +12,7 @@ import { RepositoryHooksSection } from './repository/execution/RepositoryHooksSe import { McpConfigSection } from './McpConfigSection' import { WorktreeSymlinksSection } from './WorktreeSymlinksSection' import { SparsePresetSettingsSection } from './SparsePresetSettingsSection' -import { RepositorySourceControlAiSection } from './RepositorySourceControlAiSection' +import { RepositorySourceControlAiSection } from './repository/source-control/RepositorySourceControlAiSection' import { SearchableSetting } from './SearchableSetting' import { RepositoryRemoveProjectButton } from './RepositoryRemoveProjectButton' import { matchesSettingsSearch } from './settings-search' diff --git a/src/renderer/src/components/settings/repository-source-control-ai-action-agent-draft.ts b/src/renderer/src/components/settings/repository-source-control-ai-action-agent-draft.ts index d276ec6371a..9d67a15f1ce 100644 --- a/src/renderer/src/components/settings/repository-source-control-ai-action-agent-draft.ts +++ b/src/renderer/src/components/settings/repository-source-control-ai-action-agent-draft.ts @@ -9,7 +9,7 @@ import { normalizeRepoAiDraft, readCompleteRecipeForDraft, setActionOverride -} from './repository-source-control-ai-draft' +} from './repository/source-control/repository-source-control-ai-draft' type RepoActionRecipe = NonNullable< NonNullable[SourceControlActionId] diff --git a/src/renderer/src/components/settings/repository-source-control-ai-text-draft.ts b/src/renderer/src/components/settings/repository-source-control-ai-text-draft.ts index a62c2b667cb..f5aad8852f8 100644 --- a/src/renderer/src/components/settings/repository-source-control-ai-text-draft.ts +++ b/src/renderer/src/components/settings/repository-source-control-ai-text-draft.ts @@ -12,9 +12,9 @@ import { liftActionPermissionArgs } from '../../../../shared/source-control-acti import { readActionRecipeTextDraft, type ActionRecipeTextDraft -} from './repository-source-control-ai-draft' +} from './repository/source-control/repository-source-control-ai-draft' import { retireActionLaunchPreferences } from './source-control-ai-action-recipe-draft' -import { readInheritedCommandTemplate } from './repository-source-control-ai-labels' +import { readInheritedCommandTemplate } from './repository/source-control/repository-source-control-ai-labels' export function resetActionDraftLaunchPreferences( current: Partial>, diff --git a/src/renderer/src/components/settings/RepositorySourceControlAiActionRows.tsx b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiActionRows.tsx similarity index 85% rename from src/renderer/src/components/settings/RepositorySourceControlAiActionRows.tsx rename to src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiActionRows.tsx index 65c87ec25e1..86dc860248a 100644 --- a/src/renderer/src/components/settings/RepositorySourceControlAiActionRows.tsx +++ b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiActionRows.tsx @@ -1,33 +1,31 @@ -import { useAppStore } from '@/store' +import type { RepositorySourceControlAiActionRowsProps } from './repository-source-control-ai-action-rows-props' +import { useAppStore } from '@/store/index' import { useAgentMenuObservation } from '@/components/tab-bar/use-new-tab-agent-menu-rows' import { sourceControlRepoAgentRows } from '@/lib/source-control-agent-picker' import { SourceControlActionAgentPickerView, sourceControlActionAgentPreview, canSaveSourceControlActionSurface -} from './SourceControlActionAgentPicker' -import { SourceControlActionArguments } from './SourceControlActionArguments' +} from '../../SourceControlActionAgentPicker' +import { SourceControlActionArguments } from '../../SourceControlActionArguments' import type React from 'react' import { Terminal } from 'lucide-react' -import type { TuiAgent } from '../../../../shared/tui-agent' -import { CUSTOM_AGENT_ID, isCustomAgentId } from '../../../../shared/commit-message-agent-spec' -import type { - RepoSourceControlAiOverrides, - SourceControlAiSettings -} from '../../../../shared/source-control-ai-types' + +import { + CUSTOM_AGENT_ID, + isCustomAgentId +} from '../../../../../../shared/commit-message-agent-spec' + import { SOURCE_CONTROL_ACTION_IDS, - SOURCE_CONTROL_ACTION_LABELS, - type SourceControlActionRecipe, - type SourceControlActionId, - type SourceControlActionLaunchPreferences -} from '../../../../shared/source-control-ai-actions' -import { Input } from '../ui/input' -import { Label } from '../ui/label' -import { Button } from '../ui/button' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select' + SOURCE_CONTROL_ACTION_LABELS +} from '../../../../../../shared/source-control-ai-actions' +import { Input } from '../../../ui/input' +import { Label } from '../../../ui/label' +import { Button } from '../../../ui/button' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select' import { AgentIcon } from '@/lib/agent-catalog' -import { SourceControlActionVariableChips } from '../source-control/SourceControlActionVariableChips' +import { SourceControlActionVariableChips } from '../../../source-control/SourceControlActionVariableChips' import { getActionDescriptions, SOURCE_CONTROL_TEXT_ACTION_ID_SET, @@ -35,7 +33,7 @@ import { getSourceControlActionAgentSupportText, getSourceControlActionAgentWarningText, getSourceControlAgentArgsPlaceholder -} from './source-control-action-recipe-options' +} from '../../source-control-action-recipe-options' import { ACTION_MODE_INHERIT, ACTION_MODE_OVERRIDE, @@ -49,46 +47,17 @@ import { resolveAgentArgsPlaceholderAgent } from './repository-source-control-ai-labels' import { hasOwnActionOverride } from './repository-source-control-ai-draft' -import { getRepositorySourceControlAiActionRecipeSectionId } from './repository-settings-targets' +import { getRepositorySourceControlAiActionRecipeSectionId } from '../../repository-settings-targets' import { translate } from '@/i18n/i18n' -import { SourceControlActionOptionField } from './SourceControlActionOptionField' +import { SourceControlActionOptionField } from '../../SourceControlActionOptionField' import { useSourceControlActionAgentInventory, useSourceControlActionAgent -} from './use-source-control-action-agent' -import { resolveSourceControlActionRecipe } from '../../../../shared/source-control-ai-operation-policy' -import { shouldShowSourceControlActionArguments } from './source-control-action-arguments-visibility' +} from '../../use-source-control-action-agent' +import { resolveSourceControlActionRecipe } from '../../../../../../shared/source-control-ai-operation-policy' +import { shouldShowSourceControlActionArguments } from '../../source-control-action-arguments-visibility' import { chatProviderAgents, useHostStructuredAgentsVersion } from '@/lib/chat-provider-agents' -import { LOCAL_EXECUTION_HOST_ID } from '../../../../shared/execution-host' - -type RepositorySourceControlAiActionRowsProps = { - repoId: string - repoAi: RepoSourceControlAiOverrides - source: SourceControlAiSettings - defaultTuiAgent: TuiAgent | 'blank' | null | undefined - onActionModeChange: (actionId: SourceControlActionId, mode: string) => void - onActionAgentChange: ( - actionId: SourceControlActionId, - value: string, - choice?: Pick - ) => void - onActionLaunchPreferencesChange: ( - actionId: SourceControlActionId, - value: SourceControlActionLaunchPreferences | undefined - ) => void - onActionTemplateChange: (actionId: SourceControlActionId, value: string) => void - onActionAgentArgsChange: ( - actionId: SourceControlActionId, - value: string, - commit?: boolean - ) => void - onAppendVariable: (actionId: SourceControlActionId, variable: string) => void - /** Per-action saving state for CLI args + command template (matches global recipes). */ - savingActionIds: Partial> - actionDirtyById: Record - onActionDiscard: (actionId: SourceControlActionId) => void - onActionSave: (actionId: SourceControlActionId) => void -} +import { LOCAL_EXECUTION_HOST_ID } from '../../../../../../shared/execution-host' export function RepositorySourceControlAiActionRows({ repoId, diff --git a/src/renderer/src/components/settings/RepositorySourceControlAiCustomCommand.tsx b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiCustomCommand.tsx similarity index 95% rename from src/renderer/src/components/settings/RepositorySourceControlAiCustomCommand.tsx rename to src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiCustomCommand.tsx index 65cc67acd71..e7f98094bea 100644 --- a/src/renderer/src/components/settings/RepositorySourceControlAiCustomCommand.tsx +++ b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiCustomCommand.tsx @@ -1,9 +1,9 @@ import type React from 'react' import { useState } from 'react' -import type { SourceControlAiSettings } from '../../../../shared/source-control-ai-types' -import { Input } from '../ui/input' -import { Label } from '../ui/label' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select' +import type { SourceControlAiSettings } from '../../../../../../shared/source-control-ai-types' +import { Input } from '../../../ui/input' +import { Label } from '../../../ui/label' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select' import { CUSTOM_COMMAND_MODE_INHERIT, CUSTOM_COMMAND_MODE_REPO diff --git a/src/renderer/src/components/settings/RepositorySourceControlAiEnablement.tsx b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiEnablement.tsx similarity index 94% rename from src/renderer/src/components/settings/RepositorySourceControlAiEnablement.tsx rename to src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiEnablement.tsx index 4935a89dd7a..7b7f3a8dab7 100644 --- a/src/renderer/src/components/settings/RepositorySourceControlAiEnablement.tsx +++ b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiEnablement.tsx @@ -1,7 +1,7 @@ import type React from 'react' -import type { SourceControlAiSettings } from '../../../../shared/source-control-ai-types' -import { Label } from '../ui/label' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select' +import type { SourceControlAiSettings } from '../../../../../../shared/source-control-ai-types' +import { Label } from '../../../ui/label' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select' import { translate } from '@/i18n/i18n' type RepositorySourceControlAiEnablementProps = { diff --git a/src/renderer/src/components/settings/RepositorySourceControlAiHostedReviewDefaults.tsx b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiHostedReviewDefaults.tsx similarity index 96% rename from src/renderer/src/components/settings/RepositorySourceControlAiHostedReviewDefaults.tsx rename to src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiHostedReviewDefaults.tsx index 07156b38388..f8553b68216 100644 --- a/src/renderer/src/components/settings/RepositorySourceControlAiHostedReviewDefaults.tsx +++ b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiHostedReviewDefaults.tsx @@ -2,9 +2,9 @@ import type React from 'react' import type { RepoSourceControlAiOverrides, SourceControlAiSettings -} from '../../../../shared/source-control-ai-types' -import { Label } from '../ui/label' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select' +} from '../../../../../../shared/source-control-ai-types' +import { Label } from '../../../ui/label' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select' import { triStateValue } from './repository-source-control-ai-draft' import { translate } from '@/i18n/i18n' diff --git a/src/renderer/src/components/settings/RepositorySourceControlAiSection.test.ts b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiSection.test.ts similarity index 94% rename from src/renderer/src/components/settings/RepositorySourceControlAiSection.test.ts rename to src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiSection.test.ts index 3eab220b3bd..874412263e2 100644 --- a/src/renderer/src/components/settings/RepositorySourceControlAiSection.test.ts +++ b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiSection.test.ts @@ -1,43 +1,43 @@ // @vitest-environment happy-dom import { afterEach, describe, expect, it, vi } from 'vitest' import { act, render, cleanup, fireEvent } from '@testing-library/react' -import './__fixtures__/settings-persistence-test-fixture' +import '../../__fixtures__/settings-persistence-test-fixture' import React from 'react' -import type { TuiAgent } from '../../../../shared/tui-agent' +import type { TuiAgent } from '../../../../../../shared/tui-agent' import { renderToStaticMarkup } from 'react-dom/server' -import { normalizeRepoSourceControlAiOverrides } from '../../../../shared/source-control-ai' +import { normalizeRepoSourceControlAiOverrides } from '../../../../../../shared/source-control-ai-repo-settings' import type { RepoSourceControlAiOverrides, SourceControlAiSettings -} from '../../../../shared/source-control-ai-types' +} from '../../../../../../shared/source-control-ai-types' import { SOURCE_CONTROL_ACTION_IDS, setSourceControlActionAgentDefault, type SourceControlActionId -} from '../../../../shared/source-control-ai-actions' +} from '../../../../../../shared/source-control-ai-actions' import { computeActionDirtyById, dropRepoLegacyInstructionForAction, withRepoAiActionMode } from './repository-source-control-ai-draft' -import { withRepoAiActionAgent } from './repository-source-control-ai-action-agent-draft' -import { resolveSourceControlActionRecipe } from '../../../../shared/source-control-ai-operation-policy' +import { withRepoAiActionAgent } from '../../repository-source-control-ai-action-agent-draft' +import { resolveSourceControlActionRecipe } from '../../../../../../shared/source-control-ai-operation-policy' import { saveSourceControlActionRecipe, toSourceControlAiRepoUpdate -} from '../../../../shared/source-control-ai-recipe-save' -import { sourceControlActionRecipeMatchesTarget } from '../right-sidebar/source-control-action-recipe-match' -import { SourceControlActionAgentPicker } from './SourceControlActionAgentPicker' +} from '../../../../../../shared/source-control-ai-recipe-save' +import { sourceControlActionRecipeMatchesTarget } from '../../../right-sidebar/source-control-action-recipe-match' +import { SourceControlActionAgentPicker } from '../../SourceControlActionAgentPicker' import { RepositorySourceControlAiActionRows } from './RepositorySourceControlAiActionRows' import { RepositorySourceControlAiEnablement } from './RepositorySourceControlAiEnablement' -import { SourceControlAiActionRecipeDefaults } from './SourceControlAiActionRecipeDefaults' -import { useAppStore } from '../../store' -import { TooltipProvider } from '../ui/tooltip' +import { SourceControlAiActionRecipeDefaults } from '../../SourceControlAiActionRecipeDefaults' +import { useAppStore } from '../../../../store/index' +import { TooltipProvider } from '../../../ui/tooltip' import { setLocalRuntimeCapabilitiesForTests } from '@/runtime/local-runtime-capabilities' -import { projectAgentLaunchSettings } from '../../../../shared/agent-launch-settings' +import { projectAgentLaunchSettings } from '../../../../../../shared/agent-launch-settings' import { TEST_REPO } from '@/store/slices/worktrees-slice-test-fixtures' -import { clearHostAgentMenuSettingsForTests } from './use-host-agent-launch-preferences' -import { mutateHostAgentLaunchSettings } from './agent-launch-settings-transport' +import { clearHostAgentMenuSettingsForTests } from '../../use-host-agent-launch-preferences' +import { mutateHostAgentLaunchSettings } from '../../agent-launch-settings-transport' import { getRuntimeAgentInventoryKey } from '@/store/slices/runtime-agent-inventory-key' import { resetHostStructuredAgentsForTests } from '@/runtime/host-structured-agents' const rpc = vi.hoisted(() => vi.fn()) diff --git a/src/renderer/src/components/settings/RepositorySourceControlAiSection.tsx b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiSection.tsx similarity index 83% rename from src/renderer/src/components/settings/RepositorySourceControlAiSection.tsx rename to src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiSection.tsx index ad1ad4dd14e..8bb40bcf872 100644 --- a/src/renderer/src/components/settings/RepositorySourceControlAiSection.tsx +++ b/src/renderer/src/components/settings/repository/source-control/RepositorySourceControlAiSection.tsx @@ -1,19 +1,17 @@ import { useMemo } from 'react' import type React from 'react' -import type { Repo } from '../../../../shared/repo-types' -import { normalizeSourceControlAiSettings } from '../../../../shared/source-control-ai' -import type { SourceControlAiRepoUpdate } from '../../../../shared/source-control-ai-recipe-save' -import { useAppStore } from '../../store' -import { getRepositorySourceControlAiSectionId } from './repository-settings-targets' +import type { Repo } from '../../../../../../shared/repo-types' +import { normalizeSourceControlAiSettings } from '../../../../../../shared/source-control-ai-settings' +import type { SourceControlAiRepoUpdate } from '../../../../../../shared/source-control-ai-recipe-save' +import { useAppStore } from '../../../../store/index' +import { getRepositorySourceControlAiSectionId } from '../../repository-settings-targets' import { RepositorySourceControlAiActionRows } from './RepositorySourceControlAiActionRows' import { RepositorySourceControlAiCustomCommand } from './RepositorySourceControlAiCustomCommand' import { RepositorySourceControlAiEnablement } from './RepositorySourceControlAiEnablement' import { RepositorySourceControlAiHostedReviewDefaults } from './RepositorySourceControlAiHostedReviewDefaults' -import { - normalizePersistedRepoAi, - useRepositorySourceControlAiGlobalUx -} from './repository-source-control-ai-global-ux' -import { getSettingOwnershipSummary } from './setting-ownership' +import { normalizeRepoAiDraft } from './repository-source-control-ai-draft' +import { useRepositorySourceControlAiGlobalUx } from './repository-source-control-ai-global-ux' +import { getSettingOwnershipSummary } from '../../setting-ownership' import { translate } from '@/i18n/i18n' type RepositorySourceControlAiSectionProps = { @@ -33,7 +31,7 @@ export function RepositorySourceControlAiSection({ settings?.commitMessageAi ) const persistedRepoAi = useMemo( - () => normalizePersistedRepoAi(repo.sourceControlAi), + () => normalizeRepoAiDraft(repo.sourceControlAi), [repo.sourceControlAi] ) const { diff --git a/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-action-rows-props.ts b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-action-rows-props.ts new file mode 100644 index 00000000000..42d3f88eed6 --- /dev/null +++ b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-action-rows-props.ts @@ -0,0 +1,39 @@ +import type { TuiAgent } from '../../../../../../shared/tui-agent' +import type { + RepoSourceControlAiOverrides, + SourceControlAiSettings +} from '../../../../../../shared/source-control-ai-types' +import type { + SourceControlActionRecipe, + SourceControlActionId, + SourceControlActionLaunchPreferences +} from '../../../../../../shared/source-control-ai-actions' + +export type RepositorySourceControlAiActionRowsProps = { + repoId: string + repoAi: RepoSourceControlAiOverrides + source: SourceControlAiSettings + defaultTuiAgent: TuiAgent | 'blank' | null | undefined + onActionModeChange: (actionId: SourceControlActionId, mode: string) => void + onActionAgentChange: ( + actionId: SourceControlActionId, + value: string, + choice?: Pick + ) => void + onActionLaunchPreferencesChange: ( + actionId: SourceControlActionId, + value: SourceControlActionLaunchPreferences | undefined + ) => void + onActionTemplateChange: (actionId: SourceControlActionId, value: string) => void + onActionAgentArgsChange: ( + actionId: SourceControlActionId, + value: string, + commit?: boolean + ) => void + onAppendVariable: (actionId: SourceControlActionId, variable: string) => void + /** Per-action saving state for CLI args + command template (matches global recipes). */ + savingActionIds: Partial> + actionDirtyById: Record + onActionDiscard: (actionId: SourceControlActionId) => void + onActionSave: (actionId: SourceControlActionId) => void +} diff --git a/src/renderer/src/components/settings/repository-source-control-ai-draft.ts b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-draft.ts similarity index 94% rename from src/renderer/src/components/settings/repository-source-control-ai-draft.ts rename to src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-draft.ts index f98ae531d50..b7cfce6d87b 100644 --- a/src/renderer/src/components/settings/repository-source-control-ai-draft.ts +++ b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-draft.ts @@ -1,15 +1,13 @@ -import { - normalizeRepoSourceControlAiOverrides, - resolveSourceControlActionRecipe -} from '../../../../shared/source-control-ai' +import { normalizeRepoSourceControlAiOverrides } from '../../../../../../shared/source-control-ai-repo-settings' +import { resolveSourceControlActionRecipe } from '../../../../../../shared/source-control-ai-operation-policy' import { SOURCE_CONTROL_ACTION_IDS, type SourceControlActionId -} from '../../../../shared/source-control-ai-actions' -import type { RepoSourceControlAiOverrides } from '../../../../shared/source-control-ai-types' -import type { GlobalSettings } from '../../../../shared/global-settings-types' +} from '../../../../../../shared/source-control-ai-actions' +import type { RepoSourceControlAiOverrides } from '../../../../../../shared/source-control-ai-types' +import type { GlobalSettings } from '../../../../../../shared/global-settings-types' import { completeRepoActionRecipe } from './repository-source-control-ai-labels' -import { SOURCE_CONTROL_TEXT_ACTION_ID_SET } from './source-control-action-recipe-options' +import { SOURCE_CONTROL_TEXT_ACTION_ID_SET } from '../../source-control-action-recipe-options' type RepoActionRecipe = NonNullable< NonNullable[SourceControlActionId] diff --git a/src/renderer/src/components/settings/repository-source-control-ai-global-ux.test.ts b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-global-ux.test.ts similarity index 95% rename from src/renderer/src/components/settings/repository-source-control-ai-global-ux.test.ts rename to src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-global-ux.test.ts index d5edf7d7b07..ce83937c83a 100644 --- a/src/renderer/src/components/settings/repository-source-control-ai-global-ux.test.ts +++ b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-global-ux.test.ts @@ -1,22 +1,20 @@ // @vitest-environment happy-dom import { act, renderHook } from '@testing-library/react' import { describe, expect, it, vi } from 'vitest' -import { - normalizeRepoSourceControlAiOverrides, - normalizeSourceControlAiSettings -} from '../../../../shared/source-control-ai' -import type { RepoSourceControlAiOverrides } from '../../../../shared/source-control-ai-types' -import type { SourceControlAiRepoUpdate } from '../../../../shared/source-control-ai-recipe-save' +import { normalizeRepoSourceControlAiOverrides } from '../../../../../../shared/source-control-ai-repo-settings' +import { normalizeSourceControlAiSettings } from '../../../../../../shared/source-control-ai-settings' +import type { RepoSourceControlAiOverrides } from '../../../../../../shared/source-control-ai-types' +import type { SourceControlAiRepoUpdate } from '../../../../../../shared/source-control-ai-recipe-save' import { useRepositorySourceControlAiGlobalUx } from './repository-source-control-ai-global-ux' -import { withRepoAiActionLaunchPreferences } from './repository-source-control-ai-action-agent-draft' +import { withRepoAiActionLaunchPreferences } from '../../repository-source-control-ai-action-agent-draft' import { readActionRecipeTextDraft, withRepoAiActionRecipeText } from './repository-source-control-ai-draft' -import { toSourceControlAiRepoUpdate } from '../../../../shared/source-control-ai-recipe-save' -import type { SourceControlActionId } from '../../../../shared/source-control-ai-actions' -import { getDefaultSettings } from '../../../../shared/constants' -import { resolveSourceControlActionRecipe } from '../../../../shared/source-control-ai-operation-policy' +import { toSourceControlAiRepoUpdate } from '../../../../../../shared/source-control-ai-recipe-save' +import type { SourceControlActionId } from '../../../../../../shared/source-control-ai-actions' +import { getDefaultSettings } from '../../../../../../shared/constants' +import { resolveSourceControlActionRecipe } from '../../../../../../shared/source-control-ai-operation-policy' const source = normalizeSourceControlAiSettings(undefined, undefined) diff --git a/src/renderer/src/components/settings/repository-source-control-ai-global-ux.ts b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-global-ux.ts similarity index 92% rename from src/renderer/src/components/settings/repository-source-control-ai-global-ux.ts rename to src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-global-ux.ts index 0408f8ed7d5..e1a3ca08192 100644 --- a/src/renderer/src/components/settings/repository-source-control-ai-global-ux.ts +++ b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-global-ux.ts @@ -1,17 +1,17 @@ -import { liftActionPermissionArgs } from '../../../../shared/source-control-action-permission-lift' +import { liftActionPermissionArgs } from '../../../../../../shared/source-control-action-permission-lift' import { useEffect, useMemo, useRef, useState } from 'react' -import type { GlobalSettings } from '../../../../shared/global-settings-types' -import type { TuiAgent } from '../../../../shared/tui-agent' -import { CUSTOM_AGENT_ID } from '../../../../shared/commit-message-agent-spec' +import type { GlobalSettings } from '../../../../../../shared/global-settings-types' +import type { TuiAgent } from '../../../../../../shared/tui-agent' +import { CUSTOM_AGENT_ID } from '../../../../../../shared/commit-message-agent-spec' import type { RepoSourceControlAiOverrides, SourceControlAiSettings -} from '../../../../shared/source-control-ai-types' -import type { SourceControlAiRepoUpdate } from '../../../../shared/source-control-ai-recipe-save' +} from '../../../../../../shared/source-control-ai-types' +import type { SourceControlAiRepoUpdate } from '../../../../../../shared/source-control-ai-recipe-save' import type { SourceControlActionRecipe, SourceControlActionId -} from '../../../../shared/source-control-ai-actions' +} from '../../../../../../shared/source-control-ai-actions' import { useMountedRef } from '@/hooks/useMountedRef' import { clearActionTextDraftIfUnchanged, @@ -30,14 +30,12 @@ import { withRepoAiHostedReviewDefault } from './repository-source-control-ai-draft' import { ACTION_MODE_INHERIT, DEFAULT_AGENT_VALUE } from './repository-source-control-ai-labels' -import { createRepoAiPersistQueue } from './repository/source-control/repository-source-control-ai-persist-queue' -import { withRepoAiActionAgent } from './repository-source-control-ai-action-agent-draft' +import { createRepoAiPersistQueue } from './repository-source-control-ai-persist-queue' +import { withRepoAiActionAgent } from '../../repository-source-control-ai-action-agent-draft' import { createRepoActionTextDraftEditors, resetActionDraftLaunchPreferences -} from './repository-source-control-ai-text-draft' - -export { normalizeRepoAiDraft as normalizePersistedRepoAi } from './repository-source-control-ai-draft' +} from '../../repository-source-control-ai-text-draft' type HostedReviewDefaultKey = keyof NonNullable diff --git a/src/renderer/src/components/settings/repository-source-control-ai-labels.ts b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-labels.ts similarity index 89% rename from src/renderer/src/components/settings/repository-source-control-ai-labels.ts rename to src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-labels.ts index f282cab6f32..4fc23090f1c 100644 --- a/src/renderer/src/components/settings/repository-source-control-ai-labels.ts +++ b/src/renderer/src/components/settings/repository/source-control/repository-source-control-ai-labels.ts @@ -1,16 +1,16 @@ -import type { TuiAgent } from '../../../../shared/tui-agent' +import type { TuiAgent } from '../../../../../../shared/tui-agent' import { DEFAULT_SOURCE_CONTROL_ACTION_COMMAND_TEMPLATES, resolveSourceControlActionCommandTemplate, type SourceControlActionId, type SourceControlActionRecipe -} from '../../../../shared/source-control-ai-actions' +} from '../../../../../../shared/source-control-ai-actions' import type { RepoSourceControlAiOverrides, SourceControlAiSettings -} from '../../../../shared/source-control-ai-types' -import type { CustomAgentId } from '../../../../shared/commit-message-agent-spec' -import { isCustomAgentId } from '../../../../shared/commit-message-agent-spec' +} from '../../../../../../shared/source-control-ai-types' +import type { CustomAgentId } from '../../../../../../shared/commit-message-agent-spec' +import { isCustomAgentId } from '../../../../../../shared/commit-message-agent-spec' export const ACTION_MODE_INHERIT = 'inherit' export const ACTION_MODE_OVERRIDE = 'override' diff --git a/src/renderer/src/components/settings/source-control-action-permission-draft.test.tsx b/src/renderer/src/components/settings/source-control-action-permission-draft.test.tsx index eb94493bde9..b0ec3756a30 100644 --- a/src/renderer/src/components/settings/source-control-action-permission-draft.test.tsx +++ b/src/renderer/src/components/settings/source-control-action-permission-draft.test.tsx @@ -15,7 +15,7 @@ import { liftActionPermissionArgs } from '../../../../shared/source-control-acti import { sourceControlActionAgentArgs } from '../../../../shared/source-control-action-launch-preferences' import { agentPermissionArgsForLaunch } from '../../../../shared/tui-agent-launch-defaults' import { SourceControlActionArguments } from './SourceControlActionArguments' -import { useRepositorySourceControlAiGlobalUx } from './repository-source-control-ai-global-ux' +import { useRepositorySourceControlAiGlobalUx } from './repository/source-control/repository-source-control-ai-global-ux' import { TooltipProvider } from '../ui/tooltip' const model = { agentId: 'claude', model: 'sonnet', options: { effort: 'high' } } as const