lastlight-evals 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,6 +71,11 @@ bare `lastlight-evals run` "just works" (it auto-detects `./instance` as the
71
71
  overlay and `./evals/datasets`). Now you're evaluating *your* agent against the
72
72
  models you care about. Prefer to drive it by hand? Keep reading.
73
73
 
74
+ > The skill itself lives in a separate repo — it's bundled in the **`lastlight`
75
+ > plugin** ([`cliftonc/lastlight`](https://github.com/cliftonc/lastlight), under
76
+ > `plugins/lastlight/skills/lastlight-evals/`) and tracks this CLI's `init` /
77
+ > `run` surface, so the two are kept in sync.
78
+
74
79
  ### Manual: scaffold with `init`
75
80
 
76
81
  The fastest CLI path is **`init`** — it scaffolds *your own* evals workspace
@@ -318,7 +323,20 @@ by name with **overlay > user (`--datasets`) > built-in** precedence:
318
323
  }
319
324
  ```
320
325
 
321
- **Code-fix** — three things keyed by `instance_id`, all under the tier dir:
326
+ Or scaffold one from a **real, resolved issue** — its content, the labels that were
327
+ applied (with who applied them), and reviewer comments become the gold case:
328
+
329
+ ```bash
330
+ lastlight-evals add-case --issue https://github.com/owner/repo/issues/42 --dry-run
331
+ ```
332
+
333
+ It seeds the issue *without* its triage labels (so the agent triages fresh), sets
334
+ `expect_github.labels_added` to the applied labels (+ `issue_closed` if it was
335
+ closed), and prints the labels/comments as evidence; you then assign
336
+ `triage_gold` (category/state) per your deployment's taxonomy.
337
+
338
+ **Code-fix (vendored fixture)** — three things keyed by `instance_id`, all under
339
+ the tier dir:
322
340
 
323
341
  ```
324
342
  <tier>/instances.json # the SweBenchInstance (FAIL_TO_PASS / PASS_TO_PASS)
@@ -326,6 +344,24 @@ by name with **overlay > user (`--datasets`) > built-in** precedence:
326
344
  <tier>/tests/<id>/ # held-out test files, copied in at grade time
