76 lines
2.1 KiB
TypeScript
76 lines
2.1 KiB
TypeScript
import { sep } from 'path'
|
|
import { getOriginalCwd } from '../bootstrap/state.js'
|
|
import type { LogOption } from '../types/logs.js'
|
|
import { quote } from './bash/shellQuote.js'
|
|
import { getSessionIdFromLog } from './sessionStorage.js'
|
|
|
|
export type CrossProjectResumeResult =
|
|
| {
|
|
isCrossProject: false
|
|
}
|
|
| {
|
|
isCrossProject: true
|
|
isSameRepoWorktree: true
|
|
projectPath: string
|
|
}
|
|
| {
|
|
isCrossProject: true
|
|
isSameRepoWorktree: false
|
|
command: string
|
|
projectPath: string
|
|
}
|
|
|
|
/**
|
|
* Check if a log is from a different project directory and determine
|
|
* whether it's a related worktree or a completely different project.
|
|
*
|
|
* For same-repo worktrees, we can resume directly without requiring cd.
|
|
* For different projects, we generate the cd command.
|
|
*/
|
|
export function checkCrossProjectResume(
|
|
log: LogOption,
|
|
showAllProjects: boolean,
|
|
worktreePaths: string[],
|
|
): CrossProjectResumeResult {
|
|
const currentCwd = getOriginalCwd()
|
|
|
|
if (!showAllProjects || !log.projectPath || log.projectPath === currentCwd) {
|
|
return { isCrossProject: false }
|
|
}
|
|
|
|
// Gate worktree detection to ants only for staged rollout
|
|
if (process.env.USER_TYPE !== 'ant') {
|
|
const sessionId = getSessionIdFromLog(log)
|
|
const command = `cd ${quote([log.projectPath])} && claude --resume ${sessionId}`
|
|
return {
|
|
isCrossProject: true,
|
|
isSameRepoWorktree: false,
|
|
command,
|
|
projectPath: log.projectPath,
|
|
}
|
|
}
|
|
|
|
// Check if log.projectPath is under a worktree of the same repo
|
|
const isSameRepo = worktreePaths.some(
|
|
wt => log.projectPath === wt || log.projectPath!.startsWith(wt + sep),
|
|
)
|
|
|
|
if (isSameRepo) {
|
|
return {
|
|
isCrossProject: true,
|
|
isSameRepoWorktree: true,
|
|
projectPath: log.projectPath,
|
|
}
|
|
}
|
|
|
|
// Different repo - generate cd command
|
|
const sessionId = getSessionIdFromLog(log)
|
|
const command = `cd ${quote([log.projectPath])} && claude --resume ${sessionId}`
|
|
return {
|
|
isCrossProject: true,
|
|
isSameRepoWorktree: false,
|
|
command,
|
|
projectPath: log.projectPath,
|
|
}
|
|
}
|