feat(cli): rebrand splash and surface version in dashboard

Splash now reads "multi node agent orchestrator" / runfusion.ai / v<version>.
System panel and status bar also display the running CLI version.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsxdsm
2026-04-26 21:27:04 -07:00
parent 245a79353d
commit fdf8ca904e
4 changed files with 47 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
---
"@runfusion/fusion": minor
---
Reframe the CLI splash to "multi node agent orchestrator" with `runfusion.ai` and the current version, and surface the version alongside URL/host/auth/uptime in the dashboard System panel and status bar.

View File

@@ -165,7 +165,8 @@ describe("DashboardApp smoke", () => {
const frame = lastFrame() ?? "";
// Splash can render either the compact text mark or the expanded block-art logo.
expect(frame).toMatch(/FUSION|███████╗/);
expect(frame).toContain("AI coding agent dashboard");
expect(frame).toContain("multi node agent orchestrator");
expect(frame).toContain("runfusion.ai");
unmount();
});

View File

@@ -51,7 +51,7 @@ import type {
} from "./state.js";
import { SECTION_ORDER } from "./state.js";
import type { LogEntry } from "./log-ring-buffer.js";
import { FUSION_LOGO_LINES, FUSION_LOGO_LARGE_LINES, FUSION_TAGLINE } from "./logo.js";
import { FUSION_LOGO_LINES, FUSION_LOGO_LARGE_LINES, FUSION_TAGLINE, FUSION_URL, FUSION_VERSION } from "./logo.js";
import { useProjects, useTasks } from "./hooks/use-projects.js";
// ── Format helpers ────────────────────────────────────────────────────────────
@@ -139,6 +139,8 @@ function SplashScreen({ loadingStatus }: { loadingStatus: string }) {
<AnimatedFusionLogo lines={large ? FUSION_LOGO_LARGE_LINES : FUSION_LOGO_LINES} />
)}
<Text color="cyanBright" dimColor>{FUSION_TAGLINE}</Text>
<Text color="cyanBright" dimColor>{FUSION_URL}</Text>
<Text color="cyanBright" dimColor>{`v${FUSION_VERSION}`}</Text>
<Box height={1} />
<Box flexDirection="row" gap={1}>
<Text color="cyanBright"><Spinner type="dots" /></Text>
@@ -204,6 +206,10 @@ function SystemPanel({ state, isFocused }: { state: DashboardState; isFocused: b
<Text dimColor>System information not available.</Text>
) : (
<Box flexDirection="column">
<Box flexDirection="row" gap={1}>
<Text dimColor>Version:</Text>
<Text>{`v${FUSION_VERSION}`}</Text>
</Box>
<Box flexDirection="row" gap={1}>
<Text dimColor>Host:</Text>
<Text>{info.host}</Text>
@@ -791,7 +797,7 @@ function StatusBar({ state, controller: _controller }: { state: DashboardState;
const statusParts: string[] = [];
if (systemInfo) {
statusParts.push(systemInfo.baseUrl);
statusParts.push(`${systemInfo.baseUrl} v${FUSION_VERSION}`);
statusParts.push(formatUptime(Date.now() - systemInfo.startTimeMs));
}

View File

@@ -2,6 +2,10 @@
// The caller picks a size based on terminal dimensions and applies an
// all-blue vertical gradient.
import { existsSync, readFileSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
// ANSI Shadow font — 47 cols × 6 rows.
export const FUSION_LOGO_LINES = [
"███████╗██╗ ██╗███████╗██╗ ██████╗ ███╗ ██╗",
@@ -30,4 +34,31 @@ export const FUSION_LOGO_LARGE_LINES = [
"╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═══╝",
];
export const FUSION_TAGLINE = "AI coding agent dashboard";
export const FUSION_TAGLINE = "multi node agent orchestrator";
export const FUSION_URL = "runfusion.ai";
// Walk up from this module to the @runfusion/fusion package.json to read
// the current CLI version. Returns "unknown" when the package.json can't
// be located (e.g. inside a bundled binary that strips it).
function readFusionVersion(): string {
try {
let cur = dirname(fileURLToPath(import.meta.url));
for (let i = 0; i < 6; i++) {
const pkgPath = resolve(cur, "package.json");
if (existsSync(pkgPath)) {
const parsed = JSON.parse(readFileSync(pkgPath, "utf-8")) as { name?: string; version?: string };
if (parsed.name === "@runfusion/fusion" && typeof parsed.version === "string") {
return parsed.version;
}
}
const parent = resolve(cur, "..");
if (parent === cur) break;
cur = parent;
}
} catch {
// fall through to "unknown"
}
return "unknown";
}
export const FUSION_VERSION = readFusionVersion();