Files
Claude-Code-Monitor/desktop/scripts/preflight.js
T
nntrivi2001 57dc91585d feat: Claude Code Monitor — lanes, pipelines and a merged workspace
Internal SmartGift build of a Claude Code monitoring dashboard.

Lanes: a durable unit of parallel agent work, one per working directory,
tracked across session restarts. Managed lanes are git worktrees the
dashboard provisions and can reset or remove behind a three-check destroy
guard and a counted preflight; adopted lanes are directories you already
own and are never destroyable.

Pipelines: a lane moves through pipeline stages. A stage the agent declares
with evidence renders green; a stage inferred from the tool-event stream
renders dashed amber and never counts as done. Detection is forward-only
within a 30-minute window, and never writes the declared stage.

Workspace: one page at /run with a lane grid, the selected lane's pipeline,
and a full Claude console behind a disclosure.
2026-07-30 14:39:03 +07:00

83 lines
3.1 KiB
JavaScript

#!/usr/bin/env node
/**
* @file Shared native-dependency preflight checks + actionable failure help.
*
* The desktop shell embeds the dashboard server in-process, which `require`s
* the native `better-sqlite3` module rebuilt against Electron's Node ABI. That
* build is the single most common setup failure: it needs either a C++ toolchain
* (to compile from source) or a Node version new enough to have a prebuilt
* binary. When it's missing we want a clear, copy-pasteable message instead of a
* raw node-gyp stack trace or a runtime "Cannot find module" deep inside boot.
*
* This module is shared by `install.js` (wraps the dependency install) and
* `prebuild.js` (gates every `desktop:*` build/dev script) so both surfaces
* print the same guidance.
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
*/
const fs = require("node:fs");
const path = require("node:path");
const desktopRoot = path.resolve(__dirname, "..");
/** Absolute path to the compiled/prebuilt better-sqlite3 native binary. */
function betterSqliteBinary() {
return path.join(
desktopRoot,
"node_modules",
"better-sqlite3",
"build",
"Release",
"better_sqlite3.node"
);
}
/** True when the Electron-ABI better-sqlite3 binary is present on disk. */
function hasBetterSqliteBinary() {
return fs.existsSync(betterSqliteBinary());
}
/**
* Print prerequisite guidance and the no-toolchain alternative commands to
* stderr. Callers should `process.exit(1)` after this so the failing npm
* command exits non-zero (never leave the user thinking setup succeeded).
*/
function printNativeDepHelp(reason) {
const line = "─".repeat(74);
const out = (s) => process.stderr.write(s + "\n");
out("");
out(line);
out(" Claude Code Monitor — desktop native dependency setup did not complete");
out(line);
if (reason) {
out(` ${reason}`);
out("");
}
out(" The desktop app embeds the dashboard server, which needs the native");
out(" 'better-sqlite3' module built for Electron's Node ABI. This typically");
out(" fails for one of two reasons:");
out("");
out(" 1. No C++ build toolchain, so the module can't compile from source:");
out(' • Windows: install "Visual Studio Build Tools" with the');
out(' "Desktop development with C++" workload.');
out(" • macOS: xcode-select --install");
out(" • Linux: install build-essential + python3.");
out("");
out(" 2. Your Node.js is newer than any published better-sqlite3 prebuilt");
out(` binary (you are on Node ${process.version}). A Node LTS (20 or 22)`);
out(" ships prebuilt binaries and avoids the compile entirely.");
out("");
out(" Or skip the source build and fetch Electron's prebuilt binary directly");
out(" (no C++ toolchain needed):");
out("");
out(" cd desktop");
out(" npm install --ignore-scripts");
out(" node node_modules/electron/install.js");
out(" npx electron-builder install-app-deps");
out("");
out(line);
out("");
}
module.exports = { betterSqliteBinary, hasBetterSqliteBinary, printNativeDepHelp };