Files
hyperframes/skills/media-use/scripts/lib/telemetry.test.mjs
1577060dc1 fix(media-use): honor telemetryEnabled: false from shared config in optedOut (#5490)
* fix(media-use): honor telemetryEnabled: false from shared config in optedOut

The CLI's 'hyperframes telemetry disable' writes telemetryEnabled: false to ~/.hyperframes/config.json, but the media-use scripts' optedOut() only checked env vars, so transcribe.mjs, transcript-cut.mjs and audio-duck.mjs kept sending PostHog events for users who had opted out through the CLI.

optedOut() now also returns true when the shared config has telemetryEnabled === false, reusing the readSharedConfig() helper already in the same file. Applied byte-identically to both copies of telemetry.mjs (skills/media-use/scripts/lib and packages/cli/src/media-use/lib, per the copy-parity rule), with tests in both test files.

Closes #5465

* test(media-use): sandbox HOME in the telemetry opt-out test and regenerate the skills manifest

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: James <james.russo@heygen.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 23:56:46 +01:00

74 lines
2.2 KiB
JavaScript

import assert from "node:assert/strict";
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { dirname, join } from "node:path";
import { test } from "node:test";
import { optedOut } from "./telemetry.mjs";
// optedOut() reads ~/.hyperframes/config.json and env vars. Point HOME at a temp
// dir so the run never touches the real config, and pin the env opt-outs to a
// neutral state; restore both afterwards.
const ENV_KEYS = [
"HOME",
"USERPROFILE",
"HYPERFRAMES_NO_TELEMETRY",
"DO_NOT_TRACK",
"CI",
"NODE_ENV",
];
const savedEnv = Object.fromEntries(ENV_KEYS.map((k) => [k, process.env[k]]));
const home = mkdtempSync(join(tmpdir(), "mu-telemetry-"));
const configPath = join(home, ".hyperframes", "config.json");
function writeConfig(contents) {
if (contents === null) {
rmSync(configPath, { force: true });
} else {
mkdirSync(dirname(configPath), { recursive: true });
writeFileSync(configPath, contents);
}
}
test.before(() => {
for (const key of ENV_KEYS) delete process.env[key];
process.env.HOME = process.env.USERPROFILE = home;
});
test.after(() => {
for (const key of ENV_KEYS) {
if (savedEnv[key] === undefined) delete process.env[key];
else process.env[key] = savedEnv[key];
}
rmSync(home, { recursive: true, force: true });
});
test("optedOut is false with no config and no opt-out env", () => {
writeConfig(null);
assert.equal(optedOut(), false);
});
test("optedOut honors telemetryEnabled: false from the shared config", () => {
writeConfig(JSON.stringify({ telemetryEnabled: false }));
assert.equal(optedOut(), true);
});
test("optedOut is false when the shared config enables telemetry", () => {
writeConfig(JSON.stringify({ telemetryEnabled: true }));
assert.equal(optedOut(), false);
});
test("optedOut treats an unreadable shared config as no opt-out", () => {
writeConfig("{not json");
assert.equal(optedOut(), false);
});
test("optedOut still honors the env opt-outs", () => {
writeConfig(JSON.stringify({ telemetryEnabled: true }));
process.env.DO_NOT_TRACK = "1";
try {
assert.equal(optedOut(), true);
} finally {
delete process.env.DO_NOT_TRACK;
}
});