327
345
  ```
328
346
 
347
+ **Code-fix from a real PR (git-source)** — point the CLI at a merged PR instead
348
+ of hand-building a fixture:
349
+
350
+ ```bash
351
+ lastlight-evals add-case --pr https://github.com/owner/repo/pull/123 --dry-run
352
+ ```
353
+
354
+ It reads the PR with `gh`, computes `base_commit` (the merge-base of the base
355
+ branch and the PR head) + `head_commit`, captures the PR's **test** diff as the
356
+ held-out `test_patch`, and — unless `--no-validate` — runs the tests at base
357
+ (red) vs head (green) to fill `FAIL_TO_PASS` / `PASS_TO_PASS`. Drop `--dry-run`
358
+ to write it (to `--datasets <dir>` / `--overlay <dir>`, else `./datasets`). No
359
+ `repos/<id>/` is vendored: at run time the harness clones the repo into the
360
+ gitignored `./.eval-cache/` and checks out `base_commit`. Non-`node --test`
361
+ runners work via `--test-cmd "<cmd>"` (+ `--setup-cmd "<cmd>"`), graded on the
362
+ test command's exit code (suite mode) when it emits no TAP names. The repo's
363
+ tests run real code — only use trusted repos.
364
+
329
365
  A new tier just needs a directory with an `instances.json` and a `tier.json`
330
366
  (`{ "name", "defaultWorkflow", "description" }`); per-instance `workflow` wins
331
367
  when present.
@@ -0,0 +1,444 @@
1
+ /**
2
+ * `lastlight-evals add-case` — scaffold an eval instance from a real GitHub PR
3
+ * (code-fix) or issue (triage).
4
+ *
5
+ * This does the MECHANICAL, reproducible extraction; the `lastlight-evals` agent
6
+ * skill drives it and refines the fuzzy parts (held-out test selection, the
7
+ * problem statement, FAIL_TO_PASS names). From a PR it derives:
8
+ * - `repo` + `base_commit` (the true fork point: merge-base of base & head)
9
+ * + `head_commit`,
10
+ * - `test_patch` — the diff of the PR's TEST files (held out at grade time),
11
+ * - gold `patch` — the diff of the non-test files (reference only),
12
+ * - `FAIL_TO_PASS` / `PASS_TO_PASS` — auto-detected by running the tests at
13
+ * base (red) vs head (green) when validation is enabled,
14
+ * - the issue fixture + `expect_github`.
15
+ *
16
+ * The produced instance is a **git-source** case: no `repos/<id>/` fixture is
17
+ * written — at run time the harness clones the real repo into the repo-local
18
+ * cache and checks out `base_commit` (see `seedWorkspaceFromGit`).
19
+ *
20
+ * Validation and the run-time checkout execute the repo's own code (`setup_cmd`
21
+ * / `test_cmd` / its tests). Only point this at repos you trust.
22
+ */
23
+ import { execFileSync } from "node:child_process";
24
+ import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
25
+ import { tmpdir } from "node:os";
26
+ import { join, resolve } from "node:path";
27
+ import chalk from "chalk";
28
+ import { ensureRepoCache } from "./seed.js";
29
+ const ADD_CASE_USAGE = `lastlight-evals add-case --pr <url> | --issue <url> [options]
30
+
31
+ Scaffold an eval instance from a real GitHub PR (code-fix) or issue (triage).
32
+
33
+ Options:
34
+ --pr <url> GitHub PR url → a code-fix (build) case
35
+ --issue <url> GitHub issue url → a triage case
36
+ --tier <name> Target tier dir (default: code-fix for --pr, triage for --issue)
37
+ --id <slug> instance_id (default: derived from repo + number)
38
+ --datasets <dir> Datasets root to write into (a <tier>/ subdir)
39
+ --overlay <dir> Write into <dir>/evals/datasets instead
40
+ --test-cmd "<cmd>" Held-out test command (default: node --test). Stored as test_cmd.
41
+ --setup-cmd "<cmd>" Install/build run before tests (e.g. "npm ci"). Stored as setup_cmd.
42
+ --no-validate Don't run the repo's tests to auto-detect FAIL_TO_PASS (just scaffold)
43
+ --dry-run Print the proposed instance JSON; don't write
44
+ -h, --help Show this help
45
+
46
+ The repo's tests/setup run real code — only use trusted repos.`;
47
+ // ── small shells ────────────────────────────────────────────────────────────
48
+ function sh(bin, args, cwd) {
49
+ return execFileSync(bin, args, { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 64 * 1024 * 1024 });
50
+ }
51
+ function ghJson(args) {
52
+ return JSON.parse(sh("gh", args));
53
+ }
54
+ /** Run a test/setup command, recovering output + exit status (never throws). */
55
+ function runCmd(argv, cwd) {
56
+ try {
57
+ const raw = execFileSync(argv[0], argv.slice(1), { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], timeout: 600_000, maxBuffer: 64 * 1024 * 1024 });
58
+ return { ok: true, raw };
59
+ }
60
+ catch (err) {
61
+ const e = err;
62
+ return { ok: false, raw: (e.stdout ?? "") + (e.stderr ?? "") };
63
+ }
64
+ }
65
+ const TAP_LINE = /^(ok|not ok)\s+\d+\s+-\s+(.+?)(?:\s+#.*)?$/;
66
+ function parseTap(raw) {
67
+ const out = new Map();
68
+ for (const line of raw.split("\n")) {
69
+ const m = line.trim().match(TAP_LINE);
70
+ if (m)
71
+ out.set(m[2].trim(), m[1] === "ok");
72
+ }
73
+ return out;
74
+ }
75
+ // ── helpers ─────────────────────────────────────────────────────────────────
76
+ function parseRepoFromUrl(url) {
77
+ const m = url.match(/github\.com[/:]+([^/]+)\/([^/]+)\/(?:pull|issues)\/(\d+)/i);
78
+ if (!m)
79
+ throw new Error(`Not a GitHub PR/issue url: ${url}`);
80
+ return { owner: m[1], name: m[2].replace(/\.git$/, ""), number: Number(m[3]) };
81
+ }
82
+ function slugify(s) {
83
+ return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60);
84
+ }
85
+ const TEST_PATH = /(^|\/)(tests?|__tests__|spec)\/|[._-](test|spec)\.[a-z0-9]+$/i;
86
+ function isTestPath(p) {
87
+ return TEST_PATH.test(p);
88
+ }
89
+ /** Split argv from a `--test-cmd "npm test"` style flag (whitespace split). */
90
+ function parseCmd(s) {
91
+ if (!s)
92
+ return undefined;
93
+ const parts = s.trim().split(/\s+/).filter(Boolean);
94
+ return parts.length ? parts : undefined;
95
+ }
96
+ /** Resolve the datasets root to write the tier into. */
97
+ function resolveWriteRoot(opts) {
98
+ if (opts.datasets)
99
+ return resolve(opts.datasets);
100
+ if (opts.overlay)
101
+ return resolve(opts.overlay, "evals", "datasets");
102
+ if (existsSync(resolve("datasets")))
103
+ return resolve("datasets");
104
+ return resolve("evals", "datasets");
105
+ }
106
+ /** Append (or replace by id) an instance into `<root>/<tier>/instances.json`,
107
+ * creating the tier dir + a `tier.json` when absent. */
108
+ function writeInstance(root, tier, defaultWorkflow, inst) {
109
+ const tierDir = join(root, tier);
110
+ mkdirSync(tierDir, { recursive: true });
111
+ const tierJson = join(tierDir, "tier.json");
112
+ if (!existsSync(tierJson)) {
113
+ writeFileSync(tierJson, JSON.stringify({ name: tier, defaultWorkflow, description: `${tier} cases.` }, null, 2) + "\n");
114
+ }
115
+ const instancesPath = join(tierDir, "instances.json");
116
+ const arr = existsSync(instancesPath)
117
+ ? JSON.parse(readFileSync(instancesPath, "utf8"))
118
+ : [];
119
+ const at = arr.findIndex((i) => i.instance_id === inst.instance_id);
120
+ if (at >= 0)
121
+ arr[at] = inst;
122
+ else
123
+ arr.push(inst);
124
+ writeFileSync(instancesPath, JSON.stringify(arr, null, 2) + "\n");
125
+ return instancesPath;
126
+ }
127
+ async function fromPr(url, o) {
128
+ const { owner, name } = parseRepoFromUrl(url);
129
+ const repo = `${owner}/${name}`;
130
+ console.log(chalk.dim(`Resolving PR ${repo}#${parseRepoFromUrl(url).number}…`));
131
+ const pr = ghJson([
132
+ "pr", "view", url,
133
+ "--json", "number,title,body,baseRefName,headRefName,headRefOid,url,closingIssuesReferences",
134
+ ]);
135
+ // Mirror the repo locally and pull in the PR head ref (it may live on a fork).
136
+ const mirror = ensureRepoCache({ repo });
137
+ const headRef = `refs/eval/pr-${pr.number}`;
138
+ sh("git", ["fetch", "--quiet", "origin", `pull/${pr.number}/head:${headRef}`], mirror);
139
+ const head = pr.headRefOid || sh("git", ["rev-parse", headRef], mirror).trim();
140
+ // Make sure the base branch is present (default mirror has refs/heads/*).
141
+ const base = sh("git", ["merge-base", `refs/heads/${pr.baseRefName}`, head], mirror).trim();
142
+ // Split the change into held-out tests vs the rest (gold patch, reference only).
143
+ const changed = sh("git", ["diff", "--name-only", base, head], mirror).split("\n").map((s) => s.trim()).filter(Boolean);
144
+ const testFiles = changed.filter(isTestPath);
145
+ const codeFiles = changed.filter((f) => !isTestPath(f));
146
+ const testPatch = testFiles.length ? sh("git", ["diff", base, head, "--", ...testFiles], mirror) : "";
147
+ const goldPatch = codeFiles.length ? sh("git", ["diff", base, head, "--", ...codeFiles], mirror) : "";
148
+ if (!testFiles.length) {
149
+ console.log(chalk.yellow("⚠ No test files detected in the PR diff. The held-out tests heuristic found nothing —"));
150
+ console.log(chalk.yellow(" set them by hand (test_patch) or rely on the in-repo tests via --test-cmd."));
151
+ }
152
+ // Auto-detect FAIL_TO_PASS / PASS_TO_PASS by running the tests at base (with
153
+ // the held-out tests applied) → red, then at head → green.
154
+ let failToPass = [];
155
+ let passToPass = [];
156
+ if (o.validate) {
157
+ const verdicts = validate({ mirror, base, head, testPatch, testCmd: o.testCmd, setupCmd: o.setupCmd });
158
+ failToPass = verdicts.failToPass;
159
+ passToPass = verdicts.passToPass;
160
+ if (verdicts.note)
161
+ console.log(chalk.yellow(`⚠ ${verdicts.note}`));
162
+ }
163
+ else {
164
+ console.log(chalk.dim("Skipping test validation (--no-validate) — FAIL_TO_PASS left empty (suite mode)."));
165
+ }
166
+ // Issue fixture: the linked issue if the PR closes one, else the PR itself.
167
+ const linked = pr.closingIssuesReferences?.[0];
168
+ const issueNumber = linked?.number ?? pr.number;
169
+ const issue = {
170
+ number: issueNumber,
171
+ title: linked?.title ?? pr.title,
172
+ body: linked?.body ?? pr.body ?? "",
173
+ labels: ["bug", "ready-for-agent"],
174
+ user: "reporter",
175
+ };
176
+ const id = o.id ?? `codefix__${slugify(name)}-pr${pr.number}`;
177
+ const inst = {
178
+ instance_id: id,
179
+ repo,
180
+ workflow: "build",
181
+ base_commit: base,
182
+ head_commit: head,
183
+ problem_statement: linked ? `${linked.title}\n\n${linked.body ?? ""}`.trim() : `${pr.title}\n\n${pr.body ?? ""}`.trim(),
184
+ ...(goldPatch ? { patch: goldPatch } : {}),
185
+ ...(testPatch ? { test_patch: testPatch } : {}),
186
+ FAIL_TO_PASS: failToPass,
187
+ PASS_TO_PASS: passToPass,
188
+ ...(o.testCmd ? { test_cmd: o.testCmd } : {}),
189
+ ...(o.setupCmd ? { setup_cmd: o.setupCmd } : {}),
190
+ issue,
191
+ expect_github: { pr_opened: { base: pr.baseRefName, head_is_branch: true } },
192
+ };
193
+ return emit(inst, "code-fix", "build", o);
194
+ }
195
+ /** Run the held-out tests at base (red) and head (green); diff TAP to verdicts. */
196
+ function validate(opts) {
197
+ const tmp = mkdtempSync(join(tmpdir(), "ll-addcase-"));
198
+ const wt = join(tmp, "wt");
199
+ console.log(chalk.dim("Validating: running the repo's tests at base (red) and head (green)…"));
200
+ try {
201
+ sh("git", ["worktree", "add", "--quiet", "--detach", wt, opts.base], opts.mirror);
202
+ const run = () => {
203
+ if (opts.setupCmd)
204
+ runCmd(opts.setupCmd, wt);
205
+ const argv = opts.testCmd ?? defaultTestArgv(wt);
206
+ return runCmd(argv, wt);
207
+ };
208
+ // Base + held-out tests applied → expect failures.
209
+ if (opts.testPatch) {
210
+ const pf = join(wt, ".eval-test.patch");
211
+ writeFileSync(pf, opts.testPatch);
212
+ try {
213
+ sh("git", ["apply", pf], wt);
214
+ }
215
+ catch {
216
+ return { failToPass: [], passToPass: [], note: "Could not apply test_patch onto base; verify FAIL_TO_PASS manually." };
217
+ }
218
+ rmSync(pf, { force: true });
219
+ }
220
+ const baseTap = parseTap(run().raw);
221
+ // Head state already includes the tests → expect green.
222
+ sh("git", ["checkout", "--quiet", "--force", opts.head], wt);
223
+ const headRun = run();
224
+ const headTap = parseTap(headRun.raw);
225
+ if (headTap.size === 0) {
226
+ // No TAP names → suite mode. Resolved is graded on exit code at run time.
227
+ return {
228
+ failToPass: [],
229
+ passToPass: [],
230
+ note: headRun.ok
231
+ ? "No TAP test names parsed — case will use suite mode (graded on the test command's exit code)."
232
+ : "Tests did not pass at head and emitted no TAP — check the test command / setup; case left in suite mode.",
233
+ };
234
+ }
235
+ const failToPass = [];
236
+ const passToPass = [];
237
+ for (const [naam, greenAtHead] of headTap) {
238
+ if (!greenAtHead)
239
+ continue;
240
+ if (baseTap.get(naam) === false || !baseTap.has(naam))
241
+ failToPass.push(naam);
242
+ else
243
+ passToPass.push(naam);
244
+ }
245
+ if (!failToPass.length) {
246
+ return { failToPass, passToPass, note: "No test flipped red→green — the fix may not be exercised by these tests; review before using." };
247
+ }
248
+ return { failToPass, passToPass };
249
+ }
250
+ catch (err) {
251
+ return { failToPass: [], passToPass: [], note: `Validation failed (${err.message}); fill FAIL_TO_PASS manually.` };
252
+ }
253
+ finally {
254
+ try {
255
+ sh("git", ["worktree", "remove", "--force", wt], opts.mirror);
256
+ }
257
+ catch {
258
+ /* best effort */
259
+ }
260
+ rmSync(tmp, { recursive: true, force: true });
261
+ }
262
+ }
263
+ function defaultTestArgv(dir) {
264
+ const files = listTestFiles(dir);
265
+ return [process.execPath, "--test", "--test-reporter=tap", "--experimental-strip-types", ...files];
266
+ }
267
+ function listTestFiles(dir, prefix = "") {
268
+ const out = [];
269
+ let entries = [];
270
+ try {
271
+ entries = readdirSync(dir);
272
+ }
273
+ catch {
274
+ return out;
275
+ }
276
+ for (const ent of entries) {
277
+ if (ent === "node_modules" || ent === ".git")
278
+ continue;
279
+ const rel = prefix ? `${prefix}/${ent}` : ent;
280
+ const abs = join(dir, ent);
281
+ let isDir = false;
282
+ try {
283
+ isDir = statSync(abs).isDirectory();
284
+ }
285
+ catch {
286
+ continue;
287
+ }
288
+ if (isDir)
289
+ out.push(...listTestFiles(abs, rel));
290
+ else if (/\.test\.(ts|tsx|mts|js|mjs)$/.test(ent))
291
+ out.push(rel);
292
+ }
293
+ return out;
294
+ }
295
+ /** Best-effort: who applied which label (the human triage decision). Returns a
296
+ * net label→actor map (labels later removed are dropped). Empty if the events
297
+ * API isn't reachable. */
298
+ function labelActors(repo, number) {
299
+ const out = new Map();
300
+ try {
301
+ const events = ghJson(["api", "--paginate", `repos/${repo}/issues/${number}/events`]);
302
+ for (const e of events) {
303
+ const ln = e.label?.name;
304
+ if (!ln)
305
+ continue;
306
+ if (e.event === "labeled")
307
+ out.set(ln, e.actor?.login ?? "?");
308
+ else if (e.event === "unlabeled")
309
+ out.delete(ln);
310
+ }
311
+ }
312
+ catch {
313
+ /* events API unavailable — fall back to bare label names */
314
+ }
315
+ return out;
316
+ }
317
+ async function fromIssue(url, o) {
318
+ const { owner, name } = parseRepoFromUrl(url);
319
+ const repo = `${owner}/${name}`;
320
+ const iv = ghJson(["issue", "view", url, "--json", "number,title,body,url,state,labels,comments,author"]);
321
+ const labels = (iv.labels ?? []).map((l) => l.name);
322
+ const comments = (iv.comments ?? []).filter((c) => c.body?.trim());
323
+ const closed = (iv.state ?? "").toUpperCase() === "CLOSED";
324
+ const issueAuthor = iv.author?.login ?? "reporter";
325
+ const actors = labelActors(repo, iv.number);
326
+ const id = o.id ?? `triage__${slugify(name)}-${iv.number}`;
327
+ const inst = {
328
+ instance_id: id,
329
+ repo,
330
+ workflow: "issue-triage",
331
+ problem_statement: `${iv.title}\n\n${iv.body ?? ""}`.trim(),
332
+ // Seed the issue as the agent would FIRST see it: its content, but WITHOUT
333
+ // the triage labels (those are the gold the agent must reproduce). The skill
334
+ // can add back any genuinely pre-existing, non-triage label.
335
+ issue: {
336
+ number: iv.number,
337
+ title: iv.title,
338
+ body: iv.body ?? "",
339
+ labels: [],
340
+ user: issueAuthor,
341
+ },
342
+ // gradeTriage maps category/state to label strings — which depends on the
343
+ // deployment's taxonomy, so the skill assigns them from `labels` below.
344
+ triage_gold: {},
345
+ // The human outcome to reproduce: the labels that were applied (+ closed).
346
+ expect_github: {
347
+ ...(labels.length ? { labels_added: labels } : {}),
348
+ ...(closed ? { issue_closed: true } : {}),
349
+ },
350
+ };
351
+ // Evidence block — the raw triage signal the skill turns into triage_gold and
352
+ // (optionally) a comment_matches assertion.
353
+ console.log(chalk.bold(`\n# Triage evidence for ${repo}#${iv.number}`));
354
+ if (labels.length) {
355
+ console.log(chalk.dim("\nLabels applied (→ split into triage_gold.category / .state):"));
356
+ for (const l of labels)
357
+ console.log(` • ${l}${actors.has(l) ? chalk.dim(` (by ${actors.get(l)})`) : ""}`);
358
+ }
359
+ else {
360
+ console.log(chalk.yellow("\n⚠ No labels on the issue — no labels_added expectation; set triage_gold by hand."));
361
+ }
362
+ if (comments.length) {
363
+ console.log(chalk.dim(`\nReviewer comments (${comments.length}) — use to seed context or a comment_matches regex:`));
364
+ for (const c of comments.slice(0, 8)) {
365
+ const who = c.author?.login ?? "?";
366
+ const first = (c.body ?? "").trim().split("\n")[0].slice(0, 120);
367
+ console.log(` ${chalk.cyan(who)}: ${first}`);
368
+ }
369
+ if (comments.length > 8)
370
+ console.log(chalk.dim(` …and ${comments.length - 8} more`));
371
+ }
372
+ console.log(chalk.yellow("\n⚠ triage_gold is empty — assign category/state from the labels above per the deployment's taxonomy before running."));
373
+ return emit(inst, "triage", "issue-triage", o);
374
+ }
375
+ // ── output ──────────────────────────────────────────────────────────────────
376
+ function emit(inst, defaultTier, defaultWorkflow, o) {
377
+ const tier = o.tier ?? defaultTier;
378
+ if (o.dryRun) {
379
+ console.log(chalk.bold(`\n# ${inst.instance_id} → ${tier}/instances.json (dry-run)\n`));
380
+ console.log(JSON.stringify(inst, null, 2));
381
+ return 0;
382
+ }
383
+ const root = resolveWriteRoot(o);
384
+ const path = writeInstance(root, tier, defaultWorkflow, inst);
385
+ console.log(chalk.green(`✓ wrote ${inst.instance_id} → ${path}`));
386
+ return 0;
387
+ }
388
+ export async function runAddCase(args = []) {
389
+ if (args.includes("-h") || args.includes("--help")) {
390
+ console.log(ADD_CASE_USAGE);
391
+ return 0;
392
+ }
393
+ const val = (name) => {
394
+ for (let i = 0; i < args.length; i++) {
395
+ if (args[i] === name)
396
+ return args[i + 1];
397
+ if (args[i].startsWith(`${name}=`))
398
+ return args[i].slice(name.length + 1);
399
+ }
400
+ return undefined;
401
+ };
402
+ const pr = val("--pr");
403
+ const issue = val("--issue");
404
+ const o = {
405
+ tier: val("--tier"),
406
+ id: val("--id"),
407
+ datasets: val("--datasets"),
408
+ overlay: val("--overlay"),
409
+ testCmd: parseCmd(val("--test-cmd")),
410
+ setupCmd: parseCmd(val("--setup-cmd")),
411
+ validate: !args.includes("--no-validate"),
412
+ dryRun: args.includes("--dry-run"),
413
+ };
414
+ if ((pr && issue) || (!pr && !issue)) {
415
+ console.error("add-case: pass exactly one of --pr <url> or --issue <url>.\n");
416
+ console.error(ADD_CASE_USAGE);
417
+ return 2;
418
+ }
419
+ // `gh` is required for PR/issue metadata — check presence AND auth up front so
420
+ // a missing/unauthenticated setup fails cleanly before any work, rather than
421
+ // partway through with a raw "Command failed" from the first API call.
422
+ try {
423
+ sh("gh", ["--version"]);
424
+ }
425
+ catch {
426
+ console.error("add-case needs the GitHub CLI (`gh`) on PATH. Install it from https://cli.github.com, then run `gh auth login`.");
427
+ return 2;
428
+ }
429
+ try {
430
+ sh("gh", ["auth", "status"]);
431
+ }
432
+ catch {
433
+ console.error("add-case needs `gh` authenticated to read PRs/issues — run `gh auth login` and retry.");
434
+ return 2;
435
+ }
436
+ try {
437
+ return pr ? await fromPr(pr, o) : await fromIssue(issue, o);
438
+ }
439
+ catch (err) {
440
+ console.error(chalk.red(`add-case failed: ${err.message}`));
441
+ return 1;
442
+ }
443
+ }
444
+ //# sourceMappingURL=add-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-case.js","sourceRoot":"","sources":["../src/add-case.ts"],"names":[],"mappings":"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"}
package/dist/grade.js CHANGED
@@ -81,32 +81,70 @@ export function gradeExecution(opts) {
81
81
  writeFileSync(patchFile, opts.testPatch);
82
82
  execFileSync("git", ["apply", patchFile], { cwd: opts.workDir, stdio: ["ignore", "pipe", "pipe"] });
83
83
  }
