snapshot-checker 0.1.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.
Files changed (70) hide show
  1. package/README.md +283 -0
  2. package/dist/commands/context_demo.d.ts +18 -0
  3. package/dist/commands/context_demo.d.ts.map +1 -0
  4. package/dist/commands/context_demo.js +68 -0
  5. package/dist/commands/context_demo.js.map +1 -0
  6. package/dist/commands/forkall.d.ts +54 -0
  7. package/dist/commands/forkall.d.ts.map +1 -0
  8. package/dist/commands/forkall.js +192 -0
  9. package/dist/commands/forkall.js.map +1 -0
  10. package/dist/commands/mac-example.d.ts +23 -0
  11. package/dist/commands/mac-example.d.ts.map +1 -0
  12. package/dist/commands/mac-example.js +39 -0
  13. package/dist/commands/mac-example.js.map +1 -0
  14. package/dist/commands/timeout_demo.d.ts +5 -0
  15. package/dist/commands/timeout_demo.d.ts.map +1 -0
  16. package/dist/commands/timeout_demo.js +48 -0
  17. package/dist/commands/timeout_demo.js.map +1 -0
  18. package/dist/src/cli.d.ts +3 -0
  19. package/dist/src/cli.d.ts.map +1 -0
  20. package/dist/src/cli.js +215 -0
  21. package/dist/src/cli.js.map +1 -0
  22. package/dist/src/executor.d.ts +8 -0
  23. package/dist/src/executor.d.ts.map +1 -0
  24. package/dist/src/executor.js +6 -0
  25. package/dist/src/executor.js.map +1 -0
  26. package/dist/src/groupSpecs.d.ts +7 -0
  27. package/dist/src/groupSpecs.d.ts.map +1 -0
  28. package/dist/src/groupSpecs.js +19 -0
  29. package/dist/src/groupSpecs.js.map +1 -0
  30. package/dist/src/index.d.ts +6 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +5 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/lib/programmatic.d.ts +48 -0
  35. package/dist/src/lib/programmatic.d.ts.map +1 -0
  36. package/dist/src/lib/programmatic.js +62 -0
  37. package/dist/src/lib/programmatic.js.map +1 -0
  38. package/dist/src/runCommand.d.ts +67 -0
  39. package/dist/src/runCommand.d.ts.map +1 -0
  40. package/dist/src/runCommand.js +286 -0
  41. package/dist/src/runCommand.js.map +1 -0
  42. package/dist/src/runGroups.d.ts +36 -0
  43. package/dist/src/runGroups.d.ts.map +1 -0
  44. package/dist/src/runGroups.js +123 -0
  45. package/dist/src/runGroups.js.map +1 -0
  46. package/dist/src/runners/builtinFunctionRunner.d.ts +7 -0
  47. package/dist/src/runners/builtinFunctionRunner.d.ts.map +1 -0
  48. package/dist/src/runners/builtinFunctionRunner.js +56 -0
  49. package/dist/src/runners/builtinFunctionRunner.js.map +1 -0
  50. package/dist/src/runners/embedRunner.d.ts +7 -0
  51. package/dist/src/runners/embedRunner.d.ts.map +1 -0
  52. package/dist/src/runners/embedRunner.js +129 -0
  53. package/dist/src/runners/embedRunner.js.map +1 -0
  54. package/dist/src/runners/index.d.ts +5 -0
  55. package/dist/src/runners/index.d.ts.map +1 -0
  56. package/dist/src/runners/index.js +4 -0
  57. package/dist/src/runners/index.js.map +1 -0
  58. package/dist/src/runners/shellRunner.d.ts +8 -0
  59. package/dist/src/runners/shellRunner.d.ts.map +1 -0
  60. package/dist/src/runners/shellRunner.js +142 -0
  61. package/dist/src/runners/shellRunner.js.map +1 -0
  62. package/dist/src/runners/types.d.ts +13 -0
  63. package/dist/src/runners/types.d.ts.map +1 -0
  64. package/dist/src/runners/types.js +2 -0
  65. package/dist/src/runners/types.js.map +1 -0
  66. package/dist/src/types.d.ts +122 -0
  67. package/dist/src/types.d.ts.map +1 -0
  68. package/dist/src/types.js +32 -0
  69. package/dist/src/types.js.map +1 -0
  70. package/package.json +55 -0
