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 +32 -3
- package/dist/commands/connect.d.ts +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +117 -8
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/init.d.ts +27 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +129 -45
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +26 -30
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/submit.js +15 -1
- package/dist/commands/submit.js.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/ai-tracking.d.ts +105 -7
- package/dist/lib/ai-tracking.d.ts.map +1 -1
- package/dist/lib/ai-tracking.js +537 -70
- package/dist/lib/ai-tracking.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/deadline.d.ts +37 -0
- package/dist/lib/deadline.d.ts.map +1 -0
- package/dist/lib/deadline.js +40 -0
- package/dist/lib/deadline.js.map +1 -0
- package/dist/lib/hook-logger.cjs +1018 -81
- package/dist/lib/schemas.d.ts +1 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +6 -1
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/watcher.js +67 -48
- package/dist/lib/watcher.js.map +1 -1
- package/dist/lib/zip.d.ts.map +1 -1
- package/dist/lib/zip.js +50 -10
- package/dist/lib/zip.js.map +1 -1
- package/package.json +2 -2
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.
|
|
99
|
-
|
|
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
|
-
|
|
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":"
|
|
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"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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
|
|
144
|
-
//
|
|
145
|
-
// and
|
|
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
|
|
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
|
-
//
|
|
271
|
-
//
|
|
272
|
-
|
|
273
|
-
|
|
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
|
-
//
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
-
|
|
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
|
-
|
|
413
|
+
removeActiveAssessment(targetDir);
|
|
323
414
|
}
|
|
324
|
-
catch { /*
|
|
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 =
|
|
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 {
|