harvask-cli 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/utils/exit.js +29 -0
- package/dist/utils/exit.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3,15 +3,17 @@
|
|
|
3
3
|
* harvask CLI エントリポイント
|
|
4
4
|
*/
|
|
5
5
|
import { run } from './cli.js';
|
|
6
|
+
import { exitAfterFlush } from './utils/exit.js';
|
|
6
7
|
// 処理完了後は明示的に終了する。
|
|
7
8
|
// fetch(undici) の keep-alive プールやループバックサーバの接続がイベントループに
|
|
8
9
|
// 残ってプロセスが終了しない(プロンプトが返らない)のを防ぐ。
|
|
9
|
-
//
|
|
10
|
+
// ただし stdout がパイプの場合は書き込みが非同期なので、即 process.exit() すると
|
|
11
|
+
// 64KB を超える出力が途中で欠ける。exitAfterFlush で書き込み完了を待ってから終了する。
|
|
10
12
|
run(process.argv)
|
|
11
|
-
.then(() =>
|
|
13
|
+
.then(() => exitAfterFlush(Number(process.exitCode ?? 0)))
|
|
12
14
|
.catch((err) => {
|
|
13
15
|
// run() 内で捕捉しきれなかった想定外エラー
|
|
14
16
|
console.error(err instanceof Error ? err.message : String(err));
|
|
15
|
-
|
|
17
|
+
exitAfterFlush(1);
|
|
16
18
|
});
|
|
17
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,kBAAkB;AAClB,uDAAuD;AACvD,iCAAiC;AACjC,sDAAsD;AACtD,uDAAuD;AACvD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;KACd,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;KACzD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,0BAA0B;IAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,cAAc,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdout/stderr の書き込み完了を待ってからプロセスを終了する。
|
|
3
|
+
*
|
|
4
|
+
* Node の stdout はファイル/TTY では同期だが、パイプ(`| jq`、コーディングエージェントの
|
|
5
|
+
* Bash 等)では非同期なので、即 process.exit() するとカーネルのパイプバッファ(64KB)に
|
|
6
|
+
* 収まらなかった分が欠ける(`workflow list --json` が途中で切れる等)。
|
|
7
|
+
*
|
|
8
|
+
* 空チャンクの write コールバックは、それ以前にキューされた書き込みが全て捌けた後に
|
|
9
|
+
* 呼ばれるので、これを flush 完了の合図として使う。
|
|
10
|
+
*
|
|
11
|
+
* EPIPE(`| head` 等で読み手が先に閉じた)は正常扱い。
|
|
12
|
+
* それ以外の書き込み失敗はエラーとして stderr に出し、非 0 で終了する。
|
|
13
|
+
*/
|
|
14
|
+
export function exitAfterFlush(code) {
|
|
15
|
+
let exitCode = code;
|
|
16
|
+
let pending = 2;
|
|
17
|
+
const done = (err) => {
|
|
18
|
+
const e = err;
|
|
19
|
+
if (e && e.code !== 'EPIPE') {
|
|
20
|
+
process.stderr.write(`Error: failed to write output: ${e.message}\n`);
|
|
21
|
+
exitCode = exitCode || 1;
|
|
22
|
+
}
|
|
23
|
+
if (--pending === 0)
|
|
24
|
+
process.exit(exitCode);
|
|
25
|
+
};
|
|
26
|
+
process.stdout.write('', done);
|
|
27
|
+
process.stderr.write('', done);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=exit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit.js","sourceRoot":"","sources":["../../src/utils/exit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,CAAC,GAAkB,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,GAAqD,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACtE,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,OAAO,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC"}
|