import type { ProjectId, ProjectScript, ServerSettings } from "@t3tools/contracts"; type ProjectScriptSettings = Pick< ServerSettings, | "defaultProjectScripts" | "projectScriptOverrides" | "projectSettingsOverrides" | "projectSettingsFolded" >; export function resolveProjectScripts( settings: ProjectScriptSettings, project: { id: ProjectId; scripts: readonly ProjectScript[] }, ): readonly ProjectScript[] { const override = settings.projectSettingsOverrides[project.id]?.defaultProjectScripts; if (override !== undefined) return override; if (settings.projectSettingsFolded) return settings.defaultProjectScripts; const legacy = settings.projectScriptOverrides[project.id]; if (legacy === null) return settings.defaultProjectScripts; return legacy ?? (project.scripts.length > 0 ? project.scripts : settings.defaultProjectScripts); } interface ProjectScriptRuntimeEnvInput { project: { cwd: string; }; worktreePath?: string | null; extraEnv?: Record; } export function projectScriptCwd(input: { project: { cwd: string; }; worktreePath?: string | null; }): string { return input.worktreePath ?? input.project.cwd; } export function projectScriptRuntimeEnv( input: ProjectScriptRuntimeEnvInput, ): Record { const env: Record = { T3CODE_PROJECT_ROOT: input.project.cwd, }; if (input.worktreePath) { env.T3CODE_WORKTREE_PATH = input.worktreePath; } if (input.extraEnv) { return { ...env, ...input.extraEnv }; } return env; } export function setupProjectScript(scripts: readonly ProjectScript[]): ProjectScript | null { return scripts.find((script) => script.runOnWorktreeCreate) ?? null; } export function projectScriptMenuLabel(script: ProjectScript): string { const roles = [ ...(script.runOnWorktreeCreate ? ["setup"] : []), ...(script.runOnSettle ? ["on settle"] : []), ]; return roles.length === 0 ? script.name : `${script.name} (${roles.join(", ")})`; } export function settleProjectScript(scripts: readonly ProjectScript[]): ProjectScript | null { return scripts.find((script) => script.runOnSettle === true) ?? null; } /** * Leading spaces omit scripts from Bash history with ignorespace/ignoreboth, * zsh with HIST_IGNORE_SPACE, and fish. Only the first line is prefixed, so later * entries from multiline input may still enter history. PowerShell/PSReadLine history is not suppressed. */ export function projectScriptTerminalInput(command: string): string { return ` ${command}\r`; }