84
- const testFiles = listTestFiles(opts.workDir);
85
- const cmd = opts.testCmd ?? [
84
+ let setupLog = "";
85
+ if (opts.setupCmd?.length) {
86
+ const [bin, ...rest] = opts.setupCmd;
87
+ try {
88
+ setupLog = execFileSync(bin, rest, {
89
+ cwd: opts.workDir,
90
+ env: process.env,
91
+ stdio: ["ignore", "pipe", "pipe"],
92
+ timeout: 600_000,
93
+ }).toString();
94
+ }
95
+ catch (err) {
96
+ const e = err;
97
+ setupLog = (e.stdout?.toString() ?? "") + (e.stderr?.toString() ?? "");
98
+ }
99
+ }
100
+ // The default runner emits TAP we can parse per-test; a custom `test_cmd` may
101
+ // not — that's fine, suite mode below falls back to the exit code.
102
+ const isDefaultRunner = !opts.testCmd;
103
+ const testFiles = isDefaultRunner ? listTestFiles(opts.workDir) : [];
104
+ const argv = opts.testCmd ?? [
105
+ process.execPath,
86
106
  "--test",
87
107
  "--test-reporter=tap",
88
108
  "--experimental-strip-types",
89
109
  ...testFiles,
90
110
  ];
91
111
  let raw = "";
112
+ let exitOk = false;
92
113
  try {
93
- raw = execFileSync(process.execPath, cmd, {
114
+ raw = execFileSync(argv[0], argv.slice(1), {
94
115
  cwd: opts.workDir,
95
116
  env: process.env,
96
117
  stdio: ["ignore", "pipe", "pipe"],
97
118
  timeout: 120_000,
98
119
  }).toString();
120
+ exitOk = true;
99
121
  }
100
122
  catch (err) {
101
- // node --test exits non-zero on any failing test; its stdout still holds TAP.
123
+ // A failing test run exits non-zero; its stdout still holds the TAP/log.
102
124
  const e = err;
103
125
  raw = (e.stdout?.toString() ?? "") + (e.stderr?.toString() ?? "");
104
126
  }
105
127
  const passed = parseTap(raw);
106
- const fail = opts.failToPass.map((id) => ({ id, pass: passed.get(id) === true }));
107
- const pass = opts.passToPass.map((id) => ({ id, pass: passed.get(id) === true }));
108
- const resolved = fail.every((t) => t.pass) && pass.every((t) => t.pass) && opts.failToPass.length > 0;
109
- return { resolved, failToPass: fail, passToPass: pass, raw };
128
+ // Named mode when at least one FAIL_TO_PASS id shows up in the TAP stream;
129
+ // otherwise suite mode — grade on the command's exit code.
130
+ const named = opts.failToPass.length > 0 && opts.failToPass.some((id) => passed.has(id));
131
+ let fail;
132
+ let pass;
133
+ let resolved;
134
+ if (named) {
135
+ fail = opts.failToPass.map((id) => ({ id, pass: passed.get(id) === true }));
136
+ pass = opts.passToPass.map((id) => ({ id, pass: passed.get(id) === true }));
137
+ resolved = fail.every((t) => t.pass) && pass.every((t) => t.pass);
138
+ }
139
+ else {
140
+ // Suite mode: the held-out tests pass iff the command exited 0. Report each
141
+ // declared id against that single outcome; honor any PASS_TO_PASS names that
142
+ // did surface in TAP.
143
+ fail = opts.failToPass.map((id) => ({ id, pass: exitOk }));
144
+ pass = opts.passToPass.map((id) => ({ id, pass: passed.has(id) ? passed.get(id) === true : exitOk }));
145
+ resolved = exitOk && pass.every((t) => t.pass);
146
+ }
147
+ return { resolved, failToPass: fail, passToPass: pass, raw: setupLog ? `${setupLog}\n${raw}` : raw };
110
148
  }
111
149
  function parseTap(raw) {
112
150
  const out = new Map();
package/dist/grade.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"grade.js","sourceRoot":"","sources":["../src/grade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grade.js","sourceRoot":"","sources":["../src/grade.ts"],"names":[],"mappings":"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"}