diff --git a/cli/src/configuration.ts b/cli/src/configuration.ts index dc3813cb..691b2839 100644 --- a/cli/src/configuration.ts +++ b/cli/src/configuration.ts @@ -12,7 +12,7 @@ import packageJson from '../package.json' import { getCliArgs } from '@/utils/cliArgs' class Configuration { - public readonly serverUrl: string + private _serverUrl: string private _cliApiToken: string public readonly isDaemonProcess: boolean @@ -29,7 +29,7 @@ class Configuration { constructor() { // Server configuration - this.serverUrl = process.env.HAPI_SERVER_URL || 'http://localhost:3006' + this._serverUrl = process.env.HAPI_SERVER_URL || 'http://localhost:3006' this._cliApiToken = process.env.CLI_API_TOKEN || '' // Check if we're running as daemon based on process args @@ -64,6 +64,14 @@ class Configuration { } } + get serverUrl(): string { + return this._serverUrl + } + + _setServerUrl(url: string): void { + this._serverUrl = url + } + get cliApiToken(): string { return this._cliApiToken } diff --git a/cli/src/persistence.ts b/cli/src/persistence.ts index 9be53326..5942db54 100644 --- a/cli/src/persistence.ts +++ b/cli/src/persistence.ts @@ -17,6 +17,8 @@ interface Settings { machineIdConfirmedByServer?: boolean daemonAutoStartWhenRunningHappy?: boolean cliApiToken?: string + // Server URL for API connections (priority: env HAPI_SERVER_URL > this > default) + serverUrl?: string } const defaultSettings: Settings = {} diff --git a/cli/src/ui/serverUrlInit.ts b/cli/src/ui/serverUrlInit.ts new file mode 100644 index 00000000..cc65d5cb --- /dev/null +++ b/cli/src/ui/serverUrlInit.ts @@ -0,0 +1,31 @@ +/** + * Server URL initialization module + * + * Handles HAPI_SERVER_URL initialization with priority: + * 1. Environment variable (highest - allows temporary override) + * 2. Settings file (~/.hapi/settings.json) + * 3. Default value (http://localhost:3006) + */ + +import { configuration } from '@/configuration' +import { readSettings } from '@/persistence' + +/** + * Initialize server URL + * Must be called before any API operations + */ +export async function initializeServerUrl(): Promise { + // 1. Environment variable has highest priority (allows temporary override) + if (process.env.HAPI_SERVER_URL) { + return + } + + // 2. Read from settings file + const settings = await readSettings() + if (settings.serverUrl) { + configuration._setServerUrl(settings.serverUrl) + return + } + + // 3. Default value already set in configuration constructor +} diff --git a/cli/src/ui/tokenInit.ts b/cli/src/ui/tokenInit.ts index bd0daf90..337f7b9b 100644 --- a/cli/src/ui/tokenInit.ts +++ b/cli/src/ui/tokenInit.ts @@ -12,12 +12,16 @@ import { stdin as input, stdout as output } from 'node:process' import chalk from 'chalk' import { configuration } from '@/configuration' import { readSettings, updateSettings } from '@/persistence' +import { initializeServerUrl } from '@/ui/serverUrlInit' /** * Initialize CLI API token * Must be called before any API operations */ export async function initializeToken(): Promise { + // Initialize server URL first (env > settings.json > default) + await initializeServerUrl() + // 1. Environment variable has highest priority (allows temporary override) if (configuration.cliApiToken) { return diff --git a/cli/src/utils/autoStartServer.ts b/cli/src/utils/autoStartServer.ts index 1501df6a..c584c708 100644 --- a/cli/src/utils/autoStartServer.ts +++ b/cli/src/utils/autoStartServer.ts @@ -96,8 +96,16 @@ async function shouldAutoStartServer(): Promise { return false } - // Condition 2: cliApiToken exists in settings.json (server was previously started) + // Condition 2: Check settings.json const settings = await readSettings() + + // 2a: serverUrl is set in settings.json (user configured a specific server) + if (settings.serverUrl) { + logger.debug('[AUTO-START] serverUrl is set in settings.json, skipping auto-start') + return false + } + + // 2b: cliApiToken exists in settings.json (server was previously started) if (!settings.cliApiToken) { logger.debug('[AUTO-START] No cliApiToken in settings, skipping auto-start') return false