snapshot-checker 0.8.3 → 0.8.7
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 +185 -48
- package/dist/src/cli.d.ts +10 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +78 -35
- package/dist/src/cli.js.map +1 -1
- package/dist/{commands → src/commands}/report-user.d.ts +1 -1
- package/dist/src/commands/report-user.d.ts.map +1 -0
- package/dist/{commands → src/commands}/report-user.js +2 -2
- package/dist/src/commands/report-user.js.map +1 -0
- package/dist/{commands → src/commands}/report.d.ts +1 -1
- package/dist/src/commands/report.d.ts.map +1 -0
- package/dist/{commands → src/commands}/report.js +2 -2
- package/dist/src/commands/report.js.map +1 -0
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/cli/env.d.ts +9 -0
- package/dist/src/lib/cli/env.d.ts.map +1 -0
- package/dist/src/lib/cli/env.js +25 -0
- package/dist/src/lib/cli/env.js.map +1 -0
- package/dist/src/lib/cli/errors.d.ts +13 -0
- package/dist/src/lib/cli/errors.d.ts.map +1 -0
- package/dist/src/lib/cli/errors.js +23 -0
- package/dist/src/lib/cli/errors.js.map +1 -0
- package/dist/src/lib/cli/fatal.d.ts +2 -0
- package/dist/src/lib/cli/fatal.d.ts.map +1 -0
- package/dist/src/lib/cli/fatal.js +15 -0
- package/dist/src/lib/cli/fatal.js.map +1 -0
- package/dist/src/lib/cli/global_options.d.ts +4 -0
- package/dist/src/lib/cli/global_options.d.ts.map +1 -0
- package/dist/src/lib/cli/global_options.js +27 -0
- package/dist/src/lib/cli/global_options.js.map +1 -0
- package/dist/src/lib/cli/output.d.ts +26 -0
- package/dist/src/lib/cli/output.d.ts.map +1 -0
- package/dist/src/lib/cli/output.js +83 -0
- package/dist/src/lib/cli/output.js.map +1 -0
- package/dist/src/lib/cli/pkg_runtime.d.ts +2 -0
- package/dist/src/lib/cli/pkg_runtime.d.ts.map +1 -0
- package/dist/src/lib/cli/pkg_runtime.js +4 -0
- package/dist/src/lib/cli/pkg_runtime.js.map +1 -0
- package/dist/src/lib/cli/shell_identifiers.d.ts +24 -0
- package/dist/src/lib/cli/shell_identifiers.d.ts.map +1 -0
- package/dist/src/lib/cli/shell_identifiers.js +67 -0
- package/dist/src/lib/cli/shell_identifiers.js.map +1 -0
- package/dist/src/lib/cli/shell_params.d.ts +25 -0
- package/dist/src/lib/cli/shell_params.d.ts.map +1 -0
- package/dist/src/lib/cli/shell_params.js +61 -0
- package/dist/src/lib/cli/shell_params.js.map +1 -0
- package/dist/src/lib/cli/validation.d.ts +8 -0
- package/dist/src/lib/cli/validation.d.ts.map +1 -0
- package/dist/src/lib/cli/validation.js +44 -0
- package/dist/src/lib/cli/validation.js.map +1 -0
- package/dist/src/lib/{version.d.ts → cli/version.d.ts} +6 -2
- package/dist/src/lib/cli/version.d.ts.map +1 -0
- package/dist/src/lib/{version.js → cli/version.js} +25 -6
- package/dist/src/lib/cli/version.js.map +1 -0
- package/dist/src/lib/command_suite/globals.d.ts +8 -0
- package/dist/src/lib/command_suite/globals.d.ts.map +1 -0
- package/dist/src/lib/{scenario_globals.js → command_suite/globals.js} +4 -4
- package/dist/src/lib/command_suite/globals.js.map +1 -0
- package/dist/src/lib/command_suite/runner.d.ts +24 -0
- package/dist/src/lib/command_suite/runner.d.ts.map +1 -0
- package/dist/src/lib/command_suite/runner.js +27 -0
- package/dist/src/lib/command_suite/runner.js.map +1 -0
- package/dist/src/lib/execution/command_suite_modules.d.ts +5 -0
- package/dist/src/lib/execution/command_suite_modules.d.ts.map +1 -0
- package/dist/src/lib/execution/command_suite_modules.js +12 -0
- package/dist/src/lib/execution/command_suite_modules.js.map +1 -0
- package/dist/src/lib/execution/execution_error.d.ts +7 -0
- package/dist/src/lib/execution/execution_error.d.ts.map +1 -0
- package/dist/src/lib/execution/execution_error.js +13 -0
- package/dist/src/lib/execution/execution_error.js.map +1 -0
- package/dist/src/lib/execution/execution_paths.d.ts +5 -0
- package/dist/src/lib/execution/execution_paths.d.ts.map +1 -0
- package/dist/src/lib/execution/execution_paths.js +13 -0
- package/dist/src/lib/execution/execution_paths.js.map +1 -0
- package/dist/src/lib/execution/output_validate.d.ts +31 -0
- package/dist/src/lib/execution/output_validate.d.ts.map +1 -0
- package/dist/src/lib/execution/output_validate.js +119 -0
- package/dist/src/lib/execution/output_validate.js.map +1 -0
- package/dist/src/lib/execution/plan.d.ts +69 -0
- package/dist/src/lib/execution/plan.d.ts.map +1 -0
- package/dist/src/lib/execution/plan.js +347 -0
- package/dist/src/lib/execution/plan.js.map +1 -0
- package/dist/src/lib/execution/register_execution.d.ts +4 -0
- package/dist/src/lib/execution/register_execution.d.ts.map +1 -0
- package/dist/src/lib/execution/register_execution.js +151 -0
- package/dist/src/lib/execution/register_execution.js.map +1 -0
- package/dist/src/lib/execution/run_manifest.d.ts +67 -0
- package/dist/src/lib/execution/run_manifest.d.ts.map +1 -0
- package/dist/src/lib/execution/run_manifest.js +332 -0
- package/dist/src/lib/execution/run_manifest.js.map +1 -0
- package/dist/src/lib/preflight/preflight.d.ts.map +1 -0
- package/dist/src/lib/{preflight.js → preflight/preflight.js} +11 -15
- package/dist/src/lib/preflight/preflight.js.map +1 -0
- package/dist/src/lib/preflight/preflight_check.d.ts +36 -0
- package/dist/src/lib/preflight/preflight_check.d.ts.map +1 -0
- package/dist/src/lib/preflight/preflight_check.js +482 -0
- package/dist/src/lib/preflight/preflight_check.js.map +1 -0
- package/dist/src/lib/preflight/register_preflight.d.ts +4 -0
- package/dist/src/lib/preflight/register_preflight.d.ts.map +1 -0
- package/dist/src/lib/preflight/register_preflight.js +47 -0
- package/dist/src/lib/preflight/register_preflight.js.map +1 -0
- package/dist/src/lib/preflight/shell_exec.d.ts +12 -0
- package/dist/src/lib/preflight/shell_exec.d.ts.map +1 -0
- package/dist/src/lib/preflight/shell_exec.js +25 -0
- package/dist/src/lib/preflight/shell_exec.js.map +1 -0
- package/dist/src/lib/{app_spec.d.ts → report/app.d.ts} +1 -1
- package/dist/src/lib/{app_spec.d.ts.map → report/app.d.ts.map} +1 -1
- package/dist/src/lib/{app_spec.js → report/app.js} +1 -1
- package/dist/src/lib/{app_spec.js.map → report/app.js.map} +1 -1
- package/dist/src/lib/{report_scenario.d.ts → report/command_suite.d.ts} +14 -7
- package/dist/src/lib/report/command_suite.d.ts.map +1 -0
- package/dist/src/lib/{report_scenario.js → report/command_suite.js} +97 -41
- package/dist/src/lib/report/command_suite.js.map +1 -0
- package/dist/src/lib/{perf_decode.d.ts → report/decode.d.ts} +3 -3
- package/dist/src/lib/report/decode.d.ts.map +1 -0
- package/dist/src/lib/{perf_decode.js → report/decode.js} +5 -3
- package/dist/src/lib/report/decode.js.map +1 -0
- package/dist/src/lib/{format.d.ts → report/format.d.ts} +0 -2
- package/dist/src/lib/report/format.d.ts.map +1 -0
- package/dist/src/lib/{format.js → report/format.js} +2 -8
- package/dist/src/lib/report/format.js.map +1 -0
- package/dist/src/lib/report/hdc.d.ts.map +1 -0
- package/dist/src/lib/report/hdc.js.map +1 -0
- package/dist/src/lib/report/hiperf_compat.d.ts +14 -0
- package/dist/src/lib/report/hiperf_compat.d.ts.map +1 -0
- package/dist/src/lib/report/hiperf_compat.js +20 -0
- package/dist/src/lib/report/hiperf_compat.js.map +1 -0
- package/dist/src/lib/report/hiperf_raw_data_probe.d.ts +29 -0
- package/dist/src/lib/report/hiperf_raw_data_probe.d.ts.map +1 -0
- package/dist/src/lib/report/hiperf_raw_data_probe.js +93 -0
- package/dist/src/lib/report/hiperf_raw_data_probe.js.map +1 -0
- package/dist/src/lib/{host_commands.d.ts → report/host.d.ts} +2 -14
- package/dist/src/lib/report/host.d.ts.map +1 -0
- package/dist/src/lib/report/host.js +57 -0
- package/dist/src/lib/report/host.js.map +1 -0
- package/dist/src/lib/{paths.d.ts → report/paths.d.ts} +7 -4
- package/dist/src/lib/report/paths.d.ts.map +1 -0
- package/dist/src/lib/{paths.js → report/paths.js} +22 -12
- package/dist/src/lib/report/paths.js.map +1 -0
- package/dist/src/lib/{pipeline.d.ts → report/pipeline.d.ts} +3 -2
- package/dist/src/lib/report/pipeline.d.ts.map +1 -0
- package/dist/src/lib/{pipeline.js → report/pipeline.js} +2 -2
- package/dist/src/lib/report/pipeline.js.map +1 -0
- package/dist/src/lib/{presets.d.ts → report/presets.d.ts} +6 -6
- package/dist/src/lib/report/presets.d.ts.map +1 -0
- package/dist/src/lib/{presets.js → report/presets.js} +12 -9
- package/dist/src/lib/report/presets.js.map +1 -0
- package/dist/src/logger.d.ts +3 -3
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +17 -19
- package/dist/src/logger.js.map +1 -1
- package/package.json +11 -15
- package/skills/snapshot-checker/SKILL.md +137 -0
- package/skills/snapshot-checker/agents/openai.yaml +4 -0
- package/skills/snapshot-checker/references/capture_profile.md +74 -0
- package/skills/snapshot-checker/references/cli_options.md +87 -0
- package/skills/snapshot-checker/references/error_codes.md +80 -0
- package/skills/snapshot-checker/references/output_layout.md +42 -0
- package/skills/snapshot-checker/references/report_vs_report_user.md +35 -0
- package/dist/commands/forkall.d.ts +0 -44
- package/dist/commands/forkall.d.ts.map +0 -1
- package/dist/commands/forkall.js +0 -322
- package/dist/commands/forkall.js.map +0 -1
- package/dist/commands/report-user.d.ts.map +0 -1
- package/dist/commands/report-user.js.map +0 -1
- package/dist/commands/report.d.ts.map +0 -1
- package/dist/commands/report.js.map +0 -1
- package/dist/demos/context-demo.d.ts +0 -10
- package/dist/demos/context-demo.d.ts.map +0 -1
- package/dist/demos/context-demo.js +0 -69
- package/dist/demos/context-demo.js.map +0 -1
- package/dist/demos/mac-example.d.ts +0 -21
- package/dist/demos/mac-example.d.ts.map +0 -1
- package/dist/demos/mac-example.js +0 -37
- package/dist/demos/mac-example.js.map +0 -1
- package/dist/demos/timeout-demo.d.ts +0 -5
- package/dist/demos/timeout-demo.d.ts.map +0 -1
- package/dist/demos/timeout-demo.js +0 -35
- package/dist/demos/timeout-demo.js.map +0 -1
- package/dist/src/bin.d.ts +0 -3
- package/dist/src/bin.d.ts.map +0 -1
- package/dist/src/bin.js +0 -57
- package/dist/src/bin.js.map +0 -1
- package/dist/src/executor.d.ts +0 -5
- package/dist/src/executor.d.ts.map +0 -1
- package/dist/src/executor.js +0 -3
- package/dist/src/executor.js.map +0 -1
- package/dist/src/group_specs.d.ts +0 -2
- package/dist/src/group_specs.d.ts.map +0 -1
- package/dist/src/group_specs.js +0 -2
- package/dist/src/group_specs.js.map +0 -1
- package/dist/src/lib/format.d.ts.map +0 -1
- package/dist/src/lib/format.js.map +0 -1
- package/dist/src/lib/hdc.d.ts.map +0 -1
- package/dist/src/lib/hdc.js.map +0 -1
- package/dist/src/lib/host_commands.d.ts.map +0 -1
- package/dist/src/lib/host_commands.js +0 -108
- package/dist/src/lib/host_commands.js.map +0 -1
- package/dist/src/lib/paths.d.ts.map +0 -1
- package/dist/src/lib/paths.js.map +0 -1
- package/dist/src/lib/perf_decode.d.ts.map +0 -1
- package/dist/src/lib/perf_decode.js.map +0 -1
- package/dist/src/lib/pipeline.d.ts.map +0 -1
- package/dist/src/lib/pipeline.js.map +0 -1
- package/dist/src/lib/preflight.d.ts.map +0 -1
- package/dist/src/lib/preflight.js.map +0 -1
- package/dist/src/lib/presets.d.ts.map +0 -1
- package/dist/src/lib/presets.js.map +0 -1
- package/dist/src/lib/report_scenario.d.ts.map +0 -1
- package/dist/src/lib/report_scenario.js.map +0 -1
- package/dist/src/lib/scenario.d.ts +0 -22
- package/dist/src/lib/scenario.d.ts.map +0 -1
- package/dist/src/lib/scenario.js +0 -21
- package/dist/src/lib/scenario.js.map +0 -1
- package/dist/src/lib/scenario_globals.d.ts +0 -8
- package/dist/src/lib/scenario_globals.d.ts.map +0 -1
- package/dist/src/lib/scenario_globals.js.map +0 -1
- package/dist/src/lib/version.d.ts.map +0 -1
- package/dist/src/lib/version.js.map +0 -1
- package/dist/src/run_command.d.ts +0 -2
- package/dist/src/run_command.d.ts.map +0 -1
- package/dist/src/run_command.js +0 -2
- package/dist/src/run_command.js.map +0 -1
- package/dist/src/run_groups.d.ts +0 -2
- package/dist/src/run_groups.d.ts.map +0 -1
- package/dist/src/run_groups.js +0 -2
- package/dist/src/run_groups.js.map +0 -1
- package/dist/src/runners/index.d.ts +0 -2
- package/dist/src/runners/index.d.ts.map +0 -1
- package/dist/src/runners/index.js +0 -2
- package/dist/src/runners/index.js.map +0 -1
- package/dist/src/types.d.ts +0 -2
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- /package/dist/src/lib/{preflight.d.ts → preflight/preflight.d.ts} +0 -0
- /package/dist/src/lib/{hdc.d.ts → report/hdc.d.ts} +0 -0
- /package/dist/src/lib/{hdc.js → report/hdc.js} +0 -0
package/dist/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { executeOne, executeAll, finalizeBackgroundProcesses, getCommandsToRun, getCommandsToRunWithRepeat, getGroupChunks, runGroupChunks, isSupportedOnCurrentPlatform, } from "hmcommand-runner";
|
|
2
2
|
export { parseGroupSpecs } from "hmcommand-runner";
|
|
3
|
-
export { buildApplyOptionsInput,
|
|
4
|
-
export { createHdcCli } from "./lib/hdc.js";
|
|
5
|
-
export { CommandKind, createCommandContext, getCurrentPlatformKind } from "hmcommand-runner";
|
|
3
|
+
export { buildApplyOptionsInput, resolveCommandSuite, runCommandSuiteGroups, normalizeGroupCliArg, } from "./lib/command_suite/runner.js";
|
|
4
|
+
export { createHdcCli } from "./lib/report/hdc.js";
|
|
5
|
+
export { CommandKind, createCommandContext, getCurrentPlatformKind, } from "hmcommand-runner";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,4BAA4B,GAK7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,4BAA4B,GAK7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GAKrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** pkg 二进制构建时注入的版本环境变量名 */
|
|
2
|
+
export declare const HYPER_STARTUP_CHECKER_BUNDLED_VERSION_ENV = "HYPER_STARTUP_CHECKER_BUNDLED_VERSION";
|
|
3
|
+
/** CLI 默认日志级别环境变量名(优先于 `LOG_LEVEL`) */
|
|
4
|
+
export declare const HYPER_STARTUP_CHECKER_LOG_LEVEL_ENV = "HYPER_STARTUP_CHECKER_LOG_LEVEL";
|
|
5
|
+
/** 读取 pkg 嵌入版本;新变量优先,兼容旧 `SNAPSHOT_CHECKER_BUNDLED_VERSION`。 */
|
|
6
|
+
export declare function readHyperStartUpCheckerBundledVersionFromEnv(): string | undefined;
|
|
7
|
+
/** 读取默认日志级别 env;新变量优先,兼容旧 `SNAPSHOT_CHECKER_LOG_LEVEL`。 */
|
|
8
|
+
export declare function readHyperStartUpCheckerLogLevelFromEnv(): string | undefined;
|
|
9
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/env.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,eAAO,MAAM,yCAAyC,0CACb,CAAC;AAE1C,uCAAuC;AACvC,eAAO,MAAM,mCAAmC,oCAAoC,CAAC;AAKrF,gEAAgE;AAChE,wBAAgB,4CAA4C,IAAI,MAAM,GAAG,SAAS,CAOjF;AAED,2DAA2D;AAC3D,wBAAgB,sCAAsC,IAAI,MAAM,GAAG,SAAS,CAO3E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** pkg 二进制构建时注入的版本环境变量名 */
|
|
2
|
+
export const HYPER_STARTUP_CHECKER_BUNDLED_VERSION_ENV = "HYPER_STARTUP_CHECKER_BUNDLED_VERSION";
|
|
3
|
+
/** CLI 默认日志级别环境变量名(优先于 `LOG_LEVEL`) */
|
|
4
|
+
export const HYPER_STARTUP_CHECKER_LOG_LEVEL_ENV = "HYPER_STARTUP_CHECKER_LOG_LEVEL";
|
|
5
|
+
const LEGACY_SNAPSHOT_CHECKER_BUNDLED_VERSION_ENV = "SNAPSHOT_CHECKER_BUNDLED_VERSION";
|
|
6
|
+
const LEGACY_SNAPSHOT_CHECKER_LOG_LEVEL_ENV = "SNAPSHOT_CHECKER_LOG_LEVEL";
|
|
7
|
+
/** 读取 pkg 嵌入版本;新变量优先,兼容旧 `SNAPSHOT_CHECKER_BUNDLED_VERSION`。 */
|
|
8
|
+
export function readHyperStartUpCheckerBundledVersionFromEnv() {
|
|
9
|
+
const primary = process.env[HYPER_STARTUP_CHECKER_BUNDLED_VERSION_ENV]?.trim();
|
|
10
|
+
if (primary) {
|
|
11
|
+
return primary;
|
|
12
|
+
}
|
|
13
|
+
const legacy = process.env[LEGACY_SNAPSHOT_CHECKER_BUNDLED_VERSION_ENV]?.trim();
|
|
14
|
+
return legacy || undefined;
|
|
15
|
+
}
|
|
16
|
+
/** 读取默认日志级别 env;新变量优先,兼容旧 `SNAPSHOT_CHECKER_LOG_LEVEL`。 */
|
|
17
|
+
export function readHyperStartUpCheckerLogLevelFromEnv() {
|
|
18
|
+
const primary = process.env[HYPER_STARTUP_CHECKER_LOG_LEVEL_ENV]?.trim();
|
|
19
|
+
if (primary) {
|
|
20
|
+
return primary;
|
|
21
|
+
}
|
|
22
|
+
const legacy = process.env[LEGACY_SNAPSHOT_CHECKER_LOG_LEVEL_ENV]?.trim();
|
|
23
|
+
return legacy || undefined;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/lib/cli/env.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,yCAAyC,GACpD,uCAAuC,CAAC;AAE1C,uCAAuC;AACvC,MAAM,CAAC,MAAM,mCAAmC,GAAG,iCAAiC,CAAC;AAErF,MAAM,2CAA2C,GAAG,kCAAkC,CAAC;AACvF,MAAM,qCAAqC,GAAG,4BAA4B,CAAC;AAE3E,gEAAgE;AAChE,MAAM,UAAU,4CAA4C;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC/E,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,EAAE,IAAI,EAAE,CAAC;IAChF,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,sCAAsC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,IAAI,EAAE,CAAC;IACzE,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1E,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** CLI 参数/契约类错误;退出码 2,便于 Agent 与脚本区分执行失败(1)。 */
|
|
2
|
+
export declare class CliUsageError extends Error {
|
|
3
|
+
readonly exitCode = 2;
|
|
4
|
+
readonly code: string;
|
|
5
|
+
readonly details?: Record<string, unknown>;
|
|
6
|
+
constructor(code: string, message: string, details?: Record<string, unknown>);
|
|
7
|
+
}
|
|
8
|
+
export declare function isCliUsageError(error: unknown): error is CliUsageError;
|
|
9
|
+
export declare function formatCliFatalError(error: unknown): {
|
|
10
|
+
message: string;
|
|
11
|
+
exitCode: number;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/errors.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,QAAQ,KAAK;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE/B,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAM7E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAMA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** CLI 参数/契约类错误;退出码 2,便于 Agent 与脚本区分执行失败(1)。 */
|
|
2
|
+
export class CliUsageError extends Error {
|
|
3
|
+
exitCode = 2;
|
|
4
|
+
code;
|
|
5
|
+
details;
|
|
6
|
+
constructor(code, message, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "CliUsageError";
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.details = details;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function isCliUsageError(error) {
|
|
14
|
+
return error instanceof CliUsageError;
|
|
15
|
+
}
|
|
16
|
+
export function formatCliFatalError(error) {
|
|
17
|
+
if (isCliUsageError(error)) {
|
|
18
|
+
return { message: error.message, exitCode: error.exitCode };
|
|
19
|
+
}
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
return { message, exitCode: 1 };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/lib/cli/errors.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,QAAQ,GAAG,CAAC,CAAC;IACb,IAAI,CAAS;IACb,OAAO,CAA2B;IAE3C,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiC;QAC1E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,aAAa,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAIhD,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fatal.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/fatal.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,SAAS,MAAM,EAAiB,GACrC,IAAI,CAWN"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { formatCliFatalError } from "./errors.js";
|
|
2
|
+
import { resolveOutputFormatFromArgv, writeCliJsonError } from "./output.js";
|
|
3
|
+
export function handleCliFatalError(error, argv = process.argv) {
|
|
4
|
+
const outputFormat = resolveOutputFormatFromArgv(argv.slice(2));
|
|
5
|
+
const { exitCode } = formatCliFatalError(error);
|
|
6
|
+
if (outputFormat === "json") {
|
|
7
|
+
writeCliJsonError(error);
|
|
8
|
+
process.exitCode = exitCode;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const { message } = formatCliFatalError(error);
|
|
12
|
+
console.error(message);
|
|
13
|
+
process.exitCode = exitCode;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=fatal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fatal.js","sourceRoot":"","sources":["../../../../src/lib/cli/fatal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,UAAU,mBAAmB,CACjC,KAAc,EACd,OAA0B,OAAO,CAAC,IAAI;IAEtC,MAAM,YAAY,GAAG,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC5B,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CommandSuiteGlobalOptions } from "../command_suite/globals.js";
|
|
2
|
+
/** 从 argv 读取用户显式传入的根级全局选项(不含 Commander 默认值)。 */
|
|
3
|
+
export declare function readExplicitRootGlobalOptionsFromArgv(argv: readonly string[]): CommandSuiteGlobalOptions;
|
|
4
|
+
//# sourceMappingURL=global_options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global_options.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/global_options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,gDAAgD;AAChD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,yBAAyB,CAqB3B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** 从 argv 读取用户显式传入的根级全局选项(不含 Commander 默认值)。 */
|
|
2
|
+
export function readExplicitRootGlobalOptionsFromArgv(argv) {
|
|
3
|
+
const explicit = {};
|
|
4
|
+
for (let i = 0; i < argv.length; i++) {
|
|
5
|
+
const arg = argv[i];
|
|
6
|
+
if (arg === "--hdc-target") {
|
|
7
|
+
const next = argv[i + 1];
|
|
8
|
+
if (next !== undefined && !next.startsWith("-")) {
|
|
9
|
+
explicit.hdcTarget = next;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
else if (arg.startsWith("--hdc-target=")) {
|
|
13
|
+
explicit.hdcTarget = arg.slice("--hdc-target=".length);
|
|
14
|
+
}
|
|
15
|
+
else if (arg === "--parse-concurrency") {
|
|
16
|
+
const next = argv[i + 1];
|
|
17
|
+
if (next !== undefined && !next.startsWith("-")) {
|
|
18
|
+
explicit.parseConcurrency = next;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else if (arg.startsWith("--parse-concurrency=")) {
|
|
22
|
+
explicit.parseConcurrency = arg.slice("--parse-concurrency=".length);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return explicit;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=global_options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global_options.js","sourceRoot":"","sources":["../../../../src/lib/cli/global_options.ts"],"names":[],"mappings":"AAEA,gDAAgD;AAChD,MAAM,UAAU,qCAAqC,CACnD,IAAuB;IAEvB,MAAM,QAAQ,GAA8B,EAAE,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3C,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC;YACnC,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAClD,QAAQ,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CommandSuiteCliOutputFormat } from "hmcommand-runner/cli";
|
|
2
|
+
export type { CommandSuiteCliOutputFormat };
|
|
3
|
+
export declare const CLI_OUTPUT_FORMATS: readonly ["text", "json"];
|
|
4
|
+
export interface CliJsonErrorResult {
|
|
5
|
+
schema_version: string;
|
|
6
|
+
ok: false;
|
|
7
|
+
error: {
|
|
8
|
+
code: string;
|
|
9
|
+
message: string;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface ReportOutputArtifact {
|
|
14
|
+
path: string;
|
|
15
|
+
role: string;
|
|
16
|
+
exists: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** 从 argv 解析 `--output-format`(与 `--output-dir` 无关;支持 `--output-format=json`)。 */
|
|
19
|
+
export declare function resolveOutputFormatFromArgv(argv: readonly string[]): CommandSuiteCliOutputFormat;
|
|
20
|
+
/** 读取全局 `--output-format`;`--output-dir` 为采集产物目录,语义不同。 */
|
|
21
|
+
export declare function resolveOutputFormatFromCli(globals: Record<string, unknown>): CommandSuiteCliOutputFormat;
|
|
22
|
+
export declare function formatCliJsonError(error: unknown): CliJsonErrorResult;
|
|
23
|
+
export declare function writeCliJsonError(error: unknown): void;
|
|
24
|
+
/** report 场景成功执行后的主要产物路径。 */
|
|
25
|
+
export declare function collectReportOutputArtifacts(outputDirRaw: string | undefined): ReportOutputArtifact[];
|
|
26
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAKxE,YAAY,EAAE,2BAA2B,EAAE,CAAC;AAE5C,eAAO,MAAM,kBAAkB,2BAA4B,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,kFAAkF;AAClF,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,2BAA2B,CAkB7B;AAED,0DAA0D;AAC1D,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,2BAA2B,CAM7B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAqBrE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEtD;AAcD,6BAA6B;AAC7B,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,oBAAoB,EAAE,CAUxB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { COMMAND_SUITE_CLI_RESULT_SCHEMA_VERSION } from "hmcommand-runner/cli";
|
|
4
|
+
import { isCliUsageError } from "./errors.js";
|
|
5
|
+
import { normalizeCliOutputDir } from "../report/paths.js";
|
|
6
|
+
export const CLI_OUTPUT_FORMATS = ["text", "json"];
|
|
7
|
+
/** 从 argv 解析 `--output-format`(与 `--output-dir` 无关;支持 `--output-format=json`)。 */
|
|
8
|
+
export function resolveOutputFormatFromArgv(argv) {
|
|
9
|
+
for (let i = 0; i < argv.length; i++) {
|
|
10
|
+
const arg = argv[i];
|
|
11
|
+
if (arg === "--output-format") {
|
|
12
|
+
const next = argv[i + 1];
|
|
13
|
+
if (next === "json" || next === "text") {
|
|
14
|
+
return next;
|
|
15
|
+
}
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (arg.startsWith("--output-format=")) {
|
|
19
|
+
const value = arg.slice("--output-format=".length);
|
|
20
|
+
if (value === "json" || value === "text") {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return "text";
|
|
26
|
+
}
|
|
27
|
+
/** 读取全局 `--output-format`;`--output-dir` 为采集产物目录,语义不同。 */
|
|
28
|
+
export function resolveOutputFormatFromCli(globals) {
|
|
29
|
+
const raw = globals.outputFormat;
|
|
30
|
+
if (raw === "json" || raw === "text") {
|
|
31
|
+
return raw;
|
|
32
|
+
}
|
|
33
|
+
return "text";
|
|
34
|
+
}
|
|
35
|
+
export function formatCliJsonError(error) {
|
|
36
|
+
if (isCliUsageError(error)) {
|
|
37
|
+
return {
|
|
38
|
+
schema_version: COMMAND_SUITE_CLI_RESULT_SCHEMA_VERSION,
|
|
39
|
+
ok: false,
|
|
40
|
+
error: {
|
|
41
|
+
code: error.code,
|
|
42
|
+
message: error.message.split("\n")[0] ?? error.message,
|
|
43
|
+
...(error.details ?? {}),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
+
return {
|
|
49
|
+
schema_version: COMMAND_SUITE_CLI_RESULT_SCHEMA_VERSION,
|
|
50
|
+
ok: false,
|
|
51
|
+
error: {
|
|
52
|
+
code: "ERROR",
|
|
53
|
+
message,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function writeCliJsonError(error) {
|
|
58
|
+
process.stdout.write(`${JSON.stringify(formatCliJsonError(error))}\n`);
|
|
59
|
+
}
|
|
60
|
+
const REPORT_OUTPUT_ROLES = [
|
|
61
|
+
{ role: "dump_stack_json", basename: "dump_stack.json" },
|
|
62
|
+
{ role: "dump_stack_txt", basename: "dump_stack.txt" },
|
|
63
|
+
{ role: "dump_stack_xlsx", basename: "dump_stack.xlsx" },
|
|
64
|
+
{ role: "perf_txt", basename: path.join("perf_txt", "hyperstart_perf.data.txt") },
|
|
65
|
+
{ role: "workspace_log", basename: path.join("workspace", "hyperstart_log.txt") },
|
|
66
|
+
{
|
|
67
|
+
role: "workspace_hitrace",
|
|
68
|
+
basename: path.join("workspace", "hyperstart_hitrace.txt"),
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
/** report 场景成功执行后的主要产物路径。 */
|
|
72
|
+
export function collectReportOutputArtifacts(outputDirRaw) {
|
|
73
|
+
const outputDir = normalizeCliOutputDir(outputDirRaw);
|
|
74
|
+
return REPORT_OUTPUT_ROLES.map(({ role, basename }) => {
|
|
75
|
+
const filePath = path.join(outputDir, basename);
|
|
76
|
+
return {
|
|
77
|
+
role,
|
|
78
|
+
path: filePath,
|
|
79
|
+
exists: existsSync(filePath),
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../../src/lib/cli/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkg_runtime.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/pkg_runtime.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkg_runtime.js","sourceRoot":"","sources":["../../../../src/lib/cli/pkg_runtime.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAE,OAA8C,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AppSpec } from "../report/app.js";
|
|
2
|
+
/** 进入设备 Shell 命令的标识符白名单(bundleName、ability、logKey、hitrace tag 等)。 */
|
|
3
|
+
export declare const SHELL_IDENTIFIER_PATTERN: RegExp;
|
|
4
|
+
/** hdc -t 目标序列号;允许 IP:port 常见字符,仍禁止 Shell 元字符。 */
|
|
5
|
+
export declare const HDC_TARGET_PATTERN: RegExp;
|
|
6
|
+
export declare function isShellIdentifier(value: string): boolean;
|
|
7
|
+
export declare function isHdcTargetIdentifier(value: string): boolean;
|
|
8
|
+
/** 校验单个进入 Shell 的标识符;空字符串跳过。 */
|
|
9
|
+
export declare function assertShellIdentifier(field: string, value: string): void;
|
|
10
|
+
/** 校验 `--hdc-target`;空字符串跳过。 */
|
|
11
|
+
export declare function assertHdcTargetIdentifier(value: string): void;
|
|
12
|
+
/** 校验 `--app` 解析结果中的 bundleName / pickerName。 */
|
|
13
|
+
export declare function assertAppSpecShellIdentifiers(spec: AppSpec): void;
|
|
14
|
+
/** 校验逗号分隔的 hitrace tag 列表(每项独立白名单)。 */
|
|
15
|
+
export declare function assertHitraceTagsShellIdentifiers(raw: string | undefined): void;
|
|
16
|
+
/** report / report-user 进入 Shell 的 CLI 字符串参数统一校验。 */
|
|
17
|
+
export declare function assertReportShellIdentifiers(input: {
|
|
18
|
+
app?: string;
|
|
19
|
+
ability?: string;
|
|
20
|
+
logKey?: string;
|
|
21
|
+
hitraceTag?: string;
|
|
22
|
+
hdcTarget?: string;
|
|
23
|
+
}): void;
|
|
24
|
+
//# sourceMappingURL=shell_identifiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell_identifiers.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/shell_identifiers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,QAAqB,CAAC;AAE3D,kDAAkD;AAClD,eAAO,MAAM,kBAAkB,QAAuB,CAAC;AAEvD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AAcD,gCAAgC;AAChC,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQxE;AAED,gCAAgC;AAChC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAY7D;AAED,iDAAiD;AACjD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAKjE;AAED,uCAAuC;AACvC,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAU/E;AAED,qDAAqD;AACrD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAWP"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { CliUsageError } from "./errors.js";
|
|
2
|
+
/** 进入设备 Shell 命令的标识符白名单(bundleName、ability、logKey、hitrace tag 等)。 */
|
|
3
|
+
export const SHELL_IDENTIFIER_PATTERN = /^[A-Za-z0-9_.]+$/;
|
|
4
|
+
/** hdc -t 目标序列号;允许 IP:port 常见字符,仍禁止 Shell 元字符。 */
|
|
5
|
+
export const HDC_TARGET_PATTERN = /^[A-Za-z0-9_.:-]+$/;
|
|
6
|
+
export function isShellIdentifier(value) {
|
|
7
|
+
return SHELL_IDENTIFIER_PATTERN.test(value);
|
|
8
|
+
}
|
|
9
|
+
export function isHdcTargetIdentifier(value) {
|
|
10
|
+
return HDC_TARGET_PATTERN.test(value);
|
|
11
|
+
}
|
|
12
|
+
function throwInvalidIdentifier(field, value, patternLabel) {
|
|
13
|
+
throw new CliUsageError("INVALID_IDENTIFIER", `INVALID_IDENTIFIER: ${field} 含非法字符,仅允许 ${patternLabel},实际值: ${JSON.stringify(value)}`, { field, value });
|
|
14
|
+
}
|
|
15
|
+
/** 校验单个进入 Shell 的标识符;空字符串跳过。 */
|
|
16
|
+
export function assertShellIdentifier(field, value) {
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
if (!trimmed) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!isShellIdentifier(trimmed)) {
|
|
22
|
+
throwInvalidIdentifier(field, trimmed, "字母、数字、下划线与点号");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** 校验 `--hdc-target`;空字符串跳过。 */
|
|
26
|
+
export function assertHdcTargetIdentifier(value) {
|
|
27
|
+
const trimmed = value.trim();
|
|
28
|
+
if (!trimmed) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!isHdcTargetIdentifier(trimmed)) {
|
|
32
|
+
throwInvalidIdentifier("hdcTarget", trimmed, "字母、数字、下划线、点号、冒号与连字符");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** 校验 `--app` 解析结果中的 bundleName / pickerName。 */
|
|
36
|
+
export function assertAppSpecShellIdentifiers(spec) {
|
|
37
|
+
assertShellIdentifier("bundleName", spec.bundleName);
|
|
38
|
+
if (spec.pickerName) {
|
|
39
|
+
assertShellIdentifier("pickerName", spec.pickerName);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** 校验逗号分隔的 hitrace tag 列表(每项独立白名单)。 */
|
|
43
|
+
export function assertHitraceTagsShellIdentifiers(raw) {
|
|
44
|
+
if (!raw?.trim()) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
for (const tag of raw.split(",")) {
|
|
48
|
+
const trimmed = tag.trim();
|
|
49
|
+
if (trimmed) {
|
|
50
|
+
assertShellIdentifier("hitraceTag", trimmed);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** report / report-user 进入 Shell 的 CLI 字符串参数统一校验。 */
|
|
55
|
+
export function assertReportShellIdentifiers(input) {
|
|
56
|
+
if (input.hdcTarget) {
|
|
57
|
+
assertHdcTargetIdentifier(input.hdcTarget);
|
|
58
|
+
}
|
|
59
|
+
if (input.logKey) {
|
|
60
|
+
assertShellIdentifier("logKey", input.logKey);
|
|
61
|
+
}
|
|
62
|
+
assertHitraceTagsShellIdentifiers(input.hitraceTag);
|
|
63
|
+
if (input.ability) {
|
|
64
|
+
assertShellIdentifier("ability", input.ability);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=shell_identifiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell_identifiers.js","sourceRoot":"","sources":["../../../../src/lib/cli/shell_identifiers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,qEAAqE;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAE3D,kDAAkD;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAa,EACb,KAAa,EACb,YAAoB;IAEpB,MAAM,IAAI,aAAa,CACrB,oBAAoB,EACpB,uBAAuB,KAAK,cAAc,YAAY,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EACtF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;AACJ,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,KAAa;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,sBAAsB,CACpB,WAAW,EACX,OAAO,EACP,qBAAqB,CACtB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,6BAA6B,CAAC,IAAa;IACzD,qBAAqB,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,qBAAqB,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,iCAAiC,CAAC,GAAuB;IACvE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACZ,qBAAqB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,4BAA4B,CAAC,KAM5C;IACC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,yBAAyB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,iCAAiC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** 解析进入 Shell 的正整数 CLI 参数(仅接受纯数字字符串,拒绝注入片段)。 */
|
|
2
|
+
export declare function resolveShellPositiveInteger(field: string, raw: unknown, bounds: {
|
|
3
|
+
min: number;
|
|
4
|
+
max: number;
|
|
5
|
+
}): number;
|
|
6
|
+
export declare function resolveShellDurationSeconds(raw: unknown): number;
|
|
7
|
+
export declare function resolveShellBufferSize(raw: unknown): number;
|
|
8
|
+
/** 校验进入 Shell 或重定向的路径;空路径在 allowEmpty 时跳过。 */
|
|
9
|
+
export declare function assertShellSafeCliPath(field: string, raw: string | undefined, options?: {
|
|
10
|
+
allowEmpty?: boolean;
|
|
11
|
+
}): void;
|
|
12
|
+
/** 嵌入 Shell 命令字符串时对参数做引用(POSIX 双引号语义,与 JSON 字符串转义一致)。 */
|
|
13
|
+
export declare function quoteShellArgForCommand(arg: string): string;
|
|
14
|
+
/** report 场景数值与路径参数统一校验。 */
|
|
15
|
+
export declare function assertReportShellParams(input: {
|
|
16
|
+
duration?: unknown;
|
|
17
|
+
bufferSize?: unknown;
|
|
18
|
+
outputDir?: string;
|
|
19
|
+
hstackToolPath?: string;
|
|
20
|
+
sourcemapDir?: string;
|
|
21
|
+
}): {
|
|
22
|
+
durationSec: number;
|
|
23
|
+
bufferSizeBytes: number;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=shell_params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell_params.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/shell_params.ts"],"names":[],"mappings":"AAeA,gDAAgD;AAChD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnC,MAAM,CAUR;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEhE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAK3D;AAUD,8CAA8C;AAC9C,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,IAAI,CAWN;AAED,yDAAyD;AACzD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,4BAA4B;AAC5B,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAOnD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { CliUsageError } from "./errors.js";
|
|
2
|
+
/** 禁止出现在进入 Shell 命令的路径中的元字符(含 cmd/PowerShell 展开风险字符)。 */
|
|
3
|
+
const SHELL_UNSAFE_PATH_PATTERN = /[;&|$`<>()!"%\n\r\0]/;
|
|
4
|
+
const SHELL_SAFE_BARE_ARG_PATTERN = /^[A-Za-z0-9_./:@%-]+$/;
|
|
5
|
+
function throwInvalidNumeric(field, value, detail) {
|
|
6
|
+
throw new CliUsageError("INVALID_NUMERIC", `INVALID_NUMERIC: ${field} ${detail},实际值: ${JSON.stringify(value)}`, { field, value });
|
|
7
|
+
}
|
|
8
|
+
/** 解析进入 Shell 的正整数 CLI 参数(仅接受纯数字字符串,拒绝注入片段)。 */
|
|
9
|
+
export function resolveShellPositiveInteger(field, raw, bounds) {
|
|
10
|
+
const text = typeof raw === "number" ? String(raw) : String(raw ?? "").trim();
|
|
11
|
+
if (!/^\d+$/.test(text)) {
|
|
12
|
+
throwInvalidNumeric(field, raw, "必须为整数");
|
|
13
|
+
}
|
|
14
|
+
const value = Number(text);
|
|
15
|
+
if (!Number.isInteger(value) || value < bounds.min || value > bounds.max) {
|
|
16
|
+
throwInvalidNumeric(field, raw, `必须在 ${bounds.min}..${bounds.max} 范围内`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
export function resolveShellDurationSeconds(raw) {
|
|
21
|
+
return resolveShellPositiveInteger("duration", raw, { min: 1, max: 86_400 });
|
|
22
|
+
}
|
|
23
|
+
export function resolveShellBufferSize(raw) {
|
|
24
|
+
return resolveShellPositiveInteger("bufferSize", raw, {
|
|
25
|
+
min: 1_024,
|
|
26
|
+
max: 104_857_600,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function throwInvalidPath(field, value) {
|
|
30
|
+
throw new CliUsageError("INVALID_PATH", `INVALID_PATH: ${field} 含 Shell 元字符或控制字符,实际值: ${JSON.stringify(value)}`, { field, value });
|
|
31
|
+
}
|
|
32
|
+
/** 校验进入 Shell 或重定向的路径;空路径在 allowEmpty 时跳过。 */
|
|
33
|
+
export function assertShellSafeCliPath(field, raw, options) {
|
|
34
|
+
const trimmed = raw?.trim() ?? "";
|
|
35
|
+
if (!trimmed) {
|
|
36
|
+
if (options?.allowEmpty) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (SHELL_UNSAFE_PATH_PATTERN.test(trimmed)) {
|
|
42
|
+
throwInvalidPath(field, trimmed);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** 嵌入 Shell 命令字符串时对参数做引用(POSIX 双引号语义,与 JSON 字符串转义一致)。 */
|
|
46
|
+
export function quoteShellArgForCommand(arg) {
|
|
47
|
+
if (SHELL_SAFE_BARE_ARG_PATTERN.test(arg)) {
|
|
48
|
+
return arg;
|
|
49
|
+
}
|
|
50
|
+
return JSON.stringify(arg);
|
|
51
|
+
}
|
|
52
|
+
/** report 场景数值与路径参数统一校验。 */
|
|
53
|
+
export function assertReportShellParams(input) {
|
|
54
|
+
const durationSec = resolveShellDurationSeconds(input.duration ?? "70");
|
|
55
|
+
const bufferSizeBytes = resolveShellBufferSize(input.bufferSize ?? "512000");
|
|
56
|
+
assertShellSafeCliPath("outputDir", input.outputDir, { allowEmpty: true });
|
|
57
|
+
assertShellSafeCliPath("hstackToolPath", input.hstackToolPath, { allowEmpty: true });
|
|
58
|
+
assertShellSafeCliPath("sourcemapDir", input.sourcemapDir, { allowEmpty: true });
|
|
59
|
+
return { durationSec, bufferSizeBytes };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=shell_params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell_params.js","sourceRoot":"","sources":["../../../../src/lib/cli/shell_params.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ReportCommandSuiteVariant = "full" | "user";
|
|
2
|
+
/** report / report-user 要求非空 `--app`。 */
|
|
3
|
+
export declare function assertReportAppProvided(variant: ReportCommandSuiteVariant, app: string): void;
|
|
4
|
+
/** report-user 在提供 `--app` 后要求 `--ability`。 */
|
|
5
|
+
export declare function assertReportUserAbilityProvided(variant: ReportCommandSuiteVariant, ability: string): void;
|
|
6
|
+
/** 显式 `--group` 含未知名称时失败;未指定 group 时使用 defaultOrder,不报错。 */
|
|
7
|
+
export declare function assertKnownCommandGroups(groupRaw: unknown, defaultGroupOrder: readonly string[]): void;
|
|
8
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/validation.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,MAAM,CAAC;AAMxD,yCAAyC;AACzC,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,yBAAyB,EAClC,GAAG,EAAE,MAAM,GACV,IAAI,CAcN;AAED,+CAA+C;AAC/C,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,MAAM,GACd,IAAI,CAWN;AAED,4DAA4D;AAC5D,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EACjB,iBAAiB,EAAE,SAAS,MAAM,EAAE,GACnC,IAAI,CAoBN"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { normalizeGroupCliArg, parseGroupSpecs } from "hmcommand-runner";
|
|
2
|
+
import { CliUsageError } from "./errors.js";
|
|
3
|
+
import { SNAPSHOT_CHECKER_CLI_NAME } from "./version.js";
|
|
4
|
+
function commandSuiteCommandName(variant) {
|
|
5
|
+
return variant === "user" ? "report-user" : "report";
|
|
6
|
+
}
|
|
7
|
+
/** report / report-user 要求非空 `--app`。 */
|
|
8
|
+
export function assertReportAppProvided(variant, app) {
|
|
9
|
+
if (app.trim()) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const command = commandSuiteCommandName(variant);
|
|
13
|
+
const example = variant === "user"
|
|
14
|
+
? `${SNAPSHOT_CHECKER_CLI_NAME} ${command} --dry-run --app com.example.app --ability EntryAbility`
|
|
15
|
+
: `${SNAPSHOT_CHECKER_CLI_NAME} ${command} --dry-run --app com.example.app`;
|
|
16
|
+
throw new CliUsageError("ERROR_MISSING_APP", `ERROR_MISSING_APP: ${command} requires --app <bundle_name>.\nExample: ${example}`, { example });
|
|
17
|
+
}
|
|
18
|
+
/** report-user 在提供 `--app` 后要求 `--ability`。 */
|
|
19
|
+
export function assertReportUserAbilityProvided(variant, ability) {
|
|
20
|
+
if (variant !== "user" || ability.trim()) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
throw new CliUsageError("ERROR_MISSING_ABILITY", `ERROR_MISSING_ABILITY: report-user requires --ability <ability_name>.\nExample: ${SNAPSHOT_CHECKER_CLI_NAME} report-user --dry-run --app com.example.app --ability EntryAbility`, {
|
|
24
|
+
example: `${SNAPSHOT_CHECKER_CLI_NAME} report-user --dry-run --app com.example.app --ability EntryAbility`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** 显式 `--group` 含未知名称时失败;未指定 group 时使用 defaultOrder,不报错。 */
|
|
28
|
+
export function assertKnownCommandGroups(groupRaw, defaultGroupOrder) {
|
|
29
|
+
const groupSpecs = normalizeGroupCliArg(groupRaw);
|
|
30
|
+
if (groupSpecs === undefined) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const available = new Set(defaultGroupOrder);
|
|
34
|
+
const specs = parseGroupSpecs(groupSpecs, [...defaultGroupOrder]);
|
|
35
|
+
const unknownGroups = specs
|
|
36
|
+
.map((spec) => spec.name)
|
|
37
|
+
.filter((name) => !available.has(name));
|
|
38
|
+
if (unknownGroups.length === 0) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const label = unknownGroups.length === 1 ? unknownGroups[0] : unknownGroups.join(", ");
|
|
42
|
+
throw new CliUsageError("UNKNOWN_GROUP", `UNKNOWN_GROUP: Group '${label}' does not exist.\nAvailable groups: ${defaultGroupOrder.join(", ")}`, { available_groups: [...defaultGroupOrder] });
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/lib/cli/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAIzD,SAAS,uBAAuB,CAAC,OAAkC;IACjE,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,uBAAuB,CACrC,OAAkC,EAClC,GAAW;IAEX,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GACX,OAAO,KAAK,MAAM;QAChB,CAAC,CAAC,GAAG,yBAAyB,IAAI,OAAO,yDAAyD;QAClG,CAAC,CAAC,GAAG,yBAAyB,IAAI,OAAO,kCAAkC,CAAC;IAChF,MAAM,IAAI,aAAa,CACrB,mBAAmB,EACnB,sBAAsB,OAAO,4CAA4C,OAAO,EAAE,EAClF,EAAE,OAAO,EAAE,CACZ,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,+BAA+B,CAC7C,OAAkC,EAClC,OAAe;IAEf,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IACD,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,mFAAmF,yBAAyB,qEAAqE,EACjL;QACE,OAAO,EAAE,GAAG,yBAAyB,qEAAqE;KAC3G,CACF,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,wBAAwB,CACtC,QAAiB,EACjB,iBAAoC;IAEpC,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAyC,CAAC,CAAC;IACnF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,KAAK;SACxB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GACT,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,IAAI,aAAa,CACrB,eAAe,EACf,yBAAyB,KAAK,wCAAwC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACpG,EAAE,gBAAgB,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
/** 对外 CLI 命令名(保持稳定)。 */
|
|
2
|
+
export declare const SNAPSHOT_CHECKER_CLI_NAME = "snapshot-checker";
|
|
3
|
+
/** 对外 npm 包名(保持稳定)。 */
|
|
4
|
+
export declare const SNAPSHOT_CHECKER_PACKAGE_NAME = "snapshot-checker";
|
|
1
5
|
/** 从磁盘向上查找本包 `package.json`(`name === snapshot-checker`)。 */
|
|
2
|
-
export declare function
|
|
6
|
+
export declare function readHyperStartUpCheckerVersion(): string;
|
|
3
7
|
/**
|
|
4
|
-
* 将当前进程 argv 格式化为可复现的 CLI 命令行;识别本工具入口时以
|
|
8
|
+
* 将当前进程 argv 格式化为可复现的 CLI 命令行;识别本工具入口时以 {@link SNAPSHOT_CHECKER_CLI_NAME} 展示。
|
|
5
9
|
*/
|
|
6
10
|
export declare function formatInvocationCommandLine(argv?: readonly string[]): string;
|
|
7
11
|
/** checker.log 会话首行:`[snapshot-checker <version>] <command>` */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/version.ts"],"names":[],"mappings":"AAOA,wBAAwB;AACxB,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D,uBAAuB;AACvB,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE,6DAA6D;AAC7D,wBAAgB,8BAA8B,IAAI,MAAM,CA8BvD;AAoBD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,SAAS,MAAM,EAAiB,GACrC,MAAM,CAUR;AAED,gEAAgE;AAChE,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAET"}
|