Files
deepseek-harness/vitest.snapshot.config.ts
Tianyi Cui 9a5a3835c8 ci+fix: run snapshot tests in CI and load .env only when recording
Holistic-review fixes for integration gaps the per-commit reviews missed:

- CI now runs `pnpm run test:snapshot` (a step after the coverage gate). It was
  wired into pre-push but not .github/workflows/ci.yml, so the RFC/AGENTS claim
  that snapshot replay runs in the default PR gate was only half-true — CI is
  the real gate.
- vitest.snapshot.config.ts loads the repo .env ONLY when DSH_SNAPSHOT=record.
  Loading it unconditionally contradicted the replay safety story (replay must
  never reach the network), and runScenario forwards process.env to the child.
  Non-ENOENT load errors now surface instead of being swallowed.
- start.ts: the graceful-shutdown comment said "RECORD runs" but the path
  applies to both snapshot modes (replay also closes stdin → dispose → exit).
- docs/development.md: list the new pre-push snapshot job and the CI snapshot
  gate.
2026-06-19 04:28:09 +08:00

37 lines
1.7 KiB
TypeScript

import tsconfigPaths from 'vite-tsconfig-paths'
import { defineConfig } from 'vitest/config'
// Snapshot tests: `pnpm run test:snapshot`, file pattern *.snapshot.ts.
// REPLAY by default — they boot the real acp-agent subprocess against a
// recorded session JSONL fixture (no API key, no network) and diff the
// normalized stdout transcript + re-persisted log against committed goldens.
// `pnpm run test:snapshot:record` (DSH_SNAPSHOT=record + -u) re-records the
// fixtures against the real API and refreshes the goldens.
//
// Replay loads no .env (it must never reach the network — a recorded fixture
// drives the model). Record reads DEEPSEEK_API_KEY from the env or a gitignored
// repo-root .env, so a contributor with a key only in .env can still record.
if (process.env.DSH_SNAPSHOT === 'record') {
try {
process.loadEnvFile(new URL('.env', import.meta.url).pathname)
} catch (error) {
// ENOENT (no .env) is fine — the key may already be in the environment.
// Surface any other failure rather than silently recording with wrong env.
if ((error as NodeJS.ErrnoException | null)?.code !== 'ENOENT') throw error
}
}
export default defineConfig({
// Same resolution note as vitest.config.ts: bare workspace names resolve
// through the root tsconfig paths map; the native option cannot do this.
plugins: [tsconfigPaths({ projects: ['./tsconfig.test.json'] })],
test: {
include: ['examples/*/tests/**/*.snapshot.ts'],
// Each test boots a subprocess; give it room, and run files one at a time
// (a record run hits the live API, and replay subprocess boot is heavy).
testTimeout: 120_000,
hookTimeout: 30_000,
fileParallelism: false,
},
})