From b3d12628f9ce0d62beb171b87cf1b811da3c4e8a Mon Sep 17 00:00:00 2001 From: mastertyko <11311479+mastertyko@users.noreply.github.com> Date: Mon, 23 Mar 2026 18:51:08 +0100 Subject: [PATCH] fix: prevent banner from printing twice on first run (#2251) On first launch (before ~/.gsd/ exists), loader.ts prints a branded ASCII logo and welcome message. Later, cli.ts unconditionally calls printWelcomeScreen(), resulting in a duplicate banner. Set GSD_FIRST_RUN_BANNER env flag in loader.ts after printing the first-run banner. cli.ts now checks for this flag and skips the welcome screen when it is already set. The session-restart banner in register-hooks.ts is unaffected because it only fires on non-first sessions (isFirstSession guard). Closes #2245 --- src/cli.ts | 5 +++-- src/loader.ts | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index bc1ec352e..6a7fba97a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -630,8 +630,9 @@ if (!process.stdin.isTTY) { process.exit(1) } -// Welcome screen — shown on every fresh interactive session before TUI takes over -{ +// Welcome screen — shown on every fresh interactive session before TUI takes over. +// Skip when the first-run banner was already printed in loader.ts (prevents double banner). +if (!process.env.GSD_FIRST_RUN_BANNER) { const { printWelcomeScreen } = await import('./welcome-screen.js') printWelcomeScreen({ version: process.env.GSD_VERSION || '0.0.0', diff --git a/src/loader.ts b/src/loader.ts index f40e2e0c5..237f5bab7 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -49,7 +49,8 @@ process.env.PI_PACKAGE_DIR = pkgDir process.env.PI_SKIP_VERSION_CHECK = '1' // GSD runs its own update check in cli.ts — suppress pi's process.title = 'gsd' -// Print branded banner on first launch (before ~/.gsd/ exists) +// Print branded banner on first launch (before ~/.gsd/ exists). +// Set GSD_FIRST_RUN_BANNER so cli.ts skips the duplicate welcome screen. if (!existsSync(appRoot)) { const cyan = '\x1b[36m' const green = '\x1b[32m' @@ -62,6 +63,7 @@ if (!existsSync(appRoot)) { ` Get Shit Done ${dim}v${gsdVersion}${reset}\n` + ` ${green}Welcome.${reset} Setting up your environment...\n\n` ) + process.env.GSD_FIRST_RUN_BANNER = '1' } // GSD_CODING_AGENT_DIR — tells pi's getAgentDir() to return ~/.gsd/agent/ instead of ~/.gsd/agent/