29858ddccb
The READMEs never said tmux was needed, so a fresh install only found out when Start Run failed with nothing explaining why. Both doctors were silent about it too. - README/README.vi: a prerequisites table (node, npm, git, tmux, claude, codex, gh, systemd) and per-OS tmux install + verify steps; the feature list is regrouped into observe/drive/configure and now covers analytics, alerts, import, remote sources, the config explorer and Update all. - INSTALL: Step 0 for the system packages, plus a troubleshooting entry separating "tmux missing" from "the server has a different PATH". - SETUP/docs/README: the same troubleshooting entry and a pointer to Step 0. - plugin-doctor: a tmux row, WARN and never FAIL - the run console and `lanes shell` break without it, nothing else does. Reuses tmux.js's own isTmuxAvailable(). - agenthub doctor: asks GET /api/run/tmux instead, because the PATH that decides whether a run starts is the server's, not the caller's shell's.
55 lines
1.9 KiB
JavaScript
55 lines
1.9 KiB
JavaScript
/**
|
|
* @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. 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ĩ <vinnt@smartgift.vn>
|
|
*/
|
|
|
|
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 as present or absent, then read back the row. */
|
|
function rowWithTmux(present) {
|
|
tmux.__setExecImpl(() => {
|
|
if (!present) throw new Error("spawnSync tmux ENOENT");
|
|
return "tmux 3.4\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(false);
|
|
|
|
assert.equal(row.level, "warn", "a missing tmux must not fail the doctor run");
|
|
assert.match(row.detail, /lanes shell/, "the reader needs to know WHAT breaks");
|
|
assert.match(row.detail, /install/i, "and how to fix it");
|
|
});
|
|
|
|
it("passes when tmux is available", () => {
|
|
const row = rowWithTmux(true);
|
|
|
|
assert.equal(row.level, "ok", row.detail);
|
|
});
|
|
});
|