Skip to content

Commit c28f64b

Browse files
committed
Add project picker helper and tests
1 parent 7ffbb57 commit c28f64b

File tree

3 files changed

+54
-5
lines changed

3 files changed

+54
-5
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { describe, test, expect } from 'bun:test'
2+
import path from 'path'
3+
4+
import { shouldShowProjectPicker } from '../../utils/project-picker'
5+
6+
describe('cli/utils/project-picker', () => {
7+
test('returns true when start cwd is home directory', () => {
8+
const root = path.parse(process.cwd()).root
9+
const homeDir = path.join(root, 'home', 'test-user')
10+
11+
expect(shouldShowProjectPicker(homeDir, homeDir)).toBe(true)
12+
})
13+
14+
test('returns true when start cwd is a parent of home directory', () => {
15+
const root = path.parse(process.cwd()).root
16+
const homeDir = path.join(root, 'home', 'test-user')
17+
const parentDir = path.dirname(homeDir)
18+
19+
expect(shouldShowProjectPicker(parentDir, homeDir)).toBe(true)
20+
expect(shouldShowProjectPicker(root, homeDir)).toBe(true)
21+
})
22+
23+
test('returns false when start cwd is a child of home directory', () => {
24+
const root = path.parse(process.cwd()).root
25+
const homeDir = path.join(root, 'home', 'test-user')
26+
const childDir = path.join(homeDir, 'projects')
27+
28+
expect(shouldShowProjectPicker(childDir, homeDir)).toBe(false)
29+
})
30+
31+
test('returns false when start cwd is a sibling of home directory', () => {
32+
const root = path.parse(process.cwd()).root
33+
const homeDir = path.join(root, 'home', 'test-user')
34+
const siblingDir = path.join(root, 'home', 'other-user')
35+
36+
expect(shouldShowProjectPicker(siblingDir, homeDir)).toBe(false)
37+
})
38+
})

cli/src/index.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import { getProjectRoot, setProjectRoot } from './project-files'
2323
import { initAnalytics } from './utils/analytics'
2424
import { getAuthTokenDetails } from './utils/auth'
2525
import { getCliEnv } from './utils/env'
26-
import { findGitRoot } from './utils/git'
2726
import { initializeAgentRegistry } from './utils/local-agent-registry'
2827
import { clearLogFile, logger } from './utils/logger'
28+
import { shouldShowProjectPicker } from './utils/project-picker'
2929
import { saveRecentProject } from './utils/recent-projects'
3030
import { detectTerminalTheme } from './utils/terminal-color-detection'
3131
import { setOscDetectedTheme } from './utils/theme-system'
@@ -173,12 +173,11 @@ async function main(): Promise<void> {
173173

174174
await initializeApp({ cwd })
175175

176-
// Detect if user is at home directory or outside a project (should show project picker)
176+
// Show project picker only when user starts at the home directory or an ancestor
177177
const projectRoot = getProjectRoot()
178178
const homeDir = os.homedir()
179-
const gitRoot = findGitRoot({ cwd: projectRoot })
180-
const showProjectPicker =
181-
projectRoot === '/' || projectRoot === homeDir || gitRoot === null
179+
const startCwd = process.cwd()
180+
const showProjectPicker = shouldShowProjectPicker(startCwd, homeDir)
182181

183182
// Initialize agent registry (loads user agents via SDK).
184183
// When --agent is provided, skip local .agents to avoid overrides.

cli/src/utils/project-picker.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import path from 'path'
2+
3+
export function shouldShowProjectPicker(
4+
startCwd: string,
5+
homeDir: string,
6+
): boolean {
7+
const relativeToHome = path.relative(startCwd, homeDir)
8+
return (
9+
relativeToHome === '' ||
10+
(!relativeToHome.startsWith('..') && !path.isAbsolute(relativeToHome))
11+
)
12+
}

0 commit comments

Comments
 (0)