mirror of
https://github.com/stablyai/orca.git
synced 2026-10-22 08:03:37 +00:00
* Reorder source control to show staged changes first by default Stages are closest to the commit action and most relevant to the commit workflow. Merges untracked files into Changes visually while preserving their Git area. Removes the untracked-first preset and includes migration logic for existing user settings. * Drop source control group order user preference Remove the sourceControlGroupOrder setting and related UI, migrations, and persistence logic. The source control view now always displays sections in the order: staged changes, unstaged changes, untracked files. * Reorder source control to show changes before staged Aligns with the edit-stage-commit workflow by showing unstaged changes (active edits) before staged changes (queued for commit).
179 lines
6.7 KiB
TypeScript
179 lines
6.7 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
DEFAULT_TERMINAL_INACTIVE_PANE_OPACITY,
|
|
getDefaultNotificationSettings,
|
|
getDefaultPrimarySelectionMiddleClickPaste,
|
|
getDefaultTerminalRightClickToPaste,
|
|
getDefaultSettings
|
|
} from './constants'
|
|
|
|
describe('getDefaultSettings', () => {
|
|
it('uses platform-consistent separators for the default workspace directory', () => {
|
|
expect(getDefaultSettings('/Users/alice').workspaceDir).toBe('/Users/alice/orca/workspaces')
|
|
expect(getDefaultSettings('C:\\Users\\alice').workspaceDir).toBe(
|
|
'C:\\Users\\alice\\orca\\workspaces'
|
|
)
|
|
})
|
|
|
|
it('enables gitignored file decorations by default', () => {
|
|
expect(getDefaultSettings('/tmp').showGitIgnoredFiles).toBe(true)
|
|
})
|
|
|
|
it('uses list view for Source Control changes by default', () => {
|
|
expect(getDefaultSettings('/tmp').sourceControlViewMode).toBe('list')
|
|
})
|
|
|
|
it('uses a commit-oriented Source Control layout by default', () => {})
|
|
|
|
it('defaults mobile pairing to discovered network addresses', () => {
|
|
expect(getDefaultSettings('/tmp').mobilePairingCustomAddress).toBeNull()
|
|
expect(getDefaultSettings('/tmp').mobilePairingCustomAddresses).toEqual([])
|
|
})
|
|
|
|
it('keeps first-work branch auto-renaming on by default for new settings', () => {
|
|
expect(getDefaultSettings('/tmp').autoRenameBranchFromWork).toBe(true)
|
|
expect(getDefaultSettings('/tmp').autoRenameBranchFromWorkDefaultedOn).toBe(true)
|
|
})
|
|
|
|
it('uses a block terminal cursor by default for new settings', () => {
|
|
expect(getDefaultSettings('/tmp').terminalCursorStyle).toBe('block')
|
|
expect(getDefaultSettings('/tmp').terminalCursorStyleDefaultedToBlock).toBe(true)
|
|
})
|
|
|
|
it('allows OSC 52 clipboard writes by default for new settings', () => {
|
|
expect(getDefaultSettings('/tmp').terminalAllowOsc52Clipboard).toBe(true)
|
|
expect(getDefaultSettings('/tmp').terminalAllowOsc52ClipboardDefaultedOnForAllUsers).toBe(true)
|
|
})
|
|
|
|
it('enables separate light terminal theme by default', () => {
|
|
expect(getDefaultSettings('/tmp').terminalUseSeparateLightTheme).toBe(true)
|
|
})
|
|
|
|
it('keeps inactive terminal panes readable by default', () => {
|
|
expect(getDefaultSettings('/tmp').terminalInactivePaneOpacity).toBe(
|
|
DEFAULT_TERMINAL_INACTIVE_PANE_OPACITY
|
|
)
|
|
})
|
|
|
|
it('asks before closing terminals with running processes by default', () => {
|
|
expect(getDefaultSettings('/tmp').skipCloseTerminalWithRunningProcessConfirm).toBe(false)
|
|
})
|
|
|
|
it('uses system language by default', () => {
|
|
expect(getDefaultSettings('/tmp').uiLanguage).toBe('system')
|
|
})
|
|
|
|
it('defaults the menu bar icon on so the value round-trips across platforms', () => {
|
|
expect(getDefaultSettings('/tmp').showMenuBarIcon).toBe(true)
|
|
})
|
|
|
|
it('confirms before closing pinned tabs by default', () => {
|
|
expect(getDefaultSettings('/tmp').confirmClosePinnedTab).toBe(true)
|
|
})
|
|
|
|
it('keeps file-editor word wrapping enabled by default', () => {
|
|
expect(getDefaultSettings('/tmp').editorWordWrap).toBe(true)
|
|
})
|
|
|
|
it('keeps rich Markdown spellcheck enabled by default', () => {
|
|
expect(getDefaultSettings('/tmp').richMarkdownSpellcheckEnabled).toBe(true)
|
|
})
|
|
|
|
it('enables Source Control AI by default without pinning a separate agent', () => {
|
|
expect(getDefaultSettings('/tmp').commitMessageAi).toMatchObject({
|
|
enabled: true,
|
|
agentId: null,
|
|
selectedModelByAgent: {}
|
|
})
|
|
expect(getDefaultSettings('/tmp').sourceControlAi).toMatchObject({
|
|
enabled: true,
|
|
agentId: null,
|
|
selectedModelByAgent: {},
|
|
instructionsByOperation: {
|
|
commitMessage: '',
|
|
pullRequest: '',
|
|
branchName: ''
|
|
}
|
|
})
|
|
})
|
|
|
|
it('keeps compact worktree cards disabled by default', () => {
|
|
expect(getDefaultSettings('/tmp').compactWorktreeCards).toBe(false)
|
|
})
|
|
|
|
it('keeps per-workspace environments disabled by default', () => {
|
|
expect(getDefaultSettings('/tmp').experimentalEphemeralVms).toBe(false)
|
|
})
|
|
|
|
it('keeps the agent dashboard popout disabled by default', () => {
|
|
expect(getDefaultSettings('/tmp').experimentalAgentDashboardPopout).toBe(false)
|
|
expect(getDefaultSettings('/tmp').experimentalAgentDashboardShowIdle).toBe(false)
|
|
})
|
|
|
|
it('routes fresh Codex profiles through the real-home rollout by default', () => {})
|
|
|
|
it('defaults local Windows projects to the host runtime', () => {
|
|
expect(getDefaultSettings('/tmp').localWindowsRuntimeDefault).toEqual({
|
|
kind: 'windows-host'
|
|
})
|
|
})
|
|
|
|
it('suppresses notifications for the focused worktree by default for new users', () => {
|
|
expect(getDefaultNotificationSettings().suppressWhenFocused).toBe(true)
|
|
expect(getDefaultSettings('/tmp').notifications.suppressWhenFocused).toBe(true)
|
|
})
|
|
|
|
it('defaults agent launch args to yolo mode where the CLI supports it', () => {
|
|
const settings = getDefaultSettings('/tmp')
|
|
|
|
expect(settings.agentDefaultArgs).toMatchObject({
|
|
claude: '--dangerously-skip-permissions',
|
|
codex: '--dangerously-bypass-approvals-and-sandbox',
|
|
gemini: '--yolo',
|
|
cursor: '--yolo',
|
|
copilot: '--yolo',
|
|
grok: '--permission-mode bypassPermissions'
|
|
})
|
|
expect(settings.agentDefaultArgs).not.toHaveProperty('opencode')
|
|
expect(settings.agentDefaultArgs).not.toHaveProperty('kilo')
|
|
expect(settings.agentDefaultEnv).toMatchObject({
|
|
goose: { GOOSE_MODE: 'auto' }
|
|
})
|
|
expect(settings.agentYoloDefaultsMigrated).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('getDefaultPrimarySelectionMiddleClickPaste', () => {
|
|
it('enables primary selection paste on Linux by default', () => {
|
|
expect(getDefaultPrimarySelectionMiddleClickPaste('linux')).toBe(true)
|
|
})
|
|
|
|
it('enables primary selection paste on macOS by default', () => {
|
|
expect(getDefaultPrimarySelectionMiddleClickPaste('darwin')).toBe(true)
|
|
})
|
|
|
|
it('leaves primary selection paste opt-in on Windows', () => {
|
|
expect(getDefaultPrimarySelectionMiddleClickPaste('win32')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('getDefaultTerminalRightClickToPaste', () => {
|
|
it('defaults on only for Windows', () => {
|
|
expect(getDefaultTerminalRightClickToPaste('win32')).toBe(true)
|
|
expect(getDefaultTerminalRightClickToPaste('darwin')).toBe(false)
|
|
expect(getDefaultTerminalRightClickToPaste('linux')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('MiniMax defaults', () => {
|
|
it('starts MiniMax with empty group id and the canonical default model', () => {
|
|
const settings = getDefaultSettings('/tmp')
|
|
// Why: the fetcher reads these defaults on first launch. An empty
|
|
// group id is the signal that the fetcher must pull the value from
|
|
// the cookie itself, and "general" matches the model name the
|
|
// MiniMax usage endpoint exposes by default.
|
|
expect(settings.minimaxGroupId).toBe('')
|
|
expect(settings.minimaxUsageModels).toBe('general')
|
|
})
|
|
})
|