@@ -0,0 +1,129 @@
1
+ import { CommandKind } from '../types.js';
2
+ function sleep(ms) {
3
+ return new Promise((resolve) => setTimeout(resolve, ms));
4
+ }
5
+ function runEmbedSleep(cmd, start) {
6
+ const trimmed = (cmd.run ?? '').trim();
7
+ if (!trimmed.toLowerCase().startsWith('sleep '))
8
+ return null;
9
+ const rest = trimmed.slice(6).trim();
10
+ const seconds = Number.parseFloat(rest);
11
+ if (Number.isNaN(seconds) || seconds < 0)
12
+ return null;
13
+ return sleep(seconds * 1000).then(() => ({
14
+ kind: CommandKind.Embed,
15
+ description: cmd.description ?? `sleep ${seconds}s`,
16
+ success: true,
17
+ exitCode: 0,
18
+ stdout: '',
19
+ stderr: '',
20
+ durationMs: Date.now() - start,
21
+ }));
22
+ }
23
+ function runEmbedTimeout(cmd, start, streamOutput) {
24
+ const trimmed = (cmd.run ?? '').trim();
25
+ const lower = trimmed.toLowerCase();
26
+ if (!lower.startsWith('timeout ') && !lower.startsWith('timieout '))
27
+ return null;
28
+ const rest = lower.startsWith('timieout ') ? trimmed.slice(9).trim() : trimmed.slice(8).trim();
29
+ const seconds = Number.parseFloat(rest);
30
+ if (Number.isNaN(seconds) || seconds < 0)
31
+ return null;
32
+ const totalMs = Math.floor(seconds * 1000);
33
+ const stdin = process.stdin;
34
+ const useKeyboard = Boolean(stdin.isTTY);
35
+ const previousRawMode = useKeyboard ? stdin.isRaw : false;
36
+ const startedAt = Date.now();
37
+ return new Promise((resolve) => {
38
+ let finished = false;
39
+ let timer;
40
+ let tick;
41
+ let lastPrintedSeconds = -1;
42
+ let stoppedByKey = false;
43
+ const cleanup = () => {
44
+ if (timer)
45
+ clearTimeout(timer);
46
+ if (tick)
47
+ clearInterval(tick);
48
+ if (useKeyboard) {
49
+ try {
50
+ stdin.off('data', onData);
51
+ if (stdin.isTTY)
52
+ stdin.setRawMode(previousRawMode);
53
+ stdin.pause();
54
+ }
55
+ catch {
56
+ /* ignore */
57
+ }
58
+ }
59
+ };
60
+ const renderRemaining = () => {
61
+ if (!streamOutput)
62
+ return;
63
+ const elapsed = Date.now() - startedAt;
64
+ const leftMs = Math.max(0, totalMs - elapsed);
65
+ const leftSeconds = Math.ceil(leftMs / 1000);
66
+ if (leftSeconds === lastPrintedSeconds)
67
+ return;
68
+ lastPrintedSeconds = leftSeconds;
69
+ process.stdout.write(`\r[timeout] 剩余 ${leftSeconds}s,按任意键可跳过...`);
70
+ };
71
+ const done = (byKey) => {
72
+ if (finished)
73
+ return;
74
+ finished = true;
75
+ stoppedByKey = byKey;
76
+ cleanup();
77
+ if (streamOutput) {
78
+ const endText = byKey ? '检测到按键,提前结束等待。' : '等待超时结束。';
79
+ process.stdout.write(`\r[timeout] ${endText} \n`);
80
+ }
81
+ resolve({
82
+ kind: CommandKind.Embed,
83
+ description: cmd.description ?? `timeout ${seconds}s`,
84
+ success: true,
85
+ exitCode: 0,
86
+ stdout: stoppedByKey ? 'stopped_by_key' : 'timeout_elapsed',
87
+ stderr: '',
88
+ durationMs: Date.now() - start,
89
+ });
90
+ };
91
+ const onData = (_data) => done(true);
92
+ renderRemaining();
93
+ tick = setInterval(renderRemaining, 200);
94
+ timer = setTimeout(() => done(false), totalMs);
95
+ if (useKeyboard) {
96
+ try {
97
+ stdin.setRawMode(true);
98
+ stdin.resume();
99
+ stdin.on('data', onData);
100
+ }
101
+ catch {
102
+ /* ignore */
103
+ }
104
+ }
105
+ });
106
+ }
107
+ export class EmbedCommandRunner {
108
+ canRun(cmd) {
109
+ return cmd.kind === CommandKind.Embed;
110
+ }
111
+ async execute(cmd, options) {
112
+ const sleepResult = runEmbedSleep(cmd, options.start);
113
+ if (sleepResult)
114
+ return sleepResult;
115
+ const timeoutResult = runEmbedTimeout(cmd, options.start, options.streamOutput);
116
+ if (timeoutResult)
117
+ return timeoutResult;
118
+ return {
119
+ kind: CommandKind.Embed,
120
+ description: cmd.description ?? (cmd.run ?? ''),
121
+ success: false,
122
+ exitCode: null,
123
+ stdout: '',
124
+ stderr: `未知的内置命令: ${cmd.run}`,
125
+ durationMs: Date.now() - options.start,
126
+ };
127
+ }
128
+ }
129
+ //# sourceMappingURL=embedRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedRunner.js","sourceRoot":"","sources":["../../../src/runners/embedRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { ShellCommandRunner } from './shellRunner.js';
2
+ export { EmbedCommandRunner } from './embedRunner.js';
3
+ export { BuiltinFunctionCommandRunner } from './builtinFunctionRunner.js';
4
+ export type { CommandRunner, RunnerExecuteOptions } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runners/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ShellCommandRunner } from './shellRunner.js';
2
+ export { EmbedCommandRunner } from './embedRunner.js';
3
+ export { BuiltinFunctionCommandRunner } from './builtinFunctionRunner.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runners/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CommandDef, CommandResult } from '../types.js';
2
+ import type { CommandRunner, RunnerExecuteOptions } from './types.js';
3
+ export declare class ShellCommandRunner implements CommandRunner {
4
+ private readonly kinds;
5
+ canRun(cmd: CommandDef): boolean;
6
+ execute(cmd: CommandDef, options: RunnerExecuteOptions): Promise<CommandResult>;
7
+ }
8
+ //# sourceMappingURL=shellRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellRunner.d.ts","sourceRoot":"","sources":["../../../src/runners/shellRunner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAoCtE,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAInB;IAEH,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAIhC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC;CA2GhF"}
@@ -0,0 +1,142 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { CommandKind } from '../types.js';
3
+ function isExitSuccess(code) {
4
+ return code === 0;
5
+ }
6
+ function getShellForKind(kind) {
7
+ if (kind === CommandKind.Windows)
8
+ return 'cmd.exe';
9
+ if (kind === CommandKind.Mac)
10
+ return '/bin/bash';
11
+ return process.env.SHELL ?? '/bin/bash';
12
+ }
13
+ function getShellArgs(kind, run) {
14
+ if (kind === CommandKind.Windows) {
15
+ return { command: 'cmd.exe', args: ['/c', run], scriptForLog: run };
16
+ }
17
+ const shell = getShellForKind(kind);
18
+ return { command: shell, args: ['-c', run], scriptForLog: run };
19
+ }
20
+ function normalizeCommandForSpawn(cmd) {
21
+ if (cmd.run != null) {
22
+ const { command, args, scriptForLog } = getShellArgs(cmd.kind, cmd.run);
23
+ return { command, args, displayText: scriptForLog };
24
+ }
25
+ const file = cmd.file;
26
+ if (!file)
27
+ throw new Error('CommandDef 必须提供 run 或 file');
28
+ const args = cmd.args ?? [];
29
+ return { command: file, args, displayText: [file, ...args].join(' ') };
30
+ }
31
+ export class ShellCommandRunner {
32
+ kinds = new Set([
33
+ CommandKind.Linux,
34
+ CommandKind.Mac,
35
+ CommandKind.Windows,
36
+ ]);
37
+ canRun(cmd) {
38
+ return this.kinds.has(cmd.kind);
39
+ }
40
+ execute(cmd, options) {
41
+ const { command, args, displayText } = normalizeCommandForSpawn(cmd);
42
+ const cwd = cmd.cwd ?? process.cwd();
43
+ const shouldCaptureOutput = Boolean(cmd.captureToVar);
44
+ if (cmd.background && options.registerBackgroundProcess) {
45
+ const child = spawn(command, args, {
46
+ cwd,
47
+ shell: false,
48
+ stdio: [
49
+ 'ignore',
50
+ options.streamOutput ? 'inherit' : 'ignore',
51
+ options.streamOutput ? 'inherit' : 'ignore',
52
+ ],
53
+ });
54
+ options.registerBackgroundProcess(child);
55
+ return Promise.resolve({
56
+ kind: cmd.kind,
57
+ description: cmd.description,
58
+ success: true,
59
+ exitCode: null,
60
+ stdout: '',
61
+ stderr: '',
62
+ durationMs: Date.now() - options.start,
63
+ });
64
+ }
65
+ // 不需要采集输出时,前台命令直接继承当前终端,保证实时输出体验。
66
+ if (options.streamOutput && !shouldCaptureOutput) {
67
+ return new Promise((resolve) => {
68
+ const child = spawn(command, args, {
69
+ cwd,
70
+ shell: false,
71
+ stdio: ['ignore', 'inherit', 'inherit'],
72
+ });
73
+ child.on('close', (code) => {
74
+ resolve({
75
+ kind: cmd.kind,
76
+ description: cmd.description ?? displayText,
77
+ success: isExitSuccess(code),
78
+ exitCode: code,
79
+ stdout: '',
80
+ stderr: '',
81
+ durationMs: Date.now() - options.start,
82
+ });
83
+ });
84
+ child.on('error', (err) => {
85
+ resolve({
86
+ kind: cmd.kind,
87
+ description: cmd.description ?? displayText,
88
+ success: false,
89
+ exitCode: null,
90
+ stdout: '',
91
+ stderr: err.message,
92
+ durationMs: Date.now() - options.start,
93
+ });
94
+ });
95
+ });
96
+ }
97
+ return new Promise((resolve) => {
98
+ const child = spawn(command, args, {
99
+ cwd,
100
+ shell: false,
101
+ stdio: ['ignore', 'pipe', 'pipe'],
102
+ });
103
+ let stdout = '';
104
+ let stderr = '';
105
+ child.stdout?.on('data', (d) => {
106
+ const s = d.toString();
107
+ stdout += s;
108
+ if (options.streamOutput)
109
+ process.stdout.write(s);
110
+ });
111
+ child.stderr?.on('data', (d) => {
112
+ const s = d.toString();
113
+ stderr += s;
114
+ if (options.streamOutput)
115
+ process.stderr.write(s);
116
+ });
117
+ child.on('close', (code) => {
118
+ resolve({
119
+ kind: cmd.kind,
120
+ description: cmd.description ?? displayText,
121
+ success: isExitSuccess(code),
122
+ exitCode: code,
123
+ stdout,
124
+ stderr,
125
+ durationMs: Date.now() - options.start,
126
+ });
127
+ });
128
+ child.on('error', (err) => {
129
+ resolve({
130
+ kind: cmd.kind,
131
+ description: cmd.description ?? displayText,
132
+ success: false,
133
+ exitCode: null,
134
+ stdout: '',
135
+ stderr: err.message,
136
+ durationMs: Date.now() - options.start,
137
+ });
138
+ });
139
+ });
140
+ }
141
+ }
142
+ //# sourceMappingURL=shellRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellRunner.js","sourceRoot":"","sources":["../../../src/runners/shellRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ import type { CommandContext, CommandDef, CommandResult } from '../types.js';
3
+ export interface RunnerExecuteOptions {
4
+ streamOutput: boolean;
5
+ registerBackgroundProcess?: (child: ChildProcess) => void;
6
+ commandContext: CommandContext;
7
+ start: number;
8
+ }
9
+ export interface CommandRunner {
10
+ canRun(cmd: CommandDef): boolean;
11
+ execute(cmd: CommandDef, options: RunnerExecuteOptions): Promise<CommandResult>;
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/runners/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1D,cAAc,EAAE,cAAc,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC;IACjC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACjF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/runners/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * 命令类型枚举:与系统平台或内置行为关联
3
+ * - linux: 仅在 Linux 下执行
4
+ * - mac: 仅在 macOS 下执行
5
+ * - windows: 仅在 Windows 下执行
6
+ * - embed: 内置命令(如 sleep),由执行器内部实现,全平台可用
7
+ * - builtin-function: 内置函数命令(JS/TS 函数),由执行器直接调用,全平台可用
8
+ */
9
+ export declare enum CommandKind {
10
+ Linux = "linux",
11
+ Mac = "mac",
12
+ Windows = "windows",
13
+ Embed = "embed",
14
+ BuiltinFunction = "builtin-function"
15
+ }
16
+ /**
17
+ * 根据当前系统类型返回对应的命令类型枚举
18
+ */
19
+ export declare function getCurrentPlatformKind(): CommandKind;
20
+ /**
21
+ * 单条命令定义
22
+ */
23
+ export interface CommandDef {
24
+ /** 命令类型 */
25
+ kind: CommandKind;
26
+ /** 命令描述(可选,用于日志) */
27
+ description?: string;
28
+ /** 要执行的命令或脚本内容(优先级高于 file+args) */
29
+ run?: string;
30
+ /** 可执行文件路径(当未提供 run 时生效) */
31
+ file?: string;
32
+ /**
33
+ * 内置函数(kind 为 builtin-function 时生效)
34
+ * - 返回 true / false 时:分别表示成功 / 失败(等价退出码 0 / 1)
35
+ * - 返回 void 时:视为成功
36
+ */
37
+ func?: (context: CommandContext) => boolean | void | Promise<boolean | void>;
38
+ /** 传给 file 的参数数组(当未提供 run 时生效) */
39
+ args?: string[];
40
+ /** 可选:工作目录,不填则使用当前目录 */
41
+ cwd?: string;
42
+ /** 为 true 时在后台运行,执行器不等待其结束即继续下一条;默认全部前台命令结束后会优雅结束后台进程;传 CLI --wait 则改为等到后台进程全部退出后再退出 */
43
+ background?: boolean;
44
+ /**
45
+ * 可选:将本条命令的输出写入上下文变量,供后续命令使用。
46
+ */
47
+ captureToVar?: CaptureToVarDef;
48
+ }
49
+ /**
50
+ * 命令执行上下文:用于在同一批次命令之间传递的变量。
51
+ * key 为变量名(仅建议使用字母/数字/下划线),value 为字符串值。
52
+ */
53
+ export type CommandContext = Record<string, string>;
54
+ /**
55
+ * 命令输出到上下文变量的映射规则。
56
+ *
57
+ * 使用方式示例:
58
+ * - 将整段 stdout 写入变量:
59
+ * { captureToVar: { name: 'foo' } }
60
+ * - 用正则从 stdout 中抽取一部分:
61
+ * { captureToVar: { name: 'pid', pattern: '^(\\d+)', groupIndex: 1 } }
62
+ */
63
+ export interface CaptureToVarDef {
64
+ /** 变量名 */
65
+ name: string;
66
+ /**
67
+ * 从哪一个输出源读取:
68
+ * - stdout:标准输出(默认)
69
+ * - stderr:标准错误输出
70
+ */
71
+ from?: 'stdout' | 'stderr';
72
+ /**
73
+ * 可选:用于从输出中提取变量值的正则表达式。
74
+ * - 若未提供,则使用整个输出(去除首尾空白)作为变量值。
75
+ * - 若提供,则默认使用第 1 个捕获组(groupIndex 默认为 1)。
76
+ */
77
+ pattern?: string;
78
+ /**
79
+ * 指定要取的捕获组下标,默认 1。
80
+ */
81
+ groupIndex?: number;
82
+ }
83
+ /**
84
+ * 命令执行结果
85
+ */
86
+ export interface CommandResult {
87
+ kind: CommandKind;
88
+ description?: string;
89
+ success: boolean;
90
+ exitCode: number | null;
91
+ stdout: string;
92
+ stderr: string;
93
+ durationMs: number;
94
+ }
95
+ /**
96
+ * 命令组:组名 -> 该组下的命令列表
97
+ */
98
+ export type Groups = Record<string, CommandDef[]>;
99
+ /**
100
+ * 执行配置
101
+ */
102
+ export interface RunOptions {
103
+ /** 是否在单条命令失败时停止后续命令 */
104
+ stopOnError?: boolean;
105
+ /** 是否静默(少输出) */
106
+ silent?: boolean;
107
+ /**
108
+ * 为 true 时:所有前台命令执行完后仍等待后台进程自然退出,再结束 CLI。
109
+ * 默认 false:前台全部结束后优雅终止后台进程并退出。
110
+ */
111
+ waitForBackground?: boolean;
112
+ /**
113
+ * 为 true 时忽略命令 kind 与当前系统的匹配关系,直接尝试执行全部命令。
114
+ * 该模式存在较高风险(例如在非目标平台执行失败),建议仅在明确知晓后果时使用。
115
+ */
116
+ ignorePlatform?: boolean;
117
+ /** 指定要执行的组名列表,按顺序执行;未指定时执行当前系统支持的所有命令 */
118
+ groups?: string[];
119
+ /** 每组命令之间的执行间隔(毫秒),默认无间隔;对重复执行的 group 也生效(每次重复后间隔) */
120
+ intervalMs?: number;
121
+ }
122
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,GAAG,QAAQ;IACX,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,eAAe,qBAAqB;CACrC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,WAAW,CAQpD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,oBAAoB;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7E,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uBAAuB;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,32 @@
1
+ import { platform } from 'node:os';
2
+ /**
3
+ * 命令类型枚举:与系统平台或内置行为关联
4
+ * - linux: 仅在 Linux 下执行
5
+ * - mac: 仅在 macOS 下执行
6
+ * - windows: 仅在 Windows 下执行
7
+ * - embed: 内置命令(如 sleep),由执行器内部实现,全平台可用
8
+ * - builtin-function: 内置函数命令(JS/TS 函数),由执行器直接调用,全平台可用
9
+ */
10
+ export var CommandKind;
11
+ (function (CommandKind) {
12
+ CommandKind["Linux"] = "linux";
13
+ CommandKind["Mac"] = "mac";
14
+ CommandKind["Windows"] = "windows";
15
+ CommandKind["Embed"] = "embed";
16
+ CommandKind["BuiltinFunction"] = "builtin-function";
17
+ })(CommandKind || (CommandKind = {}));
18
+ /**
19
+ * 根据当前系统类型返回对应的命令类型枚举
20
+ */
21
+ export function getCurrentPlatformKind() {
22
+ const p = platform();
23
+ if (p === 'win32')
24
+ return CommandKind.Windows;
25
+ if (p === 'darwin')
26
+ return CommandKind.Mac;
27
+ if (p === 'linux' || p === 'aix' || p === 'freebsd' || p === 'openbsd' || p === 'sunos') {
28
+ return CommandKind.Linux;
29
+ }
30
+ return CommandKind.Linux;
31
+ }
32
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,0BAAW,CAAA;IACX,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IACf,mDAAoC,CAAA;AACtC,CAAC,EANW,WAAW,KAAX,WAAW,QAMtB;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC,OAAO,CAAC;IAC9C,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC;IAC3C,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QACxF,OAAO,WAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IACD,OAAO,WAAW,CAAC,KAAK,CAAC;AAC3B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "snapshot-checker",
3
+ "version": "0.1.1",
4
+ "description": "CLI 工具:按顺序执行 bat / mac / shell 命令",
5
+ "type": "module",
6
+ "main": "dist/src/index.js",
7
+ "types": "dist/src/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/index.d.ts",
11
+ "import": "./dist/src/index.js",
12
+ "default": "./dist/src/index.js"
13
+ },
14
+ "./commands/*": {
15
+ "types": "./dist/commands/*.d.ts",
16
+ "import": "./dist/commands/*.js",
17
+ "default": "./dist/commands/*.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md",
23
+ "package.json"
24
+ ],
25
+ "bin": {
26
+ "snapshot-checker": "dist/src/cli.js"
27
+ },
28
+ "scripts": {
29
+ "clean": "rimraf dist",
30
+ "build": "tsc",
31
+ "prepublishOnly": "npm run build",
32
+ "start": "node dist/src/cli.js",
33
+ "dev": "tsx src/cli.ts"
34
+ },
35
+ "keywords": [
36
+ "cli",
37
+ "batch",
38
+ "shell",
39
+ "commands"
40
+ ],
41
+ "author": "",
42
+ "license": "MIT",
43
+ "devDependencies": {
44
+ "@types/node": "^20.10.0",
45
+ "rimraf": "^6.0.1",
46
+ "tsx": "^4.7.0",
47
+ "typescript": "^5.3.0"
48
+ },
49
+ "dependencies": {
50
+ "commander": "^12.0.0"
51
+ },
52
+ "engines": {
53
+ "node": ">=18"
54
+ }
55
+ }