|
1 | 1 | // Qa Lab plugin module implements QA evidence summary behavior. |
| 2 | +import { execFileSync } from "node:child_process"; |
2 | 3 | import { z } from "zod"; |
3 | 4 | import { splitQaModelRef } from "./model-selection.js"; |
4 | 5 | import { getQaProvider, type QaProviderMode } from "./providers/index.js"; |
@@ -288,6 +289,7 @@ type QaEvidenceBuildBase = { |
288 | 289 | channelDriver?: string; |
289 | 290 | packageSource?: QaEvidencePackageSource; |
290 | 291 | profile?: QaEvidenceProfile; |
| 292 | + repoRoot?: string; |
291 | 293 | runner?: string; |
292 | 294 | }; |
293 | 295 |
|
@@ -388,9 +390,31 @@ function resolveQaEvidenceChannelDriver(params: { env?: NodeJS.ProcessEnv; fallb |
388 | 390 | return id ? { id } : undefined; |
389 | 391 | } |
390 | 392 |
|
391 | | -function resolveQaEvidenceEnvironment(env: NodeJS.ProcessEnv | undefined) { |
| 393 | +function resolveQaEvidenceCheckoutRef(repoRoot?: string) { |
| 394 | + try { |
| 395 | + const ref = execFileSync("git", ["rev-parse", "--verify", "HEAD"], { |
| 396 | + cwd: repoRoot ?? process.cwd(), |
| 397 | + encoding: "utf8", |
| 398 | + stdio: ["ignore", "pipe", "ignore"], |
| 399 | + }).trim(); |
| 400 | + return ref || undefined; |
| 401 | + } catch { |
| 402 | + return undefined; |
| 403 | + } |
| 404 | +} |
| 405 | + |
| 406 | +export function resolveQaEvidenceEnvironment(params: { |
| 407 | + env?: NodeJS.ProcessEnv; |
| 408 | + repoRoot?: string; |
| 409 | +}) { |
392 | 410 | return { |
393 | | - ref: env?.OPENCLAW_QA_REF?.trim() || env?.GITHUB_SHA?.trim() || null, |
| 411 | + // GitHub's GITHUB_SHA describes the workflow event, not necessarily the |
| 412 | + // checked-out ref selected by a manual or remote QA run. |
| 413 | + ref: |
| 414 | + params.env?.OPENCLAW_QA_REF?.trim() || |
| 415 | + resolveQaEvidenceCheckoutRef(params.repoRoot) || |
| 416 | + params.env?.GITHUB_SHA?.trim() || |
| 417 | + null, |
394 | 418 | os: process.platform, |
395 | 419 | nodeVersion: process.version, |
396 | 420 | }; |
@@ -550,7 +574,10 @@ export function buildQaSuiteEvidenceSummary( |
550 | 574 | }, |
551 | 575 | ): QaEvidenceSummaryJson { |
552 | 576 | const provider = buildQaEvidenceProvider(params); |
553 | | - const environment = resolveQaEvidenceEnvironment(params.env); |
| 577 | + const environment = resolveQaEvidenceEnvironment({ |
| 578 | + env: params.env, |
| 579 | + repoRoot: params.repoRoot, |
| 580 | + }); |
554 | 581 | const packageSource = resolveQaEvidenceBuildPackageSource(params); |
555 | 582 | const runner = resolveQaEvidenceRunner({ env: params.env, fallback: params.runner }); |
556 | 583 | const profile = resolveQaEvidenceProfile({ |
@@ -622,7 +649,10 @@ function buildTestRunnerEvidenceSummary( |
622 | 649 | }, |
623 | 650 | ): QaEvidenceSummaryJson { |
624 | 651 | const provider = buildQaEvidenceProvider(params); |
625 | | - const environment = resolveQaEvidenceEnvironment(params.env); |
| 652 | + const environment = resolveQaEvidenceEnvironment({ |
| 653 | + env: params.env, |
| 654 | + repoRoot: params.repoRoot, |
| 655 | + }); |
626 | 656 | const packageSource = resolveQaEvidenceBuildPackageSource(params); |
627 | 657 | const runner = resolveQaEvidenceRunner({ |
628 | 658 | env: params.env, |
@@ -726,7 +756,10 @@ export function buildLiveTransportEvidenceSummary( |
726 | 756 | }, |
727 | 757 | ): QaEvidenceSummaryJson { |
728 | 758 | const provider = buildQaEvidenceProvider(params); |
729 | | - const environment = resolveQaEvidenceEnvironment(params.env); |
| 759 | + const environment = resolveQaEvidenceEnvironment({ |
| 760 | + env: params.env, |
| 761 | + repoRoot: params.repoRoot, |
| 762 | + }); |
730 | 763 | const packageSource = resolveQaEvidenceBuildPackageSource(params); |
731 | 764 | const runner = resolveQaEvidenceRunner({ env: params.env, fallback: params.runner }); |
732 | 765 | const profile = resolveQaEvidenceProfile({ |
|
0 commit comments