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:
5
.changeset/splash-version-display.md
Normal file
5
.changeset/splash-version-display.md
Normal 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.
|
||||||
@@ -165,7 +165,8 @@ describe("DashboardApp smoke", () => {
|
|||||||
const frame = lastFrame() ?? "";
|
const frame = lastFrame() ?? "";
|
||||||
// Splash can render either the compact text mark or the expanded block-art logo.
|
// Splash can render either the compact text mark or the expanded block-art logo.
|
||||||
expect(frame).toMatch(/FUSION|███████╗/);
|
expect(frame).toMatch(/FUSION|███████╗/);
|
||||||
expect(frame).toContain("AI coding agent dashboard");
|
expect(frame).toContain("multi node agent orchestrator");
|
||||||
|
expect(frame).toContain("runfusion.ai");
|
||||||
unmount();
|
unmount();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ import type {
|
|||||||
} from "./state.js";
|
} from "./state.js";
|
||||||
import { SECTION_ORDER } from "./state.js";
|
import { SECTION_ORDER } from "./state.js";
|
||||||
import type { LogEntry } from "./log-ring-buffer.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";
|
import { useProjects, useTasks } from "./hooks/use-projects.js";
|
||||||
|
|
||||||
// ── Format helpers ────────────────────────────────────────────────────────────
|
// ── Format helpers ────────────────────────────────────────────────────────────
|
||||||
@@ -139,6 +139,8 @@ function SplashScreen({ loadingStatus }: { loadingStatus: string }) {
|
|||||||
<AnimatedFusionLogo lines={large ? FUSION_LOGO_LARGE_LINES : FUSION_LOGO_LINES} />
|
<AnimatedFusionLogo lines={large ? FUSION_LOGO_LARGE_LINES : FUSION_LOGO_LINES} />
|
||||||
)}
|
)}
|
||||||
<Text color="cyanBright" dimColor>{FUSION_TAGLINE}</Text>
|
<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 height={1} />
|
||||||
<Box flexDirection="row" gap={1}>
|
<Box flexDirection="row" gap={1}>
|
||||||
<Text color="cyanBright"><Spinner type="dots" /></Text>
|
<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>
|
<Text dimColor>System information not available.</Text>
|
||||||
) : (
|
) : (
|
||||||
<Box flexDirection="column">
|
<Box flexDirection="column">
|
||||||
|
<Box flexDirection="row" gap={1}>
|
||||||
|
<Text dimColor>Version:</Text>
|
||||||
|
<Text>{`v${FUSION_VERSION}`}</Text>
|
||||||
|
</Box>
|
||||||
<Box flexDirection="row" gap={1}>
|
<Box flexDirection="row" gap={1}>
|
||||||
<Text dimColor>Host:</Text>
|
<Text dimColor>Host:</Text>
|
||||||
<Text>{info.host}</Text>
|
<Text>{info.host}</Text>
|
||||||
@@ -791,7 +797,7 @@ function StatusBar({ state, controller: _controller }: { state: DashboardState;
|
|||||||
|
|
||||||
const statusParts: string[] = [];
|
const statusParts: string[] = [];
|
||||||
if (systemInfo) {
|
if (systemInfo) {
|
||||||
statusParts.push(systemInfo.baseUrl);
|
statusParts.push(`${systemInfo.baseUrl} v${FUSION_VERSION}`);
|
||||||
statusParts.push(formatUptime(Date.now() - systemInfo.startTimeMs));
|
statusParts.push(formatUptime(Date.now() - systemInfo.startTimeMs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
// The caller picks a size based on terminal dimensions and applies an
|
// The caller picks a size based on terminal dimensions and applies an
|
||||||
// all-blue vertical gradient.
|
// 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.
|
// ANSI Shadow font — 47 cols × 6 rows.
|
||||||
export const FUSION_LOGO_LINES = [
|
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