~cytrogen/gstack

ref: 562a67503ab1308a711d5de17512e092912d0dac gstack/scripts/eval-select.ts -rw-r--r-- 3.1 KiB
562a6750 — Garry Tan feat: Session Intelligence Layer — /checkpoint + /health + context recovery (v0.15.0.0) (#733) 8 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env bun
/**
 * Show which E2E and LLM-judge tests would run based on the current git diff.
 *
 * Usage:
 *   bun run eval:select              # human-readable output
 *   bun run eval:select --json       # machine-readable JSON
 *   bun run eval:select --base main  # override base branch
 */

import * as path from 'path';
import {
  selectTests,
  detectBaseBranch,
  getChangedFiles,
  E2E_TOUCHFILES,
  LLM_JUDGE_TOUCHFILES,
  GLOBAL_TOUCHFILES,
} from '../test/helpers/touchfiles';

const ROOT = path.resolve(import.meta.dir, '..');
const args = process.argv.slice(2);
const jsonMode = args.includes('--json');
const baseIdx = args.indexOf('--base');
const baseOverride = baseIdx >= 0 ? args[baseIdx + 1] : undefined;

// Detect base branch
const baseBranch = baseOverride || detectBaseBranch(ROOT) || 'main';
const changedFiles = getChangedFiles(baseBranch, ROOT);

if (changedFiles.length === 0) {
  if (jsonMode) {
    console.log(JSON.stringify({ base: baseBranch, changed_files: 0, e2e: 'all', llm_judge: 'all', reason: 'no diff — would run all tests' }));
  } else {
    console.log(`Base: ${baseBranch}`);
    console.log('No changed files detected — all tests would run.');
  }
  process.exit(0);
}

const e2eSelection = selectTests(changedFiles, E2E_TOUCHFILES, GLOBAL_TOUCHFILES);
const llmSelection = selectTests(changedFiles, LLM_JUDGE_TOUCHFILES, GLOBAL_TOUCHFILES);

if (jsonMode) {
  console.log(JSON.stringify({
    base: baseBranch,
    changed_files: changedFiles,
    e2e: {
      selected: e2eSelection.selected,
      skipped: e2eSelection.skipped,
      reason: e2eSelection.reason,
      count: `${e2eSelection.selected.length}/${Object.keys(E2E_TOUCHFILES).length}`,
    },
    llm_judge: {
      selected: llmSelection.selected,
      skipped: llmSelection.skipped,
      reason: llmSelection.reason,
      count: `${llmSelection.selected.length}/${Object.keys(LLM_JUDGE_TOUCHFILES).length}`,
    },
  }, null, 2));
} else {
  console.log(`Base: ${baseBranch}`);
  console.log(`Changed files: ${changedFiles.length}`);
  console.log();

  console.log(`E2E (${e2eSelection.reason}): ${e2eSelection.selected.length}/${Object.keys(E2E_TOUCHFILES).length} tests`);
  if (e2eSelection.selected.length > 0 && e2eSelection.selected.length < Object.keys(E2E_TOUCHFILES).length) {
    console.log(`  Selected: ${e2eSelection.selected.join(', ')}`);
    console.log(`  Skipped:  ${e2eSelection.skipped.join(', ')}`);
  } else if (e2eSelection.selected.length === 0) {
    console.log('  No E2E tests affected.');
  } else {
    console.log('  All E2E tests selected.');
  }
  console.log();

  console.log(`LLM-judge (${llmSelection.reason}): ${llmSelection.selected.length}/${Object.keys(LLM_JUDGE_TOUCHFILES).length} tests`);
  if (llmSelection.selected.length > 0 && llmSelection.selected.length < Object.keys(LLM_JUDGE_TOUCHFILES).length) {
    console.log(`  Selected: ${llmSelection.selected.join(', ')}`);
    console.log(`  Skipped:  ${llmSelection.skipped.join(', ')}`);
  } else if (llmSelection.selected.length === 0) {
    console.log('  No LLM-judge tests affected.');
  } else {
    console.log('  All LLM-judge tests selected.');
  }
}