/** * @file Tests the `tmux` row of scripts/plugin-doctor.js — the check that tells * an install its browser run console cannot work, because every run the * dashboard starts is a tmux session (server/lib/tmux.js). The row must WARN * and never FAIL: sessions, analytics, lanes and the CLI all work without the * binary, so failing a doctor run over it would cry wolf. A tmux older than 3.7 * (no pane scrollbars) also warns, as does a new binary still talking to an * older running server. tmux is faked through the module's own exec seam, so * the test never depends on the host having it. * @author Nguyễn Ngọc Trí Vĩ */ const { describe, it, after } = require("node:test"); const assert = require("node:assert/strict"); const fs = require("node:fs"); const os = require("node:os"); const path = require("node:path"); const TMP_HOME = fs.mkdtempSync(path.join(os.tmpdir(), "agenthub-doctor-tmux-")); process.env.CLAUDE_HOME = TMP_HOME; const tmux = require("../lib/tmux"); const { diagnose } = require("../../scripts/plugin-doctor"); after(() => { tmux.__reset(); fs.rmSync(TMP_HOME, { recursive: true, force: true }); delete process.env.CLAUDE_HOME; }); /** Fake the tmux binary (null = absent) and its running server (null = none), * then read back the row. */ function rowWithTmux(client, server = null) { tmux.__setExecImpl((args) => { if (!client) throw new Error("spawnSync tmux ENOENT"); if (args[0] === "-V") return `tmux ${client}\n`; if (!server) throw new Error("no server running"); return `${server}\n`; }); const row = diagnose().find((r) => r.label === "tmux"); assert.ok(row, "the doctor must always emit a tmux row"); return row; } describe("plugin-doctor: tmux row", () => { it("warns, never fails, when tmux is not on PATH", () => { const row = rowWithTmux(null); assert.equal(row.level, "warn", "a missing tmux must not fail the doctor run"); assert.match(row.detail, /workspace shell/, "the reader needs to know WHAT breaks"); assert.match(row.detail, /install/i, "and how to fix it"); }); it("passes when tmux has pane scrollbars (3.7+)", () => { assert.equal(rowWithTmux("3.7c").level, "ok"); assert.equal(rowWithTmux("next-3.8", "3.8-rc3").level, "ok"); }); it("warns, with the upgrade path, when tmux is older than 3.7", () => { const row = rowWithTmux("3.4", "3.4"); assert.equal(row.level, "warn"); assert.match(row.detail, /3\.7/); assert.match(row.detail, /brew upgrade tmux/); }); it("warns when a new tmux is still talking to an older running server", () => { const row = rowWithTmux("3.7c", "3.4"); assert.equal(row.level, "warn"); assert.match(row.detail, /server is 3\.4/); }); });