feat: add remote-first education work lake

This commit is contained in:
冰朔 2026-08-07 20:41:03 +08:00
commit 333cd222c5
43 changed files with 923 additions and 74 deletions

View file

@ -57,11 +57,6 @@ describe('useAiAgentsStatus', () => {
expect(result.current.claude_code).toEqual({ status: 'installed', version: '1.0.20' })
expect(result.current.codex).toEqual({ status: 'missing', version: null })
expect(result.current.copilot).toEqual({ status: 'installed', version: '1.0.58' })
expect(result.current.opencode).toEqual({ status: 'installed', version: '0.3.1' })
expect(result.current.pi).toEqual({ status: 'installed', version: '0.70.2' })
expect(result.current.antigravity).toEqual({ status: 'installed', version: 'Antigravity CLI 1.0.0' })
expect(result.current.kiro).toEqual({ status: 'installed', version: '0.4.0' })
expect(result.current.hermes).toEqual({ status: 'installed', version: 'Hermes Agent 0.16.0' })
})
})

View file

@ -1085,9 +1085,9 @@ describe('reload-vault command', () => {
expect(cmd).toBeDefined()
expect(cmd!.label).toBe('Switch AI Agent to Codex')
expect(findCommand(result.current, 'switch-ai-agent-copilot')).toBeDefined()
expect(findCommand(result.current, 'switch-ai-agent-opencode')).toBeDefined()
expect(findCommand(result.current, 'switch-ai-agent-pi')).toBeDefined()
expect(findCommand(result.current, 'switch-ai-agent-antigravity')).toBeDefined()
expect(findCommand(result.current, 'switch-ai-agent-opencode')).toBeUndefined()
expect(findCommand(result.current, 'switch-ai-agent-pi')).toBeUndefined()
expect(findCommand(result.current, 'switch-ai-agent-antigravity')).toBeUndefined()
cmd!.execute()
expect(onSetDefaultAiAgent).toHaveBeenCalledWith('codex')

View file

@ -0,0 +1,27 @@
import { renderHook } from '@testing-library/react'
import { describe, expect, it } from 'vitest'
import { useStartupScreenState } from './useStartupScreenState'
describe('useStartupScreenState', () => {
it('does not let local vault onboarding replace the HoloLake world entry', () => {
const { result } = renderHook(() => useStartupScreenState({
aiAgentsPromptVisible: false,
isNoteWindow: false,
onboardingState: { status: 'welcome' },
runtimeMissingVaultPath: '/blocked/config/path',
selectedVaultPath: null,
settingsLoaded: true,
showMcpSetupDialog: false,
telemetryConsent: null,
vaultIsLoading: false,
vaultSwitcher: {
allVaults: [],
loaded: true,
vaultPath: '',
},
worldEntryVisible: true,
}))
expect(result.current.shouldShowStartupScreen).toBe(false)
})
})

View file

@ -22,6 +22,7 @@ interface UseStartupScreenStateArgs {
telemetryConsent: boolean | null
vaultIsLoading: boolean
vaultSwitcher: StartupVaultSwitcherState
worldEntryVisible?: boolean
}
interface StartupScreenState {
@ -122,6 +123,7 @@ export function useStartupScreenState({
telemetryConsent,
vaultIsLoading,
vaultSwitcher,
worldEntryVisible = false,
}: UseStartupScreenStateArgs): StartupScreenState {
const shouldResumeFreshStartOnboarding = useMemo(
() => shouldResumeFreshStart(onboardingState, selectedVaultPath, vaultSwitcher),
@ -129,7 +131,7 @@ export function useStartupScreenState({
)
const isStartupLoading = !isNoteWindow && onboardingState.status === 'loading'
const shouldShowStartupScreen = shouldShowStartupScreenForState({
const shouldShowStartupScreen = !worldEntryVisible && shouldShowStartupScreenForState({
aiAgentsPromptVisible,
isNoteWindow,
isStartupLoading,