Skip to content

Commit 21c9666

Browse files
committed
refactor(qa): share mantis option helpers
1 parent be7807f commit 21c9666

8 files changed

Lines changed: 19 additions & 62 deletions
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
}

extensions/qa-lab/src/mantis/crabbox-runtime.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { spawn, type SpawnOptions } from "node:child_process";
33
import path from "node:path";
44
import { pathExists } from "openclaw/plugin-sdk/security-runtime";
5+
import { trimToValue } from "../mantis-options.runtime.js";
56

67
export type CommandResult = {
78
stderr: string;
@@ -26,11 +27,6 @@ export type CrabboxInspect = {
2627
state?: string;
2728
};
2829

29-
function trimToValue(value: string | undefined) {
30-
const trimmed = value?.trim();
31-
return trimmed && trimmed.length > 0 ? trimmed : undefined;
32-
}
33-
3430
export async function defaultCommandRunner(
3531
command: string,
3632
args: readonly string[],

extensions/qa-lab/src/mantis/desktop-browser-smoke.runtime.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { pathToFileURL } from "node:url";
55
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
66
import { pathExists } from "openclaw/plugin-sdk/security-runtime";
77
import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js";
8+
import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js";
89
import {
910
type CommandRunner,
1011
type CrabboxInspect,
@@ -89,16 +90,6 @@ const BROWSER_PROFILE_ARCHIVE_ENV = "OPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64";
8990
const BROWSER_PROFILE_DIR_ENV = "OPENCLAW_MANTIS_BROWSER_PROFILE_DIR";
9091
const DEFAULT_VIDEO_DURATION_SECONDS = 10;
9192

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-
10293
function defaultOutputDir(repoRoot: string, startedAt: Date) {
10394
const stamp = startedAt.toISOString().replace(/[:.]/gu, "-");
10495
return path.join(repoRoot, ".artifacts", "qa-e2e", "mantis", `desktop-browser-${stamp}`);

extensions/qa-lab/src/mantis/discord-smoke.runtime.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import path from "node:path";
55
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
66
import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
77
import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js";
8+
import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js";
89

910
export type MantisDiscordSmokeOptions = {
1011
channelId?: string;
@@ -100,16 +101,6 @@ const DEFAULT_GUILD_ID_ENV = "OPENCLAW_QA_DISCORD_GUILD_ID";
100101
const DEFAULT_CHANNEL_ID_ENV = "OPENCLAW_QA_DISCORD_CHANNEL_ID";
101102
const QA_REDACT_PUBLIC_METADATA_ENV = "OPENCLAW_QA_REDACT_PUBLIC_METADATA";
102103

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-
113104
function assertDiscordSnowflake(value: string, label: string) {
114105
if (!/^\d{17,20}$/u.test(value)) {
115106
throw new Error(`${label} must be a Discord snowflake.`);

extensions/qa-lab/src/mantis/run.runtime.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import path from "node:path";
55
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
66
import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js";
77
import { QA_EVIDENCE_FILENAME, validateQaEvidenceSummaryJson } from "../evidence-summary.js";
8+
import { trimToValue } from "../mantis-options.runtime.js";
89

910
export type MantisBeforeAfterOptions = {
1011
allowFailures?: boolean;
@@ -134,11 +135,6 @@ const MANTIS_SCENARIO_CONFIGS: Record<string, MantisScenarioConfig> = {
134135
},
135136
};
136137

137-
function trimToValue(value: string | undefined) {
138-
const trimmed = value?.trim();
139-
return trimmed && trimmed.length > 0 ? trimmed : undefined;
140-
}
141-
142138
function normalizeRequiredLiteral<T extends string>(
143139
value: string | undefined,
144140
defaultValue: T,

extensions/qa-lab/src/mantis/slack-desktop-smoke.runtime.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
acquireQaCredentialLease,
99
startQaCredentialLeaseHeartbeat,
1010
} 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";
1113
import {
1214
type CommandRunner,
1315
type CrabboxInspect,
@@ -20,7 +22,6 @@ import {
2022
stopCrabbox,
2123
warmupCrabbox,
2224
} from "./crabbox-runtime.js";
23-
import { createPhaseTimer, type MantisPhaseTimings } from "../mantis-phase-timer.runtime.js";
2425

2526
export type MantisSlackDesktopSmokeOptions = {
2627
alternateModel?: string;
@@ -153,16 +154,6 @@ const HYDRATE_MODE_ENV = "OPENCLAW_MANTIS_HYDRATE_MODE";
153154
const SLACK_URL_ENV = "OPENCLAW_MANTIS_SLACK_URL";
154155
const SLACK_CHANNEL_ID_ENV = "OPENCLAW_MANTIS_SLACK_CHANNEL_ID";
155156

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-
166157
function normalizeHydrateMode(
167158
value: string | undefined,
168159
): MantisSlackDesktopHydrateMode | undefined {

extensions/qa-lab/src/mantis/telegram-desktop-builder.runtime.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
acquireQaCredentialLease,
99
startQaCredentialLeaseHeartbeat,
1010
} 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";
1113
import {
1214
type CommandRunner,
1315
type CrabboxInspect,
@@ -20,7 +22,6 @@ import {
2022
stopCrabbox,
2123
warmupCrabbox,
2224
} from "./crabbox-runtime.js";
23-
import { createPhaseTimer, type MantisPhaseTimings } from "../mantis-phase-timer.runtime.js";
2425

2526
export type MantisTelegramDesktopBuilderOptions = {
2627
commandRunner?: CommandRunner;
@@ -126,16 +127,6 @@ const TELEGRAM_PROFILE_ARCHIVE_ENV_NAME_ENV =
126127
"OPENCLAW_MANTIS_TELEGRAM_DESKTOP_PROFILE_ARCHIVE_ENV";
127128
const TELEGRAM_PROFILE_DIR_ENV = "OPENCLAW_MANTIS_TELEGRAM_DESKTOP_PROFILE_DIR";
128129

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-
139130
function normalizeHydrateMode(
140131
value: string | undefined,
141132
): MantisTelegramDesktopHydrateMode | undefined {

extensions/qa-lab/src/mantis/visual-task.runtime.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import path from "node:path";
44
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
55
import { pathExists, writeExternalFileWithinRoot } from "openclaw/plugin-sdk/security-runtime";
66
import { ensureRepoBoundDirectory, resolveRepoRelativeOutputDir } from "../cli-paths.js";
7+
import { isTruthyOptIn, trimToValue } from "../mantis-options.runtime.js";
78
import {
89
type CommandRunner,
910
type CrabboxInspect,
@@ -141,16 +142,6 @@ const CRABBOX_KEEP_ENV = "OPENCLAW_MANTIS_KEEP_VM";
141142
const CRABBOX_IDLE_TIMEOUT_ENV = "OPENCLAW_MANTIS_CRABBOX_IDLE_TIMEOUT";
142143
const CRABBOX_TTL_ENV = "OPENCLAW_MANTIS_CRABBOX_TTL";
143144

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-
154145
function defaultOutputDir(repoRoot: string, startedAt: Date) {
155146
const stamp = startedAt.toISOString().replace(/[:.]/gu, "-");
156147
return path.join(repoRoot, ".artifacts", "qa-e2e", "mantis", `visual-task-${stamp}`);

0 commit comments

Comments
 (0)