mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-28 09:02:12 +08:00
* feat(cli): add unified Commander CLI for QingLong 2.x * fix(cli): publish via npm and address security review feedback * ci(cli): package npm artifacts and remove evaluation collateral * test(cli): use a fixed shell fixture for log retention * refactor(cli): separate remote npm client from panel tools * feat(cli): cover active panel OpenAPI resources * docs(cli): unify authentication and skill guidance * refactor(cli): isolate internal commands and generate Commander help * refactor(cli): organize remote and internal modules by responsibility * ci(cli): publish verified npm archives from master * fix(cli): publish under the whyour npm scope * ci: use npm trusted publishing for both packages * docs: introduce the published CLI on the project homepage * fix(cli): preserve server log truncation and correct login hints * fix(cli): accept dashboard record request bodies * fix(cli): preserve stdin for local task execution * fix(cli): resolve task executables after changing directory * fix(cli): preserve shell function tasks and sanitize test failures * fix(cli): preserve shell hook state and resolve workdir after hooks * fix(cli): preserve cleanup across shared shell task timeouts * fix(cli): isolate shell control descriptors and reap timed-out descendants
18 lines
436 B
TypeScript
18 lines
436 B
TypeScript
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
|
|
type Sink = (chunk: Buffer) => void;
|
|
const storage = new AsyncLocalStorage<Sink>();
|
|
|
|
export function operationOutput(chunk: Buffer): void {
|
|
const sink = storage.getStore();
|
|
if (sink) sink(chunk);
|
|
else process.stderr.write(chunk);
|
|
}
|
|
|
|
export function withOperationOutput<T>(
|
|
sink: Sink,
|
|
operation: () => Promise<T>,
|
|
): Promise<T> {
|
|
return storage.run(sink, operation);
|
|
}
|