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
This commit is contained in:
mastertyko 2026-03-23 18:51:08 +01:00 committed by GitHub
parent 012f1cf06a
commit b3d12628f9
2 changed files with 6 additions and 3 deletions

View file

@ -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',

View file

@ -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/