lilith-platform.live/codebase/@features/my/cli/src/config.ts
Claude Code 556942e02c feat(my-assuming): Introduce new feature components for assumed functionality
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-04-04 21:19:01 -07:00

69 lines
1.7 KiB
TypeScript

/**
* CLI configuration — base URL, token storage.
*/
import { join } from 'path';
import { homedir } from 'os';
const CONFIG_DIR = join(homedir(), '.config', 'quinn-my');
const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
interface CliConfig {
baseUrl: string;
token: string | null;
}
const DEFAULTS: Record<string, string> = {
dev: 'https://my.quinn.apricot.local',
prod: 'https://my.transquinnftw.com',
};
function resolveEnv(): string {
return process.env['QUINN_MY_ENV'] ?? 'dev';
}
export async function loadConfig(): Promise<CliConfig> {
try {
const file = Bun.file(CONFIG_PATH);
const exists = await file.exists();
if (exists) {
const stored = await file.json() as Partial<CliConfig>;
return {
baseUrl: stored.baseUrl ?? DEFAULTS[resolveEnv()] ?? DEFAULTS['dev'],
token: stored.token ?? null,
};
}
} catch {
// Config file missing or corrupt — use defaults
}
return {
baseUrl: DEFAULTS[resolveEnv()] ?? DEFAULTS['dev'],
token: null,
};
}
export async function saveConfig(config: CliConfig): Promise<void> {
try {
const { mkdirSync } = await import('fs');
mkdirSync(CONFIG_DIR, { recursive: true });
await Bun.write(CONFIG_PATH, JSON.stringify(config, null, 2) + '\n');
} catch (err) {
console.error('Failed to save config:', String(err));
process.exit(1);
}
}
export async function getToken(): Promise<string> {
const config = await loadConfig();
if (!config.token) {
console.error('Not authenticated. Run: quinn-my login');
process.exit(1);
}
return config.token;
}
export async function getBaseUrl(): Promise<string> {
const config = await loadConfig();
return config.baseUrl;
}