type WorkspaceMode = "local" | "worktree"; export function resolveNewTaskWorkspaceLabel(input: { readonly workspaceMode: WorkspaceMode; readonly worktreePath: string | null;}): "Current checkout" | "Current worktree" | "New worktree" { if (input.workspaceMode === "worktree") { return "New worktree"; } return input.worktreePath ? "Current worktree" : "Current checkout";} export function resolveNewTaskBranchWorktreePath(input: { readonly workspaceMode: WorkspaceMode; readonly projectCwd: string; readonly branchWorktreePath: string | null | undefined;}): string | null { if ( input.workspaceMode === "worktree" || !input.branchWorktreePath || input.branchWorktreePath === input.projectCwd ) { return null; } return input.branchWorktreePath;} export function resolveNewTaskLocalWorkspaceSelection(input: { readonly branches: ReadonlyArray<{ readonly name: string; readonly current: boolean; readonly worktreePath?: string | null; }>; readonly projectCwd: string;}): { readonly branch: string | null; readonly worktreePath: string | null; readonly awaitsCurrentBranch: boolean;} { const currentBranch = input.branches.find((branch) => branch.current) ?? null; if (!currentBranch) { return { branch: null, worktreePath: null, awaitsCurrentBranch: true, }; } return { branch: currentBranch.name, worktreePath: resolveNewTaskBranchWorktreePath({ workspaceMode: "local", projectCwd: input.projectCwd, branchWorktreePath: currentBranch.worktreePath, }), awaitsCurrentBranch: false, };} export function resolveNewTaskBranchLabel(input: { readonly branchName: string | null; readonly startFromOrigin: boolean; readonly workspaceMode: WorkspaceMode;}): string { if (!input.branchName) { return "Choose branch"; } if (input.workspaceMode === "local") { return input.branchName; } const baseRef = input.startFromOrigin ? `origin/${input.branchName}` : input.branchName; return `From ${baseRef}`;} export function shouldCheckoutNewTaskBranch(input: { readonly branchIsCurrent: boolean; readonly branchWorktreePath: string | null | undefined; readonly workspaceMode: WorkspaceMode;}): boolean { return input.workspaceMode === "local" && !input.branchIsCurrent && !input.branchWorktreePath;}
type WorkspaceMode = "local" | "worktree";
export function resolveNewTaskWorkspaceLabel(input: {
readonly workspaceMode: WorkspaceMode;
readonly worktreePath: string | null;
}): "Current checkout" | "Current worktree" | "New worktree" {
if (input.workspaceMode === "worktree") {
return "New worktree";
}
return input.worktreePath ? "Current worktree" : "Current checkout";
}
export function resolveNewTaskBranchWorktreePath(input: {
readonly workspaceMode: WorkspaceMode;
readonly projectCwd: string;
readonly branchWorktreePath: string | null | undefined;
}): string | null {
if (
input.workspaceMode === "worktree" ||
!input.branchWorktreePath ||
input.branchWorktreePath === input.projectCwd
) {
return null;
}
return input.branchWorktreePath;
}
export function resolveNewTaskLocalWorkspaceSelection(input: {
readonly branches: ReadonlyArray<{
readonly name: string;
readonly current: boolean;
readonly worktreePath?: string | null;
}>;
readonly projectCwd: string;
}): {
readonly branch: string | null;
readonly worktreePath: string | null;
readonly awaitsCurrentBranch: boolean;
} {
const currentBranch = input.branches.find((branch) => branch.current) ?? null;
if (!currentBranch) {
return {
branch: null,
worktreePath: null,
awaitsCurrentBranch: true,
};
}
return {
branch: currentBranch.name,
worktreePath: resolveNewTaskBranchWorktreePath({
workspaceMode: "local",
projectCwd: input.projectCwd,
branchWorktreePath: currentBranch.worktreePath,
}),
awaitsCurrentBranch: false,
};
}
export function resolveNewTaskBranchLabel(input: {
readonly branchName: string | null;
readonly startFromOrigin: boolean;
readonly workspaceMode: WorkspaceMode;
}): string {
if (!input.branchName) {
return "Choose branch";
}
if (input.workspaceMode === "local") {
return input.branchName;
}
const baseRef = input.startFromOrigin ? `origin/${input.branchName}` : input.branchName;
return `From ${baseRef}`;
}
export function shouldCheckoutNewTaskBranch(input: {
readonly branchIsCurrent: boolean;
readonly branchWorktreePath: string | null | undefined;
readonly workspaceMode: WorkspaceMode;
}): boolean {
return input.workspaceMode === "local" && !input.branchIsCurrent && !input.branchWorktreePath;
}