refactor(qa): share mantis option helpers · openclaw/openclaw@21c9666
vincentkoc
·
2026-06-20
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
|
| 1 | +// Qa Lab plugin module implements shared Mantis option parsing helpers. |
| 2 | +export function trimToValue(value: string | undefined) { |
| 3 | +const trimmed = value?.trim(); |
| 4 | +return trimmed && trimmed.length > 0 ? trimmed : undefined; |
| 5 | +} |
| 6 | + |
| 7 | +export function isTruthyOptIn(value: string | undefined) { |
| 8 | +const normalized = value?.trim().toLowerCase(); |
| 9 | +return normalized === "1" || normalized === "true" || normalized === "yes"; |
| 10 | +} |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -2,6 +2,7 @@
|
2 | 2 | import { spawn, type SpawnOptions } from "node:child_process"; |
3 | 3 | import path from "node:path"; |
4 | 4 | import { pathExists } from "openclaw/plugin-sdk/security-runtime"; |
| 5 | +import { trimToValue } from "../mantis-options.runtime.js"; |
5 | 6 | |
6 | 7 | export type CommandResult = { |
7 | 8 | stderr: string; |
@@ -26,11 +27,6 @@ export type CrabboxInspect = {
|
26 | 27 | state?: string; |
27 | 28 | }; |
28 | 29 | |
29 | | -function trimToValue(value: string | undefined) { |
30 | | -const trimmed = value?.trim(); |
31 | | -return trimmed && trimmed.length > 0 ? trimmed : undefined; |
32 | | -} |
33 | | - |
34 | 30 | export async function defaultCommandRunner( |
35 | 31 | command: string, |
36 | 32 | args: readonly string[], |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -5,6 +5,7 @@ import { pathToFileURL } from "node:url";
|
5 | 5 | import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; |
6 | 6 | import { pathExists } from "openclaw/plugin-sdk/security-runtime"; |
7 | 7 | import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js"; |
| 8 | +import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js"; |
8 | 9 | import { |
9 | 10 | type CommandRunner, |
10 | 11 | type CrabboxInspect, |
@@ -89,16 +90,6 @@ const BROWSER_PROFILE_ARCHIVE_ENV = "OPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64";
|
89 | 90 | const BROWSER_PROFILE_DIR_ENV = "OPENCLAW_MANTIS_BROWSER_PROFILE_DIR"; |
90 | 91 | const DEFAULT_VIDEO_DURATION_SECONDS = 10; |
91 | 92 | |
92 | | -function trimToValue(value: string | undefined) { |
93 | | -const trimmed = value?.trim(); |
94 | | -return trimmed && trimmed.length > 0 ? trimmed : undefined; |
95 | | -} |
96 | | - |
97 | | -function isTruthyOptIn(value: string | undefined) { |
98 | | -const normalized = value?.trim().toLowerCase(); |
99 | | -return normalized === "1" || normalized === "true" || normalized === "yes"; |
100 | | -} |
101 | | - |
102 | 93 | function defaultOutputDir(repoRoot: string, startedAt: Date) { |
103 | 94 | const stamp = startedAt.toISOString().replace(/[:.]/gu, "-"); |
104 | 95 | return path.join(repoRoot, ".artifacts", "qa-e2e", "mantis", `desktop-browser-${stamp}`); |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -5,6 +5,7 @@ import path from "node:path";
|
5 | 5 | import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; |
6 | 6 | import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime"; |
7 | 7 | import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js"; |
| 8 | +import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js"; |
8 | 9 | |
9 | 10 | export type MantisDiscordSmokeOptions = { |
10 | 11 | channelId?: string; |
@@ -100,16 +101,6 @@ const DEFAULT_GUILD_ID_ENV = "OPENCLAW_QA_DISCORD_GUILD_ID";
|
100 | 101 | const DEFAULT_CHANNEL_ID_ENV = "OPENCLAW_QA_DISCORD_CHANNEL_ID"; |
101 | 102 | const QA_REDACT_PUBLIC_METADATA_ENV = "OPENCLAW_QA_REDACT_PUBLIC_METADATA"; |
102 | 103 | |
103 | | -function trimToValue(value: string | undefined) { |
104 | | -const trimmed = value?.trim(); |
105 | | -return trimmed && trimmed.length > 0 ? trimmed : undefined; |
106 | | -} |
107 | | - |
108 | | -function isTruthyOptIn(value: string | undefined) { |
109 | | -const normalized = value?.trim().toLowerCase(); |
110 | | -return normalized === "1" || normalized === "true" || normalized === "yes"; |
111 | | -} |
112 | | - |
113 | 104 | function assertDiscordSnowflake(value: string, label: string) { |
114 | 105 | if (!/^\d{17,20}$/u.test(value)) { |
115 | 106 | throw new Error(`${label} must be a Discord snowflake.`); |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -5,6 +5,7 @@ import path from "node:path";
|
5 | 5 | import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; |
6 | 6 | import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js"; |
7 | 7 | import { QA_EVIDENCE_FILENAME, validateQaEvidenceSummaryJson } from "../evidence-summary.js"; |
| 8 | +import { trimToValue } from "../mantis-options.runtime.js"; |
8 | 9 | |
9 | 10 | export type MantisBeforeAfterOptions = { |
10 | 11 | allowFailures?: boolean; |
@@ -134,11 +135,6 @@ const MANTIS_SCENARIO_CONFIGS: Record<string, MantisScenarioConfig> = {
|
134 | 135 | }, |
135 | 136 | }; |
136 | 137 | |
137 | | -function trimToValue(value: string | undefined) { |
138 | | -const trimmed = value?.trim(); |
139 | | -return trimmed && trimmed.length > 0 ? trimmed : undefined; |
140 | | -} |
141 | | - |
142 | 138 | function normalizeRequiredLiteral<T extends string>( |
143 | 139 | value: string | undefined, |
144 | 140 | defaultValue: T, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -8,6 +8,8 @@ import {
|
8 | 8 | acquireQaCredentialLease, |
9 | 9 | startQaCredentialLeaseHeartbeat, |
10 | 10 | } from "../live-transports/shared/credential-lease.runtime.js"; |
| 11 | +import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js"; |
| 12 | +import { createPhaseTimer, type MantisPhaseTimings } from "../mantis-phase-timer.runtime.js"; |
11 | 13 | import { |
12 | 14 | type CommandRunner, |
13 | 15 | type CrabboxInspect, |
@@ -20,7 +22,6 @@ import {
|
20 | 22 | stopCrabbox, |
21 | 23 | warmupCrabbox, |
22 | 24 | } from "./crabbox-runtime.js"; |
23 | | -import { createPhaseTimer, type MantisPhaseTimings } from "../mantis-phase-timer.runtime.js"; |
24 | 25 | |
25 | 26 | export type MantisSlackDesktopSmokeOptions = { |
26 | 27 | alternateModel?: string; |
@@ -153,16 +154,6 @@ const HYDRATE_MODE_ENV = "OPENCLAW_MANTIS_HYDRATE_MODE";
|
153 | 154 | const SLACK_URL_ENV = "OPENCLAW_MANTIS_SLACK_URL"; |
154 | 155 | const SLACK_CHANNEL_ID_ENV = "OPENCLAW_MANTIS_SLACK_CHANNEL_ID"; |
155 | 156 | |
156 | | -function trimToValue(value: string | undefined) { |
157 | | -const trimmed = value?.trim(); |
158 | | -return trimmed && trimmed.length > 0 ? trimmed : undefined; |
159 | | -} |
160 | | - |
161 | | -function isTruthyOptIn(value: string | undefined) { |
162 | | -const normalized = value?.trim().toLowerCase(); |
163 | | -return normalized === "1" || normalized === "true" || normalized === "yes"; |
164 | | -} |
165 | | - |
166 | 157 | function normalizeHydrateMode( |
167 | 158 | value: string | undefined, |
168 | 159 | ): MantisSlackDesktopHydrateMode | undefined { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -8,6 +8,8 @@ import {
|
8 | 8 | acquireQaCredentialLease, |
9 | 9 | startQaCredentialLeaseHeartbeat, |
10 | 10 | } from "../live-transports/shared/credential-lease.runtime.js"; |
| 11 | +import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js"; |
| 12 | +import { createPhaseTimer, type MantisPhaseTimings } from "../mantis-phase-timer.runtime.js"; |
11 | 13 | import { |
12 | 14 | type CommandRunner, |
13 | 15 | type CrabboxInspect, |
@@ -20,7 +22,6 @@ import {
|
20 | 22 | stopCrabbox, |
21 | 23 | warmupCrabbox, |
22 | 24 | } from "./crabbox-runtime.js"; |
23 | | -import { createPhaseTimer, type MantisPhaseTimings } from "../mantis-phase-timer.runtime.js"; |
24 | 25 | |
25 | 26 | export type MantisTelegramDesktopBuilderOptions = { |
26 | 27 | commandRunner?: CommandRunner; |
@@ -126,16 +127,6 @@ const TELEGRAM_PROFILE_ARCHIVE_ENV_NAME_ENV =
|
126 | 127 | "OPENCLAW_MANTIS_TELEGRAM_DESKTOP_PROFILE_ARCHIVE_ENV"; |
127 | 128 | const TELEGRAM_PROFILE_DIR_ENV = "OPENCLAW_MANTIS_TELEGRAM_DESKTOP_PROFILE_DIR"; |
128 | 129 | |
129 | | -function trimToValue(value: string | undefined) { |
130 | | -const trimmed = value?.trim(); |
131 | | -return trimmed && trimmed.length > 0 ? trimmed : undefined; |
132 | | -} |
133 | | - |
134 | | -function isTruthyOptIn(value: string | undefined) { |
135 | | -const normalized = value?.trim().toLowerCase(); |
136 | | -return normalized === "1" || normalized === "true" || normalized === "yes"; |
137 | | -} |
138 | | - |
139 | 130 | function normalizeHydrateMode( |
140 | 131 | value: string | undefined, |
141 | 132 | ): MantisTelegramDesktopHydrateMode | undefined { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -4,6 +4,7 @@ import path from "node:path";
|
4 | 4 | import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; |
5 | 5 | import { pathExists, writeExternalFileWithinRoot } from "openclaw/plugin-sdk/security-runtime"; |
6 | 6 | import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js"; |
| 7 | +import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js"; |
7 | 8 | import { |
8 | 9 | type CommandRunner, |
9 | 10 | type CrabboxInspect, |
@@ -141,16 +142,6 @@ const CRABBOX_KEEP_ENV = "OPENCLAW_MANTIS_KEEP_VM";
|
141 | 142 | const CRABBOX_IDLE_TIMEOUT_ENV = "OPENCLAW_MANTIS_CRABBOX_IDLE_TIMEOUT"; |
142 | 143 | const CRABBOX_TTL_ENV = "OPENCLAW_MANTIS_CRABBOX_TTL"; |
143 | 144 | |
144 | | -function trimToValue(value: string | undefined) { |
145 | | -const trimmed = value?.trim(); |
146 | | -return trimmed && trimmed.length > 0 ? trimmed : undefined; |
147 | | -} |
148 | | - |
149 | | -function isTruthyOptIn(value: string | undefined) { |
150 | | -const normalized = value?.trim().toLowerCase(); |
151 | | -return normalized === "1" || normalized === "true" || normalized === "yes"; |
152 | | -} |
153 | | - |
154 | 145 | function defaultOutputDir(repoRoot: string, startedAt: Date) { |
155 | 146 | const stamp = startedAt.toISOString().replace(/[:.]/gu, "-"); |
156 | 147 | return path.join(repoRoot, ".artifacts", "qa-e2e", "mantis", `visual-task-${stamp}`); |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。