litmus-cli 1.4.0-dogfood.3 → 1.4.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
@@ -93,12 +93,41 @@ GitHub Actions workflow. **Do not run `npm publish` by hand** — the workflow
93
93
  publishes via npm OIDC trusted publishing (no npm login or token needed), and a
94
94
  manual publish skips the build/test gate and the GitHub release.
95
95
 
96
+ ### Two release lines — read this before cutting anything
97
+
98
+ The dist-tag is derived from the **version string**, not from a flag: a
99
+ prerelease like `1.4.0-dogfood.3` publishes under `dogfood`, a stable `1.3.13`
100
+ publishes to `latest`. So the version number *is* the decision about who gets it.
101
+
102
+ - **`latest` (1.3.x) — what candidates install.** `main` is **not** on this line;
103
+ `main` carries the `1.4.0-dogfood` track with unreleased Codespaces v2
104
+ (`litmus connect`, `litmus push`). Cutting a stable release from `main` would
105
+ put v2's surface in front of every candidate. A candidate-facing fix therefore
106
+ ships as a **backport**: branch off the newest `cli/v1.3.*` tag, `git
107
+ cherry-pick -x` the merged commits, bump, tag. Release branches are never
108
+ merged back to `main`.
109
+ - **`dogfood` (1.4.0-dogfood.N)** — cut from `main` for internal testing.
110
+
111
+ **Merging to `main` releases nothing**, and git does not announce which merged
112
+ fixes are still waiting for a cut. To see the backlog:
113
+
114
+ ```bash
115
+ cli/scripts/pending-backports.sh
116
+ ```
117
+
118
+ It reads provenance from the `(cherry picked from commit …)` lines that
119
+ `cherry-pick -x` writes, so **always pass `-x`** when backporting — that stamp is
120
+ what keeps the accounting exact. Anything that should never reach the 1.3.x line,
121
+ or whose content already shipped there under a different SHA, goes in
122
+ `cli/scripts/no-backport.txt` with a reason so the list stays actionable.
123
+
96
124
  To cut a release:
97
125
 
98
- 1. Bump the version in `cli/package.json` and merge it to `main` through a PR
99
- (`main` is protected, so direct pushes are rejected).
126
+ 1. Set the version in `cli/package.json` on the branch you are tagging — the
127
+ backport branch for a 1.3.x release, or `main` (through a PR, since `main` is
128
+ protected) for a dogfood cut.
100
129
  2. Push a tag matching `cli/vX.Y.Z`, where `X.Y.Z` **exactly equals** the version
101
- you just merged into `cli/package.json`:
130
+ at the tagged commit:
102
131
 
