skillhub/cli/src/shared/output.ts
dongmucat 3e66c80f94 fix(cli): preserve structured registry errors (#606)
Signed-off-by: dongmucat <1127093059@qq.com>
2026-07-28 16:58:32 +08:00

47 lines
1.4 KiB
TypeScript

import { CliError } from './errors'
export type JsonObject = Record<string, unknown>
export function printResult(result: string | JsonObject, json: boolean): string {
if (json) {
return JSON.stringify(typeof result === 'string' ? { ok: true, message: result } : result)
}
return typeof result === 'string' ? result : humanize(result)
}
export function renderError(error: unknown, json: boolean): string {
const cliError = error instanceof CliError
? error
: new CliError('unexpected failure', 1)
if (json) {
return JSON.stringify({
ok: false,
message: cliError.message,
exitCode: cliError.exitCode,
...(Object.keys(cliError.details).length > 0 ? { details: cliError.details } : {})
})
}
const lines = [`Error: ${cliError.message}`]
if (typeof cliError.details.registry === 'string') {
lines.push(`Context: registry ${cliError.details.registry}`)
}
if (typeof cliError.details.path === 'string') {
lines.push(`Context: path ${cliError.details.path}`)
}
if (typeof cliError.details.requestId === 'string') {
lines.push(`Request ID: ${cliError.details.requestId}`)
}
if (typeof cliError.details.next === 'string') {
lines.push(`Next: ${cliError.details.next}`)
}
return lines.join('\n')
}
function humanize(value: JsonObject): string {
return Object.entries(value)
.filter(([key]) => key !== 'ok')
.map(([key, item]) => `${key}: ${String(item)}`)
.join('\n')
}