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:
@@ -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();
|
||||
});
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user