refactor(cli): extract Query CLI Adapter Module seam (#3074)
* refactor(cli): extract query adapter seam from cli entrypoint * test: update ws forwarding guard for query-cli-adapter seam * fix(query): close remaining CodeRabbit findings on cli adapter * test: address remaining CodeRabbit nitpicks on ws forwarding coverage
This commit is contained in:
71
sdk/src/query/query-cli-adapter.ts
Normal file
71
sdk/src/query/query-cli-adapter.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { findProjectRoot } from './helpers.js';
|
||||
import { createRegistry } from './index.js';
|
||||
import { runQueryDispatch } from './query-dispatch.js';
|
||||
import { resolveGsdToolsPath, GSDToolsError } from '../gsd-tools.js';
|
||||
import { GSDError, exitCodeFor } from '../errors.js';
|
||||
import { validateWorkstreamName } from '../workstream-utils.js';
|
||||
|
||||
export interface QueryCliAdapterInput {
|
||||
projectDir: string;
|
||||
ws?: string;
|
||||
queryArgv?: string[];
|
||||
}
|
||||
|
||||
export interface QueryCliAdapterOutput {
|
||||
exitCode: number;
|
||||
stdoutChunks: string[];
|
||||
stderrLines: string[];
|
||||
}
|
||||
|
||||
function queryFallbackToCjsEnabled(): boolean {
|
||||
const v = process.env.GSD_QUERY_FALLBACK?.toLowerCase();
|
||||
if (v === 'off' || v === 'never' || v === 'false' || v === '0') return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function resolveQueryWorkstream(ws: string | undefined): string | undefined {
|
||||
if (ws !== undefined) {
|
||||
return validateWorkstreamName(ws) ? ws : undefined;
|
||||
}
|
||||
const envWs = process.env.GSD_WORKSTREAM;
|
||||
if (!envWs) return undefined;
|
||||
return validateWorkstreamName(envWs) ? envWs : undefined;
|
||||
}
|
||||
|
||||
export async function runQueryCliCommand(input: QueryCliAdapterInput): Promise<QueryCliAdapterOutput> {
|
||||
const stderrLines: string[] = [];
|
||||
const stdoutChunks: string[] = [];
|
||||
const ws = resolveQueryWorkstream(input.ws);
|
||||
|
||||
try {
|
||||
const projectDir = findProjectRoot(input.projectDir);
|
||||
const registry = createRegistry();
|
||||
const out = await runQueryDispatch({
|
||||
registry,
|
||||
projectDir,
|
||||
ws,
|
||||
cjsFallbackEnabled: queryFallbackToCjsEnabled(),
|
||||
resolveGsdToolsPath,
|
||||
dispatchNative: (cmd, argv) => registry.dispatch(cmd, argv, projectDir, ws),
|
||||
}, input.queryArgv ?? []);
|
||||
|
||||
stderrLines.push(...out.stderr);
|
||||
if (!out.ok) {
|
||||
stderrLines.push(out.error.message);
|
||||
return { exitCode: out.exit_code, stdoutChunks, stderrLines };
|
||||
}
|
||||
if (out.stdout) stdoutChunks.push(out.stdout);
|
||||
return { exitCode: 0, stdoutChunks, stderrLines };
|
||||
} catch (err) {
|
||||
if (err instanceof GSDError) {
|
||||
stderrLines.push(`Error: ${err.message}`);
|
||||
return { exitCode: exitCodeFor(err.classification), stdoutChunks, stderrLines };
|
||||
}
|
||||
if (err instanceof GSDToolsError) {
|
||||
stderrLines.push(`Error: ${err.message}`);
|
||||
return { exitCode: err.exitCode ?? 1, stdoutChunks, stderrLines };
|
||||
}
|
||||
stderrLines.push(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
||||
return { exitCode: 1, stdoutChunks, stderrLines };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user