103
132
  ```bash
104
133
  git tag cli/v1.3.2
@@ -30,5 +30,5 @@ export declare function buildSshConfigBlock(alias: string, keyPath: string, p: P
30
30
  export declare function upsertSshConfigContent(existing: string, alias: string, block: string): string;
31
31
  /** Short, stable alias from the workspace hostname (or token as a fallback). */
32
32
  export declare function aliasFor(sshHostname: string | null | undefined, token: string): string;
33
- export declare function runConnect(token: string): Promise<void>;
33
+ export declare function runConnect(token: string, ideOpt?: string): Promise<void>;
34
34
  //# sourceMappingURL=connect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAQD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAwBtD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAiCxF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAc7F;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItF;AAqED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0H7D"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAQD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAwBtD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAiCxF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAc7F;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItF;AAoJD,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsK9E"}
@@ -1,5 +1,6 @@
1
1
  import os from "os";
2
2
  import path from "path";
3
+ import readline from "readline";
3
4
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
4
5
  import { execFileSync, spawn } from "child_process";
5
6
  import chalk from "chalk";
@@ -58,10 +59,8 @@ export function parseSshCommand(cmd) {
58
59
  jump = toks[++i];
59
60
  continue;
60
61
  }
61
- if (t.startsWith("-")) {
62
- i++;
63
- continue;
64
- } // unknown flag with a value: skip both
62
+ if (t.startsWith("-"))
63
+ continue; // unknown flag: skip it only (don't assume it takes a value; -p/-J are handled above)
65
64
  if (t.includes("@"))
66
65
  target = t;
67
66
  }
@@ -194,7 +193,81 @@ function launchVsCode(alias) {
194
193
  });
195
194
  child.unref();
196
195
  }
197
- export async function runConnect(token) {
196
+ /**
197
+ * Resolve which editor to open: an explicit --ide flag wins; otherwise prompt.
198
+ * Falls back to native VS Code when the flag is unknown or stdin isn't a TTY
199
+ * (piped / CI), so scripted runs never block on the prompt.
200
+ */
201
+ async function resolveIde(flag) {
202
+ const norm = (flag ?? "").trim().toLowerCase();
203
+ if (norm === "vscode" || norm === "browser" || norm === "ssh")
204
+ return norm;
205
+ if (norm)
206
+ warn(`Unknown --ide "${flag}" (use vscode | browser | ssh) — asking instead.`);
207
+ if (!process.stdin.isTTY)
208
+ return "vscode";
209
+ return promptIde();
210
+ }
211
+ function promptIde() {
212
+ console.log();
213
+ console.log("Where do you want to open your workspace?");
214
+ console.log(` ${chalk.bold("1")}) VS Code — native, via Remote-SSH ${chalk.dim("[default]")}`);
215
+ console.log(` ${chalk.bold("2")}) Browser IDE — nothing to install locally`);
216
+ console.log(` ${chalk.bold("3")}) SSH — just print the command for your terminal`);
217
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
218
+ return new Promise((resolve) => {
219
+ rl.question("Choice [1]: ", (ans) => {
220
+ rl.close();
221
+ const a = ans.trim();
222
+ resolve(a === "2" ? "browser" : a === "3" ? "ssh" : "vscode");
223
+ });
224
+ });
225
+ }
226
+ /** Open a URL in the user's default browser. Best-effort, cross-platform. */
227
+ function openBrowser(url) {
228
+ const spec = process.platform === "darwin" ? ["open", [url]]
229
+ : process.platform === "win32" ? ["cmd", ["/c", "start", "", url]]
230
+ : ["xdg-open", [url]];
231
+ const fallback = () => console.log(`Open this in your browser:\n ${url}`);
232
+ try {
233
+ const child = spawn(spec[0], spec[1], { detached: true, stdio: "ignore" });
234
+ // spawn reports a missing opener ASYNCHRONOUSLY via an 'error' event, not a
235
+ // sync throw — without this listener an ENOENT (e.g. no xdg-open on a minimal
236
+ // Linux / WSL / headless box) becomes an uncaughtException that crashes the
237
+ // CLI right after the success line. The try/catch alone can't see it.
238
+ child.on("error", fallback);
239
+ child.unref();
240
+ }
241
+ catch {
242
+ fallback();
243
+ }
244
+ }
245
+ /**
246
+ * Drop any stale known_hosts entries for this workspace's target + bastion.
247
+ * Every re-provision gives the container a fresh SSH host key, so a returning
248
+ * candidate's ~/.ssh/known_hosts holds the OLD key and `accept-new` refuses the
249
+ * changed key ("Remote host key has changed, port forwarding is disabled").
250
+ * Pruning lets `accept-new` re-pin the current key. Best-effort — a missing
251
+ * entry or missing ssh-keygen is a no-op, never fatal (ENG-1221).
252
+ */
253
+ function pruneStaleHostKeys(p) {
254
+ const targets = [p.host];
255
+ // Direct-port form (v2 dark fallback, `ssh -p <port>`) is stored in
256
+ // known_hosts as [host]:port, so a bare-host -R would miss it.
257
+ if (p.port)
258
+ targets.push(`[${p.host}]:${p.port}`);
259
+ if (p.jumpHost)
260
+ targets.push(p.jumpPort ? `[${p.jumpHost}]:${p.jumpPort}` : p.jumpHost);
261
+ for (const t of targets) {
262
+ try {
263
+ execFileSync("ssh-keygen", ["-R", t], { stdio: "ignore" });
264
+ }
265
+ catch {
266
+ // no entry to remove / no ssh-keygen — nothing to do.
267
+ }
268
+ }
269
+ }
270
+ export async function runConnect(token, ideOpt) {
198
271
  const apiBase = resolveApiBase(process.env.LITMUS_API_URL);
199
272
  setErrorContext({ token, apiBase });
200
273
  // 1. Authenticate + learn the backend URL (also flips pending -> in_progress).
@@ -214,6 +287,9 @@ export async function runConnect(token) {
214
287
  return;
215
288
  }
216
289
  const backendUrl = meta.backendUrl;
290
+ // Pick the editor up front (flag or interactive prompt) so the choice is made
291
+ // before the boot wait, not after.
292
+ const ide = await resolveIde(ideOpt);
217
293
  // 2. Ensure a local SSH key (private key never leaves this machine).
218
294
  try {
219
295
  ensureSshKey(KEY_PATH);
@@ -257,23 +333,56 @@ export async function runConnect(token) {
257
333
  catch {
258
334
  // transient — keep polling
259
335
  }
260
- if (conn?.healthy && conn.ssh_command)
336
+ // VS Code / SSH need the ssh_command. The browser URL is config-derived (it
337
+ // appears together with `running`, not on a timer), so break on `healthy`
338
+ // alone — the branch below then gives a fast, specific message when no URL is
339
+ // configured, instead of spinning the full 120s on a v1 / pre-ingress box.
340
+ const ready = conn?.healthy && (ide === "browser" || !!conn.ssh_command);
341
+ if (ready)
261
342
  break;
262
343
  boot.text = `Starting your workspace... (${conn?.workspace_status ?? "provisioning"})`;
263
344
  await sleep(2000);
264
345
  }
265
- if (!conn?.healthy || !conn.ssh_command) {
346
+ if (!conn?.healthy || (ide !== "browser" && !conn.ssh_command)) {
266
347
  boot.fail("Workspace didn't become ready in time");
267
348
  fatal("The workspace is taking longer than expected to start.", "Run `litmus connect` again in a minute. If it keeps happening, contact the company.", { severity: "warning" });
268
349
  return;
269
350
  }
270
351
  boot.succeed("Workspace ready");
271
- // 5. Write the ProxyJump SSH config for native VS Code.
352
+ // Browser IDE: no local SSH / VS Code needed — just open the signed URL.
353
+ if (ide === "browser") {
354
+ if (!conn.browser_ide_url) {
355
+ fatal("The browser IDE isn't available for this workspace yet.", "Open it in native VS Code instead: `litmus connect --ide vscode`.", { severity: "warning" });
356
+ return;
357
+ }
358
+ openBrowser(conn.browser_ide_url);
359
+ success("Opening your workspace in the browser");
360
+ console.log(chalk.dim(` ${conn.browser_ide_url}`));
361
+ return;
362
+ }
363
+ if (!conn.ssh_command) {
364
+ // Unreachable for vscode/ssh (the poll above required ssh_command) — this
365
+ // narrows the type for TS and fails safe.
366
+ fatal("The workspace didn't report an SSH endpoint.", "Run `litmus connect` again in a moment.", { severity: "warning" });
367
+ return;
368
+ }
369
+ // 5. Write the ProxyJump SSH config (native VS Code + the ssh option share it).
370
+ // Prune stale host keys first so a re-provisioned container's new key is
371
+ // accepted, not refused (ENG-1221).
272
372
  const parsed = parseSshCommand(conn.ssh_command);
273
373
  const alias = aliasFor(conn.ssh_hostname, token);
374
+ pruneStaleHostKeys(parsed);
274
375
  const block = buildSshConfigBlock(alias, KEY_PATH, parsed);
275
376
  const cfgPath = writeSshConfig(alias, block);
276
377
  info(`SSH config written to ${cfgPath} (Host "${alias}")`);
378
+ // SSH option: hand over the command and stop (no editor launch).
379
+ if (ide === "ssh") {
380
+ console.log();
381
+ success("Your workspace is ready. Connect from your terminal:");
382
+ console.log(chalk.cyan(` ssh ${alias}`));
383
+ console.log(chalk.dim(` (equivalently: ${conn.ssh_command})`));
384
+ return;
385
+ }
277
386
  // 6. Launch native VS Code — ensuring Remote-SSH is installed first — or print
278
387
  // how to connect if the `code` CLI is absent.
279
388
  if (!hasCodeCli()) {
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,29 @@
1
1
  export declare function runInit(token: string): Promise<void>;
2
+ /**
3
+ * Set up AI prompt tracking for Claude Code, OpenAI Codex CLI, and GitHub
4
+ * Copilot CLI.
5
+ *
6
+ * Claude Code (ENG-771): prefer a user-scope hook in ~/.claude/settings.json so
7
+ * the logger reference is an absolute path. With an absolute logger path, the
8
+ * hook can use the active-assessments registry as a fallback when the
9
+ * candidate's Claude Code cwd is outside the assessment dir (the actual
10
+ * silent-capture bug). If user-scope install fails (sandboxed HOME, etc.) we
11
+ * fall back to a project-scope `.claude/settings.local.json` with a relative
12
+ * logger path — fires fine but only captures when Claude Code's cwd happens to
13
+ * be inside the assessment.
14
+ *
15
+ * Returns the install mode + Codex install status so the caller can surface the
16
+ * right follow-up message.
17
+ *
18
+ * Exported for tests: the logger-placement rule (ENG-1297) is only observable
19
+ * at this level, not through the individual installers.
20
+ */
21
+ export declare function setupAiTracking(targetDir: string): {
22
+ mode: "user" | "project";
23
+ codexInstalled: boolean;
24
+ cursorConfigReplaced: boolean;
25
+ cursorBackupPath?: string;
26
+ copilotConfigReplaced: boolean;
27
+ copilotBackupPath?: string;
28
+ };
2
29
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAmBA,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsP1D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAoBA,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+Q1D;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,oBAAoB,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,CA8H9N"}
@@ -12,8 +12,9 @@ import { startTracker } from "../lib/tracker.js";
12
12
  import { detectProject } from "../lib/detect-project.js";
13
13
  import { fatal, success, info, warn, setErrorContext, reportSuccess, FALLBACK_URL } from "../lib/errors.js";
14
14
  import { resolveApiBase } from "../lib/api-base.js";
15
+ import { CLI_VERSION } from "../lib/version.js";
15
16
  import { formatDeadlinePT } from "../lib/format-time.js";
16
- import { installUserScopeClaudeHook, installUserScopeCodexHook, addActiveAssessment } from "../lib/ai-tracking.js";
17
+ import { installUserScopeClaudeHook, installUserScopeCodexHook, installUserScopeCursorHook, installRepoScopeCopilotHook, USER_SCOPE_LOGGER, addActiveAssessment, removeActiveAssessment, quoteForShell, isOurEntry } from "../lib/ai-tracking.js";
17
18
  import { execSync } from "child_process";
18
19
  import { fileURLToPath } from "url";
19
20
  export async function runInit(token) {
@@ -139,10 +140,14 @@ export async function runInit(token) {
139
140
  walkthroughWindowMinutes: metadata.walkthroughWindowMinutes,
140
141
  apiBase,
141
142
  backendUrl: metadata.backendUrl,
143
+ cliVersion: CLI_VERSION,
142
144
  });
143
- // Step 6: Set up AI prompt tracking
144
- // Write transparency notices (committed in initial state — tamper-evident)
145
- // and hook configs for Claude Code, Copilot CLI, and Codex CLI.
145
+ // Step 6: Set up AI usage tracking
146
+ // Install prompt- AND response-capture hook configs (ENG-1323) for Claude
147
+ // Code, Codex, Cursor, and GitHub Copilot. (The transparency notices this comment used to promise
148
+ // were removed in e81ed8a28 — writing into CLAUDE.md/AGENTS.md polluted the
149
+ // candidate's agent context — so disclosure lives in the web flow, not in
150
+ // the assessment tree.)
146
151
  //
147
152
  // ENG-606: stop swallowing failures silently. Surface the error to the
148
153
  // candidate (so they can re-init if it matters) and drop a marker file
@@ -167,12 +172,33 @@ export async function runInit(token) {
167
172
  // Surface it so the candidate isn't surprised.
168
173
  console.log(chalk.dim(" If you use Codex, accept its one-time trust prompt on first prompt to enable capture."));
169
174
  }
175
+ // ENG-1323: verified against Copilot CLI 1.0.77 — it runs NO repo hooks
176
+ // (not even the prompt hook) until the folder is trusted, and says nothing
177
+ // when it skips them. Without this line a Copilot candidate looks like
178
+ // they never used AI at all.
179
+ console.log(chalk.dim(" If you use the Copilot CLI, accept its folder-trust prompt so your AI usage is recorded."));
180
+ if (result.cursorConfigReplaced) {
181
+ // Their ~/.cursor/hooks.json couldn't be parsed, so it could not be merged
182
+ // into and was replaced. We keep a copy, but replacing someone's editor
183
+ // config must never be silent — they may have had hooks of their own.
184
+ console.log();
185
+ console.log(chalk.yellow("Your ~/.cursor/hooks.json could not be parsed and was replaced."));
186
+ console.log(chalk.dim(` A copy was saved as ${result.cursorBackupPath ?? "~/.cursor/hooks.json.litmus-backup"} — if you`));
187
+ console.log(chalk.dim(" had your own Cursor hooks, restore them from there."));
188
+ }
189
+ if (result.copilotConfigReplaced) {
190
+ // Same rule as Cursor above: replacing a config we couldn't merge into is
191
+ // unavoidable, but it must never be silent.
192
+ console.log();
193
+ console.log(chalk.yellow("This project's .github/hooks/litmus.json could not be parsed and was replaced."));
194
+ console.log(chalk.dim(` A copy was saved as ${result.copilotBackupPath ?? "litmus.json.litmus-backup"}.`));
195
+ }
170
196
  }
171
197
  catch (err) {
172
198
  const message = err instanceof Error ? err.message : String(err);
173
199
  console.log();
174
200
  console.log(chalk.yellow("AI prompt tracking setup failed:"), message);
175
- console.log(chalk.dim(" Assessment will still work, but Claude Code / Copilot CLI prompts won't be captured."));
201
+ console.log(chalk.dim(" Assessment will still work, but Claude Code / Copilot CLI / Cursor activity won't be captured."));
176
202
  try {
177
203
  const litmusDir = path.join(targetDir, ".litmus");
178
204
  mkdirSync(litmusDir, { recursive: true });
@@ -260,18 +286,33 @@ export async function runInit(token) {
260
286
  *
261
287
  * Returns the install mode + Codex install status so the caller can surface the
262
288
  * right follow-up message.
289
+ *
290
+ * Exported for tests: the logger-placement rule (ENG-1297) is only observable
291
+ * at this level, not through the individual installers.
263
292
  */
264
- function setupAiTracking(targetDir) {
293
+ export function setupAiTracking(targetDir) {
265
294
  const litmusDir = path.join(targetDir, ".litmus");
266
295
  mkdirSync(litmusDir, { recursive: true });
267
296
  const __filename = fileURLToPath(import.meta.url);
268
297
  const __dirname = path.dirname(__filename);
269
298
  const hookLoggerSrc = path.join(__dirname, "..", "lib", "hook-logger.cjs");
270
- // Always keep a local copy of the logger inside .litmus/. It's part of the
271
- // submission ZIP and is the path the project-scope fallback references.
272
- if (existsSync(hookLoggerSrc)) {
273
- copyFileSync(hookLoggerSrc, path.join(litmusDir, "hook-logger.cjs"));
299
+ // Claim a registry slot BEFORE installing any hooks, not after.
300
+ //
301
+ // `litmus submit` uninstalls the user-scope hooks when the registry goes empty
302
+ // (removeActiveAssessment gates it). If a concurrent submit for a DIFFERENT
303
+ // assessment lands between our installs and our registration, it sees an empty
304
+ // registry and uninstalls the hooks we just wrote — the new assessment is left
305
+ // silently uncaptured. Registering first keeps the registry non-empty across
306
+ // that whole window, so a concurrent submit leaves our hooks alone.
307
+ //
308
+ // The reverse ordering risk is benign: a registry entry with no hooks yet just
309
+ // means nothing fires until the installs below finish.
310
+ let registered = false;
311
+ try {
312
+ addActiveAssessment(targetDir);
313
+ registered = true;
274
314
  }
315
+ catch { /* registry write failed — installs still proceed, cwd-only capture */ }
275
316
  // Claude Code: prefer user-scope.
276
317
  let mode = "user";
277
318
  try {
@@ -281,6 +322,13 @@ function setupAiTracking(targetDir) {
281
322
  }
282
323
  catch {
283
324
  mode = "project";
325
+ // Project scope references an assessment-local copy of the logger — the
326
+ // user-scope one at ~/.litmus may not exist on this path (an unwritable
327
+ // HOME is what usually lands us here). This is the ONLY mode that keeps a
328
+ // copy inside the assessment: the readable logger spells out the whole
329
+ // capture design, so it doesn't ship into every assessment by default
330
+ // (ENG-1297).
331
+ copyFileSync(hookLoggerSrc, path.join(litmusDir, "hook-logger.cjs"));
284
332
  writeProjectScopeClaudeHook(targetDir, litmusDir);
285
333
  }
286
334
  // Codex CLI: install user-scope hook at ~/.codex/hooks.json. Per the openai/codex
@@ -295,35 +343,78 @@ function setupAiTracking(targetDir) {
295
343
  catch {
296
344
  // Couldn't write ~/.codex/hooks.json — skip silently.
297
345
  }
298
- // GitHub Copilot CLI: .github/hooks/litmus.json (separate file — won't conflict).
299
- // ENG-771 Bug 2: event name is `userPromptSubmit`, not `userPromptSubmitted`.
300
- // The previous typo meant the Copilot CLI never recognized the hook.
301
- const ghHooksDir = path.join(targetDir, ".github", "hooks");
302
- mkdirSync(ghHooksDir, { recursive: true });
303
- writeFileSync(path.join(ghHooksDir, "litmus.json"), JSON.stringify({
304
- version: 1,
305
- hooks: {
306
- userPromptSubmit: [{
307
- type: "command",
308
- bash: "node .litmus/hook-logger.cjs copilot",
309
- powershell: "node .litmus/hook-logger.cjs copilot",
310
- timeoutSec: 5,
311
- }],
312
- },
313
- }, null, 2) + "\n");
346
+ // Cursor: install user-scope hook at ~/.cursor/hooks.json (`beforeSubmitPrompt`).
347
+ // Cursor's native agent runs model traffic on the candidate's own machine, so
348
+ // this hook is the ONLY way we ever see a native-Cursor prompt. Without it a
349
+ // Cursor candidate produces zero ai_prompt events, which drops the grader's
350
+ // Process dimension from their score entirely. Failure here is non-fatal:
351
+ // candidates not using Cursor are unaffected.
352
+ let cursorConfigReplaced = false;
353
+ let cursorBackupPath;
354
+ try {
355
+ // hookLoggerSrc is passed so the install can guarantee the logger exists at
356
+ // USER_SCOPE_LOGGER before writing a hook that points at it. That copy
357
+ // normally happens inside installUserScopeClaudeHook above, which may have
358
+ // failed (and then we'd be pointing Cursor at a file that was never created).
359
+ const cursorResult = installUserScopeCursorHook(hookLoggerSrc);
360
+ cursorConfigReplaced = cursorResult.backedUpMalformed;
361
+ cursorBackupPath = cursorResult.backupPath;
362
+ }
363
+ catch {
364
+ // Couldn't write ~/.cursor/hooks.json, or the logger is missing — skip.
365
+ }
366
+ // GitHub Copilot: repo-scope <assessment>/.github/hooks/litmus.json.
367
+ //
368
+ // ENG-1292. The shipped key was `userPromptSubmit`, which is not a valid event
369
+ // in Copilot's schema at all — confirmed against the first-party
370
+ // @github/copilot SDK, whose zod schema and validation Set both name
371
+ // `userPromptSubmitted`, with `UserPromptSubmit` as the PascalCase alias.
372
+ // `userPromptSubmit` matches neither, so the entry failed validation and was
373
+ // dropped silently: no Copilot prompt has ever been captured. The ENG-771
374
+ // "fix" inverted a name that was previously correct.
375
+ //
376
+ // The PascalCase spelling is deliberate — it is the one key both Copilot CLI
377
+ // and VS Code Copilot Chat accept, so this single file covers the terminal
378
+ // binary, the cloud agent, VS Code and JetBrains. See installRepoScopeCopilotHook
379
+ // for why repo scope (and not ~/.copilot/hooks) is the right home.
380
+ //
381
+ // Best-effort like Codex and Cursor: a candidate not using Copilot is
382
+ // unaffected, and a failure here must not abort tracking for the tools that
383
+ // already installed successfully above.
384
+ let copilotConfigReplaced = false;
385
+ let copilotBackupPath;
386
+ try {
387
+ // Prefer the user-scope logger for the same reason the other three tools do
388
+ // (it survives ENG-1297 dropping the in-assessment copy). Fall back to the
389
+ // assessment's own copy when user scope is unavailable — the same situation
390
+ // that puts Claude Code into project-scope mode.
391
+ const copilotLogger = existsSync(USER_SCOPE_LOGGER)
392
+ ? USER_SCOPE_LOGGER
393
+ : path.join(litmusDir, "hook-logger.cjs");
394
+ const copilotResult = installRepoScopeCopilotHook(targetDir, copilotLogger);
395
+ copilotConfigReplaced = copilotResult.backedUpMalformed;
396
+ copilotBackupPath = copilotResult.backupPath;
397
+ }
398
+ catch {
399
+ // Couldn't write .github/hooks/litmus.json, or the shape was unrecognized.
400
+ }
314
401
  // Register this assessment in ~/.litmus/active-assessments.json so the
315
402
  // hook-logger can fall back to it when cwd walk-up fails (e.g. VS Code
316
403
  // workspace opened above the assessment dir). Only meaningful in user-scope
317
404
  // mode — the project-scope fallback writes a relative-path command that
318
405
  // can't consult the registry. Skipping in project-scope mode prevents a
319
406
  // dead entry that could mis-route a concurrent assessment's prompts.
320
- if (mode === "user") {
407
+ // Project scope deliberately stays OUT of the registry: its hook references a
408
+ // relative logger path and so can't use the registry fallback anyway, and a dead
409
+ // entry could mis-route a concurrent assessment's prompts. We claimed the slot
410
+ // above to close the uninstall race, so release it now that we know the mode.
411
+ if (mode === "project" && registered) {
321
412
  try {
322
- addActiveAssessment(targetDir);
413
+ removeActiveAssessment(targetDir);
323
414
  }
324
- catch { /* registry write failed, fall back to cwd-only capture */ }
415
+ catch { /* best effort — a stale entry is preferable to failing init */ }
325
416
  }
326
- return { mode, codexInstalled };
417
+ return { mode, codexInstalled, cursorConfigReplaced, cursorBackupPath, copilotConfigReplaced, copilotBackupPath };
327
418
  }
328
419
  /**
329
420
  * Project-scope fallback for Claude Code: writes .claude/settings.local.json
@@ -340,6 +431,12 @@ function setupAiTracking(targetDir) {
340
431
  * Preserves any pre-existing UserPromptSubmit entries the candidate had,
341
432
  * the same way the user-scope install path does, instead of shallow-merging
342
433
  * and clobbering them.
434
+ *
435
+ * The logger path is shell-quoted, like every user-scope command. Unquoted, an
436
+ * assessment under a path with a space (`/Users/Jane Smith/...`) shell-split
437
+ * and captured nothing — silent loss for candidates already on the degraded
438
+ * fallback path (ENG-1310). Entry identification is the installers' shared
439
+ * `isOurEntry`, which tolerates the quote.
343
440
  */
344
441
  function writeProjectScopeClaudeHook(targetDir, litmusDir) {
345
442
  const claudeDir = path.join(targetDir, ".claude");
@@ -351,24 +448,11 @@ function writeProjectScopeClaudeHook(targetDir, litmusDir) {
351
448
  _litmus: 1,
352
449
  hooks: [{
353
450
  type: "command",
354
- command: `node ${loggerAbsPath} claude`,
451
+ command: `node ${quoteForShell(loggerAbsPath)} claude`,
355
452
  timeout: 5,
356
453
  }],
357
454
  };
358
- const isOurs = (e) => {
359
- if (!e || typeof e !== "object")
360
- return false;
361
- const obj = e;
362
- if (obj._litmus)
363
- return true;
364
- const hooks = obj.hooks;
365
- if (!Array.isArray(hooks))
366
- return false;
367
- return hooks.some((h) => {
368
- const cmd = h?.command;
369
- return typeof cmd === "string" && /[/\\]\.litmus[/\\]hook-logger\.cjs\s+claude\b/.test(cmd);
370
- });
371
- };
455
+ const isOurs = isOurEntry;
372
456
  let data = {};
373
457
  if (existsSync(claudeSettingsPath)) {
374
458
  try {