snapshot-checker 0.2.2 → 0.4.0
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/README.md +103 -343
- package/dist/commands/forkall.d.ts +4 -12
- package/dist/commands/forkall.d.ts.map +1 -1
- package/dist/commands/forkall.js +46 -23
- package/dist/commands/forkall.js.map +1 -1
- package/dist/commands/report.d.ts +9 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +153 -32
- package/dist/commands/report.js.map +1 -1
- package/dist/demos/context-demo.d.ts +10 -0
- package/dist/demos/context-demo.d.ts.map +1 -0
- package/dist/{commands/context_demo.js → demos/context-demo.js} +15 -18
- package/dist/demos/context-demo.js.map +1 -0
- package/dist/{commands → demos}/mac-example.d.ts +1 -3
- package/dist/demos/mac-example.d.ts.map +1 -0
- package/dist/{commands → demos}/mac-example.js +2 -4
- package/dist/demos/mac-example.js.map +1 -0
- package/dist/{commands/timeout_demo.d.ts → demos/timeout-demo.d.ts} +2 -2
- package/dist/demos/timeout-demo.d.ts.map +1 -0
- package/dist/demos/timeout-demo.js +35 -0
- package/dist/demos/timeout-demo.js.map +1 -0
- package/dist/src/cli.js +209 -169
- package/dist/src/cli.js.map +1 -1
- package/dist/src/executor.d.ts +1 -3
- package/dist/src/executor.d.ts.map +1 -1
- package/dist/src/executor.js +1 -3
- package/dist/src/executor.js.map +1 -1
- package/dist/src/groupSpecs.d.ts +1 -4
- package/dist/src/groupSpecs.d.ts.map +1 -1
- package/dist/src/groupSpecs.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/{common_groups.d.ts → presets.d.ts} +24 -2
- package/dist/src/lib/presets.d.ts.map +1 -0
- package/dist/src/lib/{common_groups.js → presets.js} +73 -24
- package/dist/src/lib/presets.js.map +1 -0
- package/dist/src/lib/{programmatic.d.ts → scenario.d.ts} +9 -11
- package/dist/src/lib/scenario.d.ts.map +1 -0
- package/dist/src/lib/{programmatic.js → scenario.js} +6 -10
- package/dist/src/lib/scenario.js.map +1 -0
- package/dist/src/logger.d.ts +23 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +92 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/runCommand.d.ts +27 -35
- package/dist/src/runCommand.d.ts.map +1 -1
- package/dist/src/runCommand.js +81 -70
- package/dist/src/runCommand.js.map +1 -1
- package/dist/src/runGroups.d.ts +6 -12
- package/dist/src/runGroups.d.ts.map +1 -1
- package/dist/src/runGroups.js +14 -19
- package/dist/src/runGroups.js.map +1 -1
- package/dist/src/runners/builtinFunctionRunner.d.ts +1 -0
- package/dist/src/runners/builtinFunctionRunner.d.ts.map +1 -1
- package/dist/src/runners/builtinFunctionRunner.js +5 -12
- package/dist/src/runners/builtinFunctionRunner.js.map +1 -1
- package/dist/src/runners/embedRunner.d.ts +1 -0
- package/dist/src/runners/embedRunner.d.ts.map +1 -1
- package/dist/src/runners/embedRunner.js +5 -1
- package/dist/src/runners/embedRunner.js.map +1 -1
- package/dist/src/runners/shellRunner.d.ts +1 -0
- package/dist/src/runners/shellRunner.d.ts.map +1 -1
- package/dist/src/runners/shellRunner.js +40 -8
- package/dist/src/runners/shellRunner.js.map +1 -1
- package/dist/src/runners/types.d.ts +9 -0
- package/dist/src/runners/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +47 -77
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +37 -10
- package/dist/src/types.js.map +1 -1
- package/package.json +10 -3
- package/dist/commands/context_demo.d.ts +0 -18
- package/dist/commands/context_demo.d.ts.map +0 -1
- package/dist/commands/context_demo.js.map +0 -1
- package/dist/commands/mac-example.d.ts.map +0 -1
- package/dist/commands/mac-example.js.map +0 -1
- package/dist/commands/timeout_demo.d.ts.map +0 -1
- package/dist/commands/timeout_demo.js +0 -48
- package/dist/commands/timeout_demo.js.map +0 -1
- package/dist/src/lib/common_groups.d.ts.map +0 -1
- package/dist/src/lib/common_groups.js.map +0 -1
- package/dist/src/lib/foo.d.ts +0 -3
- package/dist/src/lib/foo.d.ts.map +0 -1
- package/dist/src/lib/foo.js +0 -7
- package/dist/src/lib/foo.js.map +0 -1
- package/dist/src/lib/programmatic.d.ts.map +0 -1
- package/dist/src/lib/programmatic.js.map +0 -1
- package/dist/src/lib/trace_formatter.d.ts +0 -9
- package/dist/src/lib/trace_formatter.d.ts.map +0 -1
- package/dist/src/lib/trace_formatter.js +0 -148
- package/dist/src/lib/trace_formatter.js.map +0 -1
package/dist/commands/forkall.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { CommandKind } from "../src/types.js";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { existsSync, mkdirSync } from "node:fs";
|
|
4
|
-
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, } from "../src/lib/
|
|
4
|
+
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, } from "../src/lib/presets.js";
|
|
5
|
+
import { logger } from "../src/logger.js";
|
|
5
6
|
/**
|
|
6
|
-
* forkall
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 作为 npm 包被外部项目引用时:
|
|
10
|
-
* import * as forkall from 'snapshot-checker/commands/forkall';
|
|
11
|
-
* resolveScenario(forkall, { app, eventPath, ... })
|
|
12
|
-
* 完整示例见 demos/consumer-app。
|
|
7
|
+
* forkall 场景占位;实际命令由 {@link applyOptions} 按 CLI 注入。
|
|
8
|
+
* 包消费方:`import * as forkall from 'snapshot-checker/commands/forkall'` 后配合 `resolveScenario`;示例见 `demos/consumer-app`。
|
|
13
9
|
*/
|
|
10
|
+
/** 输出根目录下中间文件目录名(与 report 一致;不含 dump_stack*) */
|
|
11
|
+
const WORKSPACE_SUBDIR = "workspace";
|
|
14
12
|
export const groups = {};
|
|
15
13
|
export const defaultGroupOrder = [
|
|
16
14
|
"reboot",
|
|
@@ -60,6 +58,14 @@ export const options = [
|
|
|
60
58
|
description: "trace 事件格式版本(默认 default)",
|
|
61
59
|
defaultValue: "default",
|
|
62
60
|
},
|
|
61
|
+
{
|
|
62
|
+
flags: "--skip-perf-dedupe",
|
|
63
|
+
description: "跳过 perf 解码后的 compare 去重(dedupePerfData)",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
flags: "--drop-failed-samples",
|
|
67
|
+
description: "解码 perf 时丢弃「有 raw 但无对应 trace 解析器」的样本(decodePerfRawData dropFailedSamples);库会输出丢弃数量日志",
|
|
68
|
+
},
|
|
63
69
|
];
|
|
64
70
|
function buildRebootGroup(input) {
|
|
65
71
|
const { mode, eventPath, defaultTimeout } = input;
|
|
@@ -132,12 +138,12 @@ function buildMonitorGroup(input) {
|
|
|
132
138
|
func: (ctx) => {
|
|
133
139
|
const apppoolPids = ctx.get("apppool_pids");
|
|
134
140
|
if (!apppoolPids) {
|
|
135
|
-
|
|
141
|
+
logger.warn("[提取检测目标信息] apppool_pids 缺失或不是字符串,跳过处理");
|
|
136
142
|
return false;
|
|
137
143
|
}
|
|
138
144
|
const monitorTarget = apppoolPids.split(/\s+/).join(",");
|
|
139
145
|
ctx.set("monitor_target", monitorTarget);
|
|
140
|
-
|
|
146
|
+
logger.info("提取检测目标: ", monitorTarget);
|
|
141
147
|
},
|
|
142
148
|
},
|
|
143
149
|
{
|
|
@@ -174,25 +180,39 @@ function buildAnalysisPreDecodeCommands(input) {
|
|
|
174
180
|
: []),
|
|
175
181
|
];
|
|
176
182
|
}
|
|
177
|
-
/**
|
|
178
|
-
* 将 CLI 解析出来的参数应用到 forkall 场景,动态生成各阶段命令。
|
|
179
|
-
*/
|
|
183
|
+
/** 按 CLI 结果生成 reboot/monitor/collect/analysis 各阶段命令表 */
|
|
180
184
|
export function applyOptions(ctx) {
|
|
181
|
-
const { eventPath = "", app = "", systemSymbolFilePath = "", logKey = "pid", duration = "70", defaultTimeout = "90", bufferSize = "512000", mode = "monitor", outputDir = String.raw `.\output`, traceFormatProfile = "default", } = ctx.options ?? {};
|
|
185
|
+
const { eventPath = "", app = "", systemSymbolFilePath = "", logKey = "pid", duration = "70", defaultTimeout = "90", bufferSize = "512000", mode = "monitor", outputDir = String.raw `.\output`, traceFormatProfile = "default", skipPerfDedupe = false, dropFailedSamples = false, dryRun = false, } = ctx.options ?? {};
|
|
182
186
|
const eventName = eventPath ? eventPath.replace(/\//g, ":") : "";
|
|
183
187
|
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
184
188
|
const outputDirNormalized = path.normalize(outputDir);
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
189
|
+
const workspaceDir = path.join(outputDirNormalized, WORKSPACE_SUBDIR);
|
|
190
|
+
const workspaceDirNormalized = path.normalize(workspaceDir);
|
|
191
|
+
const workspaceDirWithSep = workspaceDirNormalized.endsWith(path.sep)
|
|
192
|
+
? workspaceDirNormalized
|
|
193
|
+
: `${workspaceDirNormalized}${path.sep}`;
|
|
194
|
+
const perfTextDir = path.join(outputDirNormalized, "perf_txt");
|
|
195
|
+
const perfTextDirNormalized = path.normalize(perfTextDir);
|
|
196
|
+
const perfTextDirWithSep = perfTextDirNormalized.endsWith(path.sep)
|
|
197
|
+
? perfTextDirNormalized
|
|
198
|
+
: `${perfTextDirNormalized}${path.sep}`;
|
|
199
|
+
const snapshotLogFile = path.join(workspaceDirNormalized, "snapshot_log.txt");
|
|
200
|
+
const snapshotPerfFile = path.join(perfTextDirNormalized, "snapshot_perf.data.txt");
|
|
190
201
|
const dumpStackTxt = path.join(outputDirNormalized, "dump_stack.txt");
|
|
191
202
|
const dumpStackJson = path.join(outputDirNormalized, "dump_stack.json");
|
|
203
|
+
const dumpStackXlsx = path.join(outputDirNormalized, "dump_stack.xlsx");
|
|
192
204
|
const parserSystemStackScript = path.normalize(path.join(".", "tools", "host", "checker", "parse_system_stack.py"));
|
|
193
205
|
const startAppCommand = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
194
|
-
if (!
|
|
195
|
-
|
|
206
|
+
if (!dryRun) {
|
|
207
|
+
if (!existsSync(outputDirNormalized)) {
|
|
208
|
+
mkdirSync(outputDirNormalized, { recursive: true });
|
|
209
|
+
}
|
|
210
|
+
if (!existsSync(workspaceDirNormalized)) {
|
|
211
|
+
mkdirSync(workspaceDirNormalized, { recursive: true });
|
|
212
|
+
}
|
|
213
|
+
if (!existsSync(perfTextDirNormalized)) {
|
|
214
|
+
mkdirSync(perfTextDirNormalized, { recursive: true });
|
|
215
|
+
}
|
|
196
216
|
}
|
|
197
217
|
const rebootGroup = buildRebootGroup({ mode, eventPath, defaultTimeout });
|
|
198
218
|
const initEnvGroup = buildCommonInitEnvGroup({
|
|
@@ -215,8 +235,8 @@ export function applyOptions(ctx) {
|
|
|
215
235
|
});
|
|
216
236
|
const collectGroup = buildCommonCollectGroup({
|
|
217
237
|
checkStateCommand,
|
|
218
|
-
snapshotPerfReceiveDirWithSep:
|
|
219
|
-
outputDirWithSep,
|
|
238
|
+
snapshotPerfReceiveDirWithSep: perfTextDirWithSep,
|
|
239
|
+
outputDirWithSep: workspaceDirWithSep,
|
|
220
240
|
});
|
|
221
241
|
const analysisGroup = buildCommonAnalysisGroup({
|
|
222
242
|
app,
|
|
@@ -230,9 +250,12 @@ export function applyOptions(ctx) {
|
|
|
230
250
|
decodeInput: { inputFilePath: snapshotPerfFile },
|
|
231
251
|
dumpStackTxt,
|
|
232
252
|
dumpStackJson,
|
|
253
|
+
dumpStackXlsx,
|
|
233
254
|
traceFormatProfile,
|
|
234
255
|
decodeStageName: "风险调用栈数据分析",
|
|
235
256
|
missingInputMessage: "[风险调用栈数据分析] 输入文件缺失,跳过处理",
|
|
257
|
+
skipDedupePerfData: skipPerfDedupe,
|
|
258
|
+
dropFailedSamples,
|
|
236
259
|
});
|
|
237
260
|
const resultGroups = {
|
|
238
261
|
reboot: rebootGroup,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,
|
|
1
|
+
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Groups } from "../src/types.js";
|
|
2
|
+
/** report 场景占位;内容由 `applyOptions` 注入 */
|
|
2
3
|
export declare const groups: Groups;
|
|
3
4
|
export declare const defaultGroupOrder: string[];
|
|
4
5
|
export declare const options: ({
|
|
@@ -16,10 +17,18 @@ interface ForkallOptions {
|
|
|
16
17
|
sourcemapDir?: string;
|
|
17
18
|
logKey?: string;
|
|
18
19
|
duration?: string;
|
|
20
|
+
backtrackDelay?: string;
|
|
19
21
|
bufferSize?: string;
|
|
20
22
|
outputDir?: string;
|
|
21
23
|
traceFormatProfile?: string;
|
|
24
|
+
riskTargets?: string;
|
|
25
|
+
skipPerfDedupe?: boolean;
|
|
26
|
+
skipBacktrack?: boolean;
|
|
27
|
+
skipNonBacktrack?: boolean;
|
|
28
|
+
dropFailedSamples?: boolean;
|
|
29
|
+
dryRun?: boolean;
|
|
22
30
|
}
|
|
31
|
+
/** 注入 monitor/collect/analysis 流水线及风险目标等派生命令 */
|
|
23
32
|
export declare function applyOptions(ctx: {
|
|
24
33
|
groups: Groups;
|
|
25
34
|
defaultGroupOrder: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAW1E,wCAAwC;AACxC,eAAO,MAAM,MAAM,EAAE,MAAW,CAAC;AAEjC,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAKrC,CAAC;AA4CF,eAAO,MAAM,OAAO;;;;;;;;IA2DnB,CAAC;AAEF,UAAU,cAAc;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAyLD,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAuJlD"}
|
package/dist/commands/report.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { CommandKind } from "../src/types.js";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { existsSync, mkdirSync } from "node:fs";
|
|
4
|
-
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, selectFirstValidPerfInput, } from "../src/lib/
|
|
4
|
+
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, selectFirstValidPerfInput, } from "../src/lib/presets.js";
|
|
5
|
+
import { logger } from "../src/logger.js";
|
|
6
|
+
/** report 场景占位;内容由 `applyOptions` 注入 */
|
|
5
7
|
export const groups = {};
|
|
6
8
|
export const defaultGroupOrder = [
|
|
7
9
|
"reboot",
|
|
@@ -9,6 +11,29 @@ export const defaultGroupOrder = [
|
|
|
9
11
|
"collect",
|
|
10
12
|
"analysis",
|
|
11
13
|
];
|
|
14
|
+
const RISK_TARGET_DEFINITIONS = {
|
|
15
|
+
backtrack: {
|
|
16
|
+
key: "backtrack",
|
|
17
|
+
displayName: "失效回溯",
|
|
18
|
+
hitraceTag: "checkpoint_backtrack",
|
|
19
|
+
hiperfEvent: "checkpoint:vfs_snapshot_dump_monitor",
|
|
20
|
+
permissionPath: "/sys/kernel/tracing/events/checkpoint/vfs_snapshot_dump_monitor",
|
|
21
|
+
},
|
|
22
|
+
direct: {
|
|
23
|
+
key: "direct",
|
|
24
|
+
displayName: "直接失效",
|
|
25
|
+
hitraceTag: "checkpoint_direct",
|
|
26
|
+
hiperfEvent: "checkpoint:checkpoint_revoked",
|
|
27
|
+
permissionPath: "/sys/kernel/tracing/events/checkpoint/checkpoint_revoked",
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
const DEFAULT_RISK_TARGETS = Object.keys(RISK_TARGET_DEFINITIONS);
|
|
31
|
+
/** 与 {@link RISK_TARGET_DEFINITIONS} 同步:各 key 及展示名,供 CLI 与校验错误信息复用 */
|
|
32
|
+
const RISK_TARGETS_LABELLED_KEYS = Object.keys(RISK_TARGET_DEFINITIONS)
|
|
33
|
+
.map((k) => `${k}(${RISK_TARGET_DEFINITIONS[k].displayName})`)
|
|
34
|
+
.join("、");
|
|
35
|
+
/** `--risk-targets` 选项说明(随 {@link RISK_TARGET_DEFINITIONS} 自动更新) */
|
|
36
|
+
const RISK_TARGETS_CLI_DESCRIPTION = `风险抓取目标(逗号分隔:${RISK_TARGETS_LABELLED_KEYS};可用 all 表示全部;默认 all)`;
|
|
12
37
|
export const options = [
|
|
13
38
|
{ flags: "--app <app>", description: "应用名" },
|
|
14
39
|
{ flags: "--hstack-tool-path <path>", description: "hstack 工具地址" },
|
|
@@ -23,6 +48,11 @@ export const options = [
|
|
|
23
48
|
description: "采样持续时间(秒,默认 70)",
|
|
24
49
|
defaultValue: "70",
|
|
25
50
|
},
|
|
51
|
+
{
|
|
52
|
+
flags: "--backtrack-delay <seconds>",
|
|
53
|
+
description: "monitor 阶段「设备端操作提示与状态检测」后台命令的启动延迟(秒,默认 80;对应 backgroundDelayMs)",
|
|
54
|
+
defaultValue: "80",
|
|
55
|
+
},
|
|
26
56
|
{
|
|
27
57
|
flags: "--buffer-size <bytes>",
|
|
28
58
|
description: "缓冲区大小(字节,默认 512000)",
|
|
@@ -38,10 +68,59 @@ export const options = [
|
|
|
38
68
|
description: "trace 事件格式版本(默认 default)",
|
|
39
69
|
defaultValue: "default",
|
|
40
70
|
},
|
|
71
|
+
{
|
|
72
|
+
flags: "--risk-targets <targets>",
|
|
73
|
+
description: RISK_TARGETS_CLI_DESCRIPTION,
|
|
74
|
+
defaultValue: "all",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
flags: "--skip-perf-dedupe",
|
|
78
|
+
description: "跳过 perf 解码后的 compare 去重(dedupePerfData)",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
flags: "--skip-backtrack",
|
|
82
|
+
description: "跳过解码后的回溯关联(hmtrace-parser backtrackFS);未指定本选项且风险目标含失效回溯时会在解码后执行;不影响采集",
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
flags: "--skip-non-backtrack",
|
|
86
|
+
description: "回溯关联(backtrackFS)时过滤非 FS 的 checkpoint_revoked(等价 keepNonFsRevoked: false;默认保留)。未执行回溯关联时无效果",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
flags: "--drop-failed-samples",
|
|
90
|
+
description: "解码 perf 时丢弃「有 raw 但无对应 trace 解析器」的样本(decodePerfRawData dropFailedSamples);库会输出丢弃数量日志",
|
|
91
|
+
},
|
|
41
92
|
];
|
|
42
93
|
const PERF_INPUT_CONTEXT_KEY = "perf_input_file";
|
|
94
|
+
/** 与 forkall 一致:输出根目录下中间文件目录名(含日志、hitrace、perf.data、hstack 产物等,不含 dump_stack*) */
|
|
95
|
+
const WORKSPACE_SUBDIR = "workspace";
|
|
96
|
+
function parseRiskTargets(rawValue) {
|
|
97
|
+
if (!rawValue || rawValue.trim() === "" || rawValue.trim() === "all") {
|
|
98
|
+
return [...DEFAULT_RISK_TARGETS];
|
|
99
|
+
}
|
|
100
|
+
const entries = rawValue
|
|
101
|
+
.split(",")
|
|
102
|
+
.map((item) => item.trim().toLowerCase())
|
|
103
|
+
.filter(Boolean);
|
|
104
|
+
if (entries.length === 0) {
|
|
105
|
+
return [...DEFAULT_RISK_TARGETS];
|
|
106
|
+
}
|
|
107
|
+
const uniqueKeys = Array.from(new Set(entries));
|
|
108
|
+
if (uniqueKeys.includes("all")) {
|
|
109
|
+
return [...DEFAULT_RISK_TARGETS];
|
|
110
|
+
}
|
|
111
|
+
const invalidKeys = uniqueKeys.filter((key) => !(key in RISK_TARGET_DEFINITIONS));
|
|
112
|
+
if (invalidKeys.length > 0) {
|
|
113
|
+
throw new Error(`[风险抓取目标] 不支持的风险类型: ${invalidKeys.join(", ")}。可选值: all、${RISK_TARGETS_LABELLED_KEYS}`);
|
|
114
|
+
}
|
|
115
|
+
return uniqueKeys;
|
|
116
|
+
}
|
|
117
|
+
function buildPermissionCommands(targets) {
|
|
118
|
+
return targets.map((target) => `hdc shell "chmod 755 ${target.permissionPath} && chmod 666 ${target.permissionPath}/enable"`);
|
|
119
|
+
}
|
|
43
120
|
function buildMonitorGroup(input) {
|
|
44
|
-
const { logKey, bufferSize, duration, app, snapshotLogFile, startAppCommand, checkStateCommand, } = input;
|
|
121
|
+
const { logKey, bufferSize, duration, backgroundDelayMs, app, snapshotLogFile, startAppCommand, checkStateCommand, riskTargets, } = input;
|
|
122
|
+
const hitraceTags = riskTargets.map((target) => target.hitraceTag).join(" ");
|
|
123
|
+
const hiperfEvents = riskTargets.map((target) => target.hiperfEvent).join(",");
|
|
45
124
|
return [
|
|
46
125
|
{
|
|
47
126
|
kind: CommandKind.Windows,
|
|
@@ -62,24 +141,35 @@ function buildMonitorGroup(input) {
|
|
|
62
141
|
func: (ctx) => {
|
|
63
142
|
const apppoolPids = ctx.get("apppool_pids");
|
|
64
143
|
if (!apppoolPids) {
|
|
65
|
-
|
|
144
|
+
logger.warn("[提取检测目标信息] apppool_pids 缺失或不是字符串,跳过处理");
|
|
66
145
|
return false;
|
|
67
146
|
}
|
|
68
147
|
const monitorTarget = apppoolPids.split(/\s+/).join(",");
|
|
69
148
|
ctx.set("monitor_target", monitorTarget);
|
|
70
|
-
|
|
149
|
+
logger.info("提取检测目标: ", monitorTarget);
|
|
71
150
|
},
|
|
72
151
|
},
|
|
152
|
+
{
|
|
153
|
+
kind: CommandKind.Windows,
|
|
154
|
+
description: "在设备端输出操作提示并执行状态检测",
|
|
155
|
+
background: true,
|
|
156
|
+
backgroundDelayMs,
|
|
157
|
+
run: `hdc shell "echo '=== 请按测试要求在设备上完成操作(以下为状态检测输出)===' && ${checkStateCommand}"`,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
kind: CommandKind.Embed,
|
|
161
|
+
description: "等待 15 秒后开始收集风险事件数据",
|
|
162
|
+
run: "sleep 15",
|
|
163
|
+
},
|
|
73
164
|
{
|
|
74
165
|
kind: CommandKind.Windows,
|
|
75
166
|
description: "收集风险事件数据",
|
|
76
167
|
run: [
|
|
77
168
|
'hdc shell "',
|
|
78
|
-
`hitrace
|
|
79
|
-
`hiperf record -e
|
|
169
|
+
`hitrace ${hitraceTags} --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt & `,
|
|
170
|
+
`hiperf --much record -e ${hiperfEvents} --period 1 -s fp --clockid boottime --callchain-useronly --cpu-limit 100 -o /data/local/tmp/perf.data -p {{monitor_target}} -d ${duration} & `,
|
|
80
171
|
`sleep 1 && `,
|
|
81
172
|
app ? `${startAppCommand} && ` : "",
|
|
82
|
-
`${checkStateCommand} & `,
|
|
83
173
|
`wait && `,
|
|
84
174
|
`hiperf dump -i /data/local/tmp/perf.data -o /data/local/tmp/snapshot_perf.data.txt"`,
|
|
85
175
|
]
|
|
@@ -89,14 +179,14 @@ function buildMonitorGroup(input) {
|
|
|
89
179
|
];
|
|
90
180
|
}
|
|
91
181
|
function buildAnalysisPreDecodeCommands(input) {
|
|
92
|
-
const { snapshotPerfFile, parsedSnapshotPerfFile, hstackToolPathNormalized, perfTextDir,
|
|
182
|
+
const { snapshotPerfFile, parsedSnapshotPerfFile, hstackToolPathNormalized, perfTextDir, workspaceDirNormalized, sourcemapDirNormalized, } = input;
|
|
93
183
|
return [
|
|
94
184
|
...(hstackToolPathNormalized
|
|
95
185
|
? [
|
|
96
186
|
{
|
|
97
187
|
kind: CommandKind.Windows,
|
|
98
188
|
description: "解析采集结果",
|
|
99
|
-
run: `${hstackToolPathNormalized} -i ${perfTextDir} -o ${
|
|
189
|
+
run: `${hstackToolPathNormalized} -i ${perfTextDir} -o ${workspaceDirNormalized} -s ${sourcemapDirNormalized}`,
|
|
100
190
|
},
|
|
101
191
|
]
|
|
102
192
|
: [
|
|
@@ -104,7 +194,7 @@ function buildAnalysisPreDecodeCommands(input) {
|
|
|
104
194
|
kind: CommandKind.BuiltinFunction,
|
|
105
195
|
description: "未配置 hstack,跳过解析采集结果",
|
|
106
196
|
func: () => {
|
|
107
|
-
|
|
197
|
+
logger.warn("[解析采集结果] 未配置 hstack 工具,跳过 hstack 解析");
|
|
108
198
|
},
|
|
109
199
|
},
|
|
110
200
|
]),
|
|
@@ -117,17 +207,23 @@ function buildAnalysisPreDecodeCommands(input) {
|
|
|
117
207
|
: [snapshotPerfFile];
|
|
118
208
|
const { filePath, reason } = selectFirstValidPerfInput(candidates);
|
|
119
209
|
if (!filePath) {
|
|
120
|
-
|
|
210
|
+
logger.error(`[选择 perf 输入] ${reason},放弃后续解析`);
|
|
121
211
|
return false;
|
|
122
212
|
}
|
|
123
213
|
ctx.set(PERF_INPUT_CONTEXT_KEY, filePath);
|
|
124
|
-
|
|
214
|
+
logger.info(`[选择 perf 输入] 使用文件: ${filePath}`);
|
|
125
215
|
},
|
|
126
216
|
},
|
|
127
217
|
];
|
|
128
218
|
}
|
|
219
|
+
/** 注入 monitor/collect/analysis 流水线及风险目标等派生命令 */
|
|
129
220
|
export function applyOptions(ctx) {
|
|
130
|
-
const { app = "", hstackToolPath = "", sourcemapDir = "", logKey = "pid", duration = "70", bufferSize = "512000", outputDir = String.raw `.\output`, traceFormatProfile = "default", } = ctx.options ?? {};
|
|
221
|
+
const { app = "", hstackToolPath = "", sourcemapDir = "", logKey = "pid", duration = "70", backtrackDelay = "80", bufferSize = "512000", outputDir = String.raw `.\output`, traceFormatProfile = "default", riskTargets = "all", skipPerfDedupe = false, skipBacktrack = false, skipNonBacktrack = false, dropFailedSamples = false, dryRun = false, } = ctx.options ?? {};
|
|
222
|
+
const backtrackDelaySec = Number(backtrackDelay);
|
|
223
|
+
if (!Number.isFinite(backtrackDelaySec) || backtrackDelaySec < 0) {
|
|
224
|
+
throw new Error(`[--backtrack-delay] 无效的秒数: ${JSON.stringify(backtrackDelay)},需为非负有限数值`);
|
|
225
|
+
}
|
|
226
|
+
const backgroundDelayMs = Math.round(backtrackDelaySec * 1000);
|
|
131
227
|
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
132
228
|
const hstackToolPathNormalized = hstackToolPath
|
|
133
229
|
? path.normalize(hstackToolPath)
|
|
@@ -136,44 +232,58 @@ export function applyOptions(ctx) {
|
|
|
136
232
|
? path.normalize(sourcemapDir)
|
|
137
233
|
: "";
|
|
138
234
|
const outputDirNormalized = path.normalize(outputDir);
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
235
|
+
const workspaceDir = path.join(outputDirNormalized, WORKSPACE_SUBDIR);
|
|
236
|
+
const workspaceDirNormalized = path.normalize(workspaceDir);
|
|
237
|
+
const workspaceDirWithSep = workspaceDirNormalized.endsWith(path.sep)
|
|
238
|
+
? workspaceDirNormalized
|
|
239
|
+
: `${workspaceDirNormalized}${path.sep}`;
|
|
143
240
|
const perfTextDir = path.join(outputDirNormalized, "perf_txt");
|
|
144
|
-
const
|
|
145
|
-
const
|
|
241
|
+
const perfTextDirNormalized = path.normalize(perfTextDir);
|
|
242
|
+
const perfTextDirWithSep = perfTextDirNormalized.endsWith(path.sep)
|
|
243
|
+
? perfTextDirNormalized
|
|
244
|
+
: `${perfTextDirNormalized}${path.sep}`;
|
|
245
|
+
const selectedRiskTargets = parseRiskTargets(riskTargets).map((key) => RISK_TARGET_DEFINITIONS[key]);
|
|
246
|
+
const runBacktrackFS = !skipBacktrack &&
|
|
247
|
+
selectedRiskTargets.some((target) => target.key === "backtrack");
|
|
248
|
+
const snapshotLogFile = path.join(workspaceDirNormalized, "snapshot_log.txt");
|
|
249
|
+
const snapshotPerfFile = path.join(perfTextDirNormalized, "snapshot_perf.data.txt");
|
|
250
|
+
const parsedSnapshotPerfFile = path.join(workspaceDirNormalized, "_snapshot_perf.data.txt");
|
|
146
251
|
const dumpStackTxt = path.join(outputDirNormalized, "dump_stack.txt");
|
|
147
252
|
const dumpStackJson = path.join(outputDirNormalized, "dump_stack.json");
|
|
253
|
+
const dumpStackXlsx = path.join(outputDirNormalized, "dump_stack.xlsx");
|
|
148
254
|
const start_app_command = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
149
|
-
if (!
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
255
|
+
if (!dryRun) {
|
|
256
|
+
if (!existsSync(outputDirNormalized)) {
|
|
257
|
+
mkdirSync(outputDirNormalized, { recursive: true });
|
|
258
|
+
}
|
|
259
|
+
if (!existsSync(workspaceDirNormalized)) {
|
|
260
|
+
mkdirSync(workspaceDirNormalized, { recursive: true });
|
|
261
|
+
}
|
|
262
|
+
if (!existsSync(perfTextDirNormalized)) {
|
|
263
|
+
mkdirSync(perfTextDirNormalized, { recursive: true });
|
|
264
|
+
}
|
|
154
265
|
}
|
|
155
266
|
const initEnvGroup = buildCommonInitEnvGroup({
|
|
156
267
|
app,
|
|
157
268
|
snapshotLogFile,
|
|
158
269
|
checkStateCommand,
|
|
159
|
-
permissionCommands:
|
|
160
|
-
'hdc shell "chmod 755 /sys/kernel/tracing/events/snapshot/vfs_snapshot_dump_monitor && chmod 666 /sys/kernel/tracing/events/snapshot/vfs_snapshot_dump_monitor/enable"',
|
|
161
|
-
'hdc shell "chmod 755 /sys/kernel/tracing/events/snapshot/hmb_forkall_report_image_failure && chmod 666 /sys/kernel/tracing/events/snapshot/hmb_forkall_report_image_failure/enable"',
|
|
162
|
-
],
|
|
270
|
+
permissionCommands: buildPermissionCommands(selectedRiskTargets),
|
|
163
271
|
});
|
|
164
272
|
const monitorGroup = buildMonitorGroup({
|
|
165
273
|
logKey,
|
|
166
274
|
bufferSize,
|
|
167
275
|
duration,
|
|
276
|
+
backgroundDelayMs,
|
|
168
277
|
app,
|
|
169
278
|
snapshotLogFile,
|
|
170
279
|
startAppCommand: start_app_command,
|
|
171
280
|
checkStateCommand,
|
|
281
|
+
riskTargets: selectedRiskTargets,
|
|
172
282
|
});
|
|
173
283
|
const collectGroup = buildCommonCollectGroup({
|
|
174
284
|
checkStateCommand,
|
|
175
|
-
snapshotPerfReceiveDirWithSep:
|
|
176
|
-
outputDirWithSep,
|
|
285
|
+
snapshotPerfReceiveDirWithSep: perfTextDirWithSep,
|
|
286
|
+
outputDirWithSep: workspaceDirWithSep,
|
|
177
287
|
});
|
|
178
288
|
const analysisGroup = buildCommonAnalysisGroup({
|
|
179
289
|
app,
|
|
@@ -183,17 +293,28 @@ export function applyOptions(ctx) {
|
|
|
183
293
|
snapshotPerfFile,
|
|
184
294
|
parsedSnapshotPerfFile,
|
|
185
295
|
hstackToolPathNormalized,
|
|
186
|
-
perfTextDir,
|
|
187
|
-
|
|
296
|
+
perfTextDir: perfTextDirNormalized,
|
|
297
|
+
workspaceDirNormalized,
|
|
188
298
|
sourcemapDirNormalized,
|
|
189
299
|
}),
|
|
190
300
|
decodeInput: { inputContextKey: PERF_INPUT_CONTEXT_KEY },
|
|
191
301
|
dumpStackTxt,
|
|
192
302
|
dumpStackJson,
|
|
303
|
+
dumpStackXlsx,
|
|
193
304
|
traceFormatProfile,
|
|
194
305
|
decodeStageName: "镜像失效风险栈分析",
|
|
195
306
|
missingInputMessage: "[镜像失效风险栈分析] 未选择到可用 perf 输入文件,跳过处理",
|
|
307
|
+
skipDedupePerfData: skipPerfDedupe,
|
|
308
|
+
runBacktrackFS,
|
|
309
|
+
skipNonBacktrack,
|
|
310
|
+
dropFailedSamples,
|
|
196
311
|
});
|
|
312
|
+
logger.info(`[风险抓取目标] ${selectedRiskTargets.map((target) => target.displayName).join("、")}`);
|
|
313
|
+
logger.info(`[backtrack] ${!runBacktrackFS
|
|
314
|
+
? "已跳过后解码回溯关联"
|
|
315
|
+
: skipNonBacktrack
|
|
316
|
+
? "解码后将执行回溯关联(backtrackFS,非 FS revoked 不保留)"
|
|
317
|
+
: "解码后将执行回溯关联(backtrackFS,保留非 FS revoked)"}`);
|
|
197
318
|
const resultGroups = {
|
|
198
319
|
init: initEnvGroup,
|
|
199
320
|
monitor: monitorGroup,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Groups } from "../src/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* `CommandContext` 与跨组 `{{var}}` 演示。
|
|
4
|
+
*
|
|
5
|
+
* CLI:`npm run dev -- context-demo` / `node dist/cli.js context-demo`;别名 `context_demo`。
|
|
6
|
+
* 库用法:`snapshot-checker` + `snapshot-checker/demos/context-demo`,详 `demos/consumer-app`。
|
|
7
|
+
*/
|
|
8
|
+
export declare const groups: Groups;
|
|
9
|
+
export declare const defaultGroupOrder: string[];
|
|
10
|
+
//# sourceMappingURL=context-demo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-demo.d.ts","sourceRoot":"","sources":["../../demos/context-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAazB;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MA8CpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAKrC,CAAC"}
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import { CommandKind, getCurrentPlatformKind, } from "../src/types.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
function demoGreeting(user) {
|
|
3
|
+
return `demo says hi to ${user}`;
|
|
4
|
+
}
|
|
5
|
+
function demoTag(prefix) {
|
|
6
|
+
return `${prefix}:context-demo`;
|
|
7
|
+
}
|
|
8
|
+
/** 与非 macOS 主机对齐,以免整组被平台过滤 */
|
|
4
9
|
const kind = getCurrentPlatformKind();
|
|
5
10
|
/**
|
|
6
|
-
*
|
|
11
|
+
* `CommandContext` 与跨组 `{{var}}` 演示。
|
|
7
12
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 使用方式(构建后):
|
|
12
|
-
* node dist/cli.js context_demo
|
|
13
|
-
*
|
|
14
|
-
* 作为 npm 包被外部项目引用时:
|
|
15
|
-
* import { resolveScenario, runScenarioGroups } from 'snapshot-checker';
|
|
16
|
-
* import * as contextDemo from 'snapshot-checker/commands/context_demo';
|
|
17
|
-
* 完整示例见 demos/consumer-app(需先发布包并 npm install snapshot-checker)。
|
|
13
|
+
* CLI:`npm run dev -- context-demo` / `node dist/cli.js context-demo`;别名 `context_demo`。
|
|
14
|
+
* 库用法:`snapshot-checker` + `snapshot-checker/demos/context-demo`,详 `demos/consumer-app`。
|
|
18
15
|
*/
|
|
19
16
|
export const groups = {
|
|
20
17
|
getUser: [
|
|
@@ -37,17 +34,17 @@ export const groups = {
|
|
|
37
34
|
builtinFn: [
|
|
38
35
|
{
|
|
39
36
|
kind: CommandKind.BuiltinFunction,
|
|
40
|
-
description: "
|
|
37
|
+
description: "演示:在同文件内小工具函数写入上下文变量",
|
|
41
38
|
func: (ctx) => {
|
|
42
39
|
const user = ctx.get("user") ?? "unknown";
|
|
43
|
-
ctx.set("builtinTag",
|
|
44
|
-
ctx.set("
|
|
40
|
+
ctx.set("builtinTag", demoTag("context-demo"));
|
|
41
|
+
ctx.set("demoGreet", demoGreeting(user));
|
|
45
42
|
},
|
|
46
43
|
},
|
|
47
44
|
{
|
|
48
45
|
kind,
|
|
49
46
|
description: "读取内置函数写入的变量",
|
|
50
|
-
run: 'echo "{{builtinTag}} | {{
|
|
47
|
+
run: 'echo "{{builtinTag}} | {{demoGreet}}"',
|
|
51
48
|
},
|
|
52
49
|
],
|
|
53
50
|
builtinFail: [
|
|
@@ -69,4 +66,4 @@ export const defaultGroupOrder = [
|
|
|
69
66
|
"builtinFn",
|
|
70
67
|
"builtinFail",
|
|
71
68
|
];
|
|
72
|
-
//# sourceMappingURL=
|
|
69
|
+
//# sourceMappingURL=context-demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-demo.js","sourceRoot":"","sources":["../../demos/context-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC;AAEzB,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,mBAAmB,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,GAAG,MAAM,eAAe,CAAC;AAClC,CAAC;AAED,8BAA8B;AAC9B,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,OAAO,EAAE;QACP;YACE,IAAI;YACJ,WAAW,EAAE,oBAAoB;YACjC,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE;gBACZ,IAAI,EAAE,MAAM;aACb;SACF;KACF;IACD,KAAK,EAAE;QACL;YACE,IAAI;YACJ,WAAW,EAAE,eAAe;YAC5B,GAAG,EAAE,wBAAwB;SAC9B;KACF;IACD,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,CAAC,GAAmB,EAAE,EAAE;gBAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAS,MAAM,CAAC,IAAI,SAAS,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC/C,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;SACF;QACD;YACE,IAAI;YACJ,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,uCAAuC;SAC7C;KACF;IACD,WAAW,EAAE;QACX;YACE,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,WAAW,EAAE,uCAAuC;YACpD,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;SAClB;QACD;YACE,IAAI;YACJ,WAAW,EAAE,6BAA6B;YAC1C,GAAG,EAAE,qDAAqD;SAC3D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,SAAS;IACT,OAAO;IACP,WAAW;IACX,aAAa;CACd,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import type { Groups } from "../src/types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Mac 示例场景:仅在 macOS 下执行,接收 --app 参数,参数不为空时打印 app。
|
|
4
|
-
*/
|
|
2
|
+
/** 仅 macOS 执行;可选 `--app`,非空时附加打印步骤 */
|
|
5
3
|
export declare const groups: Groups;
|
|
6
4
|
export declare const defaultGroupOrder: string[];
|
|
7
5
|
export declare const options: {
|