mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-15 12:53:31 +08:00
The live baseline covered the server WebSocket path, but it still did not prove the desktop app can open a session, apply a selected provider/model, send a chat turn, and surface model/tool progress through the UI. This adds an agent-browser driven smoke lane that starts the local server and Vite desktop app, restores an isolated session tab with the requested runtime selection, submits a small coding task through the composer, and accepts the run only when the fixture diff and tests pass. Constraint: Desktop smoke must stay behind --allow-live because it launches browsers and real models. Constraint: The smoke temporarily enables bypassPermissions for the isolated run and restores the previous mode afterward. Rejected: Wait for a final marker phrase | model reasoning and echoed prompts can contain the same marker before the work is actually done. Rejected: Use only DOM text as success proof | the browser can show progress while the project files are still unchanged. Confidence: high Scope-risk: moderate Directive: Future desktop smoke cases should verify project state and artifacts, not only UI copy. Tested: bun test scripts/quality-gate/*.test.ts scripts/quality-gate/baseline/*.test.ts Tested: bun run quality:gate --mode baseline --dry-run --provider-model minimax-m2.7 Tested: bun run quality:gate --mode baseline --allow-live --provider-model minimax-m2.7 (9 passed, 0 failed) Tested: bun run check:server Not-tested: Kimi desktop smoke completion because the provider returned AccountQuotaExceeded / API Error 429 until its reset window.
75 lines
2.6 KiB
TypeScript
75 lines
2.6 KiB
TypeScript
import { baselineCases } from './baseline/cases'
|
|
import type { BaselineTarget, LaneDefinition, QualityGateMode } from './types'
|
|
|
|
export function lanesForMode(mode: QualityGateMode, baselineTargets: BaselineTarget[] = []): LaneDefinition[] {
|
|
const lanes: LaneDefinition[] = [
|
|
{
|
|
id: 'impact-report',
|
|
title: 'Impact report',
|
|
description: 'Summarize changed areas, required local checks, and risk notes.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:impact'],
|
|
requiredForModes: ['pr', 'baseline', 'release'],
|
|
},
|
|
{
|
|
id: 'pr-checks',
|
|
title: 'Path-aware PR checks',
|
|
description: 'Run the existing local PR gate with stable path-aware checks.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:pr'],
|
|
requiredForModes: ['pr', 'release'],
|
|
},
|
|
{
|
|
id: 'baseline-catalog',
|
|
title: 'Baseline case catalog validation',
|
|
description: 'Validate real Coding Agent baseline case definitions and fixture metadata.',
|
|
kind: 'command',
|
|
command: ['bun', 'test', 'scripts/quality-gate/baseline/cases.test.ts'],
|
|
requiredForModes: ['baseline', 'release'],
|
|
},
|
|
{
|
|
id: 'native-checks',
|
|
title: 'Native desktop checks',
|
|
description: 'Build sidecars and run the Tauri native compile check.',
|
|
kind: 'command',
|
|
command: ['bun', 'run', 'check:native'],
|
|
requiredForModes: ['release'],
|
|
},
|
|
]
|
|
|
|
const targets = baselineTargets.length > 0
|
|
? baselineTargets
|
|
: [{ providerId: null, modelId: 'current', label: 'current-runtime' }]
|
|
|
|
for (const testCase of baselineCases) {
|
|
for (const target of targets) {
|
|
const targetSlug = target.label.replace(/[^a-zA-Z0-9._-]+/g, '-')
|
|
lanes.push({
|
|
id: `baseline:${testCase.id}:${targetSlug}`,
|
|
title: `${testCase.title} (${target.label})`,
|
|
description: testCase.description,
|
|
kind: 'baseline-case',
|
|
baselineCaseId: testCase.id,
|
|
baselineTarget: target,
|
|
requiredForModes: ['baseline', 'release'],
|
|
live: true,
|
|
})
|
|
}
|
|
}
|
|
|
|
for (const target of targets) {
|
|
const targetSlug = target.label.replace(/[^a-zA-Z0-9._-]+/g, '-')
|
|
lanes.push({
|
|
id: `desktop-smoke:agent-browser-chat:${targetSlug}`,
|
|
title: `Desktop agent-browser chat smoke (${target.label})`,
|
|
description: 'Open the desktop web app with agent-browser, send a real chat task, and verify the model edits a fixture project through the UI.',
|
|
kind: 'desktop-smoke',
|
|
baselineTarget: target,
|
|
requiredForModes: ['baseline', 'release'],
|
|
live: true,
|
|
})
|
|
}
|
|
|
|
return lanes.filter((lane) => lane.requiredForModes.includes(mode))
|
|
}
|