






















@@ -1,147 +1,27 @@
1-import type { Command } from "commander";
2-import { collectString } from "../../cli-options.js";
1+import {
2+createLiveTransportQaCliRegistration as createSharedLiveTransportQaCliRegistration,
3+type LiveTransportQaCliRegistrationOptions,
4+} from "openclaw/plugin-sdk/qa-runtime";
35import { DEFAULT_QA_LIVE_PROVIDER_MODE, formatQaProviderModeHelp } from "../../providers/index.js";
4-import type { QaProviderModeInput } from "../../run-config.js";
566-export type LiveTransportQaCommandOptions = {
7-repoRoot?: string;
8-outputDir?: string;
9-providerMode?: QaProviderModeInput;
10-primaryModel?: string;
11-alternateModel?: string;
12-fastMode?: boolean;
13-allowFailures?: boolean;
14-scenarioIds?: string[];
15-listScenarios?: boolean;
16-sutAccountId?: string;
17-credentialSource?: string;
18-credentialRole?: string;
19-};
20-21-type LiveTransportQaCommanderOptions = {
22-repoRoot?: string;
23-outputDir?: string;
24-providerMode?: QaProviderModeInput;
25-model?: string;
26-altModel?: string;
27-scenario?: string[];
28-listScenarios?: boolean;
29-fast?: boolean;
30-allowFailures?: boolean;
31-sutAccount?: string;
32-credentialSource?: string;
33-credentialRole?: string;
34-};
35-36-export type LiveTransportQaCliRegistration = {
37-commandName: string;
38-register(qa: Command): void;
39-};
40-41-type LiveTransportQaCredentialCliOptions = {
42-sourceDescription?: string;
43-roleDescription?: string;
44-};
45-46-export function createLazyCliRuntimeLoader<T>(load: () => Promise<T>) {
47-let promise: Promise<T> | null = null;
48-return async () => {
49-promise ??= load();
50-return await promise;
51-};
52-}
53-54-function mapLiveTransportQaCommanderOptions(
55-opts: LiveTransportQaCommanderOptions,
56-): LiveTransportQaCommandOptions {
57-return {
58-repoRoot: opts.repoRoot,
59-outputDir: opts.outputDir,
60-providerMode: opts.providerMode,
61-primaryModel: opts.model,
62-alternateModel: opts.altModel,
63-fastMode: opts.fast,
64-allowFailures: opts.allowFailures,
65-scenarioIds: opts.scenario,
66-listScenarios: opts.listScenarios,
67-sutAccountId: opts.sutAccount,
68-credentialSource: opts.credentialSource,
69-credentialRole: opts.credentialRole,
70-};
71-}
72-73-function registerLiveTransportQaCli(params: {
74-qa: Command;
75-commandName: string;
76-credentialOptions?: LiveTransportQaCredentialCliOptions;
77-description: string;
78-listScenariosHelp?: string;
79-outputDirHelp: string;
80-scenarioHelp: string;
81-sutAccountHelp: string;
82-run: (opts: LiveTransportQaCommandOptions) => Promise<void>;
83-}) {
84-const command = params.qa
85-.command(params.commandName)
86-.description(params.description)
87-.option("--repo-root <path>", "Repository root to target when running from a neutral cwd")
88-.option("--output-dir <path>", params.outputDirHelp)
89-.option("--provider-mode <mode>", formatQaProviderModeHelp(), DEFAULT_QA_LIVE_PROVIDER_MODE)
90-.option("--model <ref>", "Primary provider/model ref")
91-.option("--alt-model <ref>", "Alternate provider/model ref")
92-.option("--scenario <id>", params.scenarioHelp, collectString, [])
93-.option("--fast", "Enable provider fast mode where supported", false)
94-.option(
95-"--allow-failures",
96-"Write artifacts without setting a failing exit code when scenarios fail",
97-false,
98-)
99-.option("--sut-account <id>", params.sutAccountHelp, "sut");
100-101-if (params.listScenariosHelp) {
102-command.option("--list-scenarios", params.listScenariosHelp, false);
103-}
104-105-if (params.credentialOptions) {
106-command.option(
107-"--credential-source <source>",
108-params.credentialOptions.sourceDescription ??
109-"Credential source for live lanes: env or convex (default: env)",
110-);
111-if (params.credentialOptions.roleDescription) {
112-command.option("--credential-role <role>", params.credentialOptions.roleDescription);
113-}
114-}
115-116-command.action(async (opts: LiveTransportQaCommanderOptions) => {
117-await params.run(mapLiveTransportQaCommanderOptions(opts));
7+export {
8+createLazyCliRuntimeLoader,
9+type LiveTransportQaCliRegistration,
10+type LiveTransportQaCommandOptions,
11+} from "openclaw/plugin-sdk/qa-runtime";
12+13+type QaLabLiveTransportQaCliRegistrationOptions = Omit<
14+LiveTransportQaCliRegistrationOptions,
15+"allowFailuresHelp" | "defaultProviderMode" | "providerModeHelp"
16+>;
17+18+export function createLiveTransportQaCliRegistration(
19+params: QaLabLiveTransportQaCliRegistrationOptions,
20+) {
21+return createSharedLiveTransportQaCliRegistration({
22+ ...params,
23+allowFailuresHelp: "Write artifacts without setting a failing exit code when scenarios fail",
24+defaultProviderMode: DEFAULT_QA_LIVE_PROVIDER_MODE,
25+providerModeHelp: formatQaProviderModeHelp(),
11826});
11927}
120-121-export function createLiveTransportQaCliRegistration(params: {
122-commandName: string;
123-credentialOptions?: LiveTransportQaCredentialCliOptions;
124-description: string;
125-listScenariosHelp?: string;
126-outputDirHelp: string;
127-scenarioHelp: string;
128-sutAccountHelp: string;
129-run: (opts: LiveTransportQaCommandOptions) => Promise<void>;
130-}): LiveTransportQaCliRegistration {
131-return {
132-commandName: params.commandName,
133-register(qa: Command) {
134-registerLiveTransportQaCli({
135- qa,
136-commandName: params.commandName,
137-credentialOptions: params.credentialOptions,
138-description: params.description,
139-listScenariosHelp: params.listScenariosHelp,
140-outputDirHelp: params.outputDirHelp,
141-scenarioHelp: params.scenarioHelp,
142-sutAccountHelp: params.sutAccountHelp,
143-run: params.run,
144-});
145-},
146-};
147-}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。