refactor(launcher): split CLI flow into command modules

Isolate process-side effects behind adapter seams and keep wrapper behavior stable while improving command-level testability.
This commit is contained in:
2026-02-21 17:14:58 -08:00
parent 05be13be9e
commit c749430c77
14 changed files with 773 additions and 372 deletions

View File

@@ -0,0 +1,43 @@
import fs from 'node:fs';
import { fail } from '../log.js';
import { resolveMainConfigPath } from '../config-path.js';
import type { LauncherCommandContext } from './context.js';
interface ConfigCommandDeps {
existsSync(path: string): boolean;
readFileSync(path: string, encoding: BufferEncoding): string;
resolveMainConfigPath(): string;
}
const defaultDeps: ConfigCommandDeps = {
existsSync: fs.existsSync,
readFileSync: fs.readFileSync,
resolveMainConfigPath,
};
export function runConfigCommand(
context: LauncherCommandContext,
deps: ConfigCommandDeps = defaultDeps,
): boolean {
const { args, processAdapter } = context;
if (args.configPath) {
processAdapter.writeStdout(`${deps.resolveMainConfigPath()}\n`);
return true;
}
if (!args.configShow) {
return false;
}
const configPath = deps.resolveMainConfigPath();
if (!deps.existsSync(configPath)) {
fail(`Config file not found: ${configPath}`);
}
const contents = deps.readFileSync(configPath, 'utf8');
processAdapter.writeStdout(contents);
if (!contents.endsWith('\n')) {
processAdapter.writeStdout('\n');
}
return true;
}