diff --git a/apps/cli/package.json b/apps/cli/package.json index 70cd747..489f12c 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "claudemesh-cli", - "version": "0.1.13", + "version": "0.1.14", "description": "Claude Code MCP client for claudemesh — peer mesh messaging between Claude sessions.", "keywords": [ "claude-code", diff --git a/apps/cli/src/commands/launch.ts b/apps/cli/src/commands/launch.ts index 211d3d9..e5d233d 100644 --- a/apps/cli/src/commands/launch.ts +++ b/apps/cli/src/commands/launch.ts @@ -220,6 +220,7 @@ export async function runLaunch(extraArgs: string[]): Promise { const sessionConfig: Config = { version: 1, meshes: [mesh], + displayName, }; writeFileSync( join(tmpDir, "config.json"), diff --git a/apps/cli/src/state/config.ts b/apps/cli/src/state/config.ts index 8defe9f..6d3f4c6 100644 --- a/apps/cli/src/state/config.ts +++ b/apps/cli/src/state/config.ts @@ -31,6 +31,7 @@ export interface JoinedMesh { export interface Config { version: 1; meshes: JoinedMesh[]; + displayName?: string; // per-session override, written by `claudemesh launch --name` } const CONFIG_DIR = env.CLAUDEMESH_CONFIG_DIR ?? join(homedir(), ".claudemesh"); @@ -46,7 +47,7 @@ export function loadConfig(): Config { if (!parsed || !Array.isArray(parsed.meshes)) { return { version: 1, meshes: [] }; } - return { version: 1, meshes: parsed.meshes }; + return { version: 1, meshes: parsed.meshes, displayName: parsed.displayName }; } catch (e) { throw new Error( `Failed to load ${CONFIG_PATH}: ${e instanceof Error ? e.message : String(e)}`, diff --git a/apps/cli/src/ws/client.ts b/apps/cli/src/ws/client.ts index 10ab5ab..971bbdd 100644 --- a/apps/cli/src/ws/client.ts +++ b/apps/cli/src/ws/client.ts @@ -86,6 +86,7 @@ export class BrokerClient { private mesh: JoinedMesh, private opts: { onStatusChange?: (status: ConnStatus) => void; + displayName?: string; debug?: boolean; } = {}, ) {} @@ -132,7 +133,7 @@ export class BrokerClient { memberId: this.mesh.memberId, pubkey: this.mesh.pubkey, sessionPubkey: this.sessionPubkey, - displayName: process.env.CLAUDEMESH_DISPLAY_NAME || undefined, + displayName: process.env.CLAUDEMESH_DISPLAY_NAME || this.opts.displayName || undefined, sessionId: `${process.pid}-${Date.now()}`, pid: process.pid, cwd: process.cwd(), diff --git a/apps/cli/src/ws/manager.ts b/apps/cli/src/ws/manager.ts index bc689a1..eb2ed11 100644 --- a/apps/cli/src/ws/manager.ts +++ b/apps/cli/src/ws/manager.ts @@ -11,12 +11,13 @@ import type { Config, JoinedMesh } from "../state/config"; import { env } from "../env"; const clients = new Map(); +let configDisplayName: string | undefined; /** Ensure a BrokerClient exists + is connecting/open for this mesh. */ export async function ensureClient(mesh: JoinedMesh): Promise { const existing = clients.get(mesh.meshId); if (existing) return existing; - const client = new BrokerClient(mesh, { debug: env.CLAUDEMESH_DEBUG }); + const client = new BrokerClient(mesh, { debug: env.CLAUDEMESH_DEBUG, displayName: configDisplayName }); clients.set(mesh.meshId, client); try { await client.connect(); @@ -29,6 +30,7 @@ export async function ensureClient(mesh: JoinedMesh): Promise { /** Start clients for every joined mesh. Called once on MCP server start. */ export async function startClients(config: Config): Promise { + configDisplayName = config.displayName; await Promise.allSettled(config.meshes.map(ensureClient)); }