claudemesh-cli 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +35 -47
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -40069,7 +40069,7 @@ function moveTo(row, col) {
40069
40069
  function visibleLength(s) {
40070
40070
  return s.replace(/\x1b\[[^m]*m/g, "").length;
40071
40071
  }
40072
- var isTTY, esc2 = (code) => (s) => isTTY ? `${code}${s}\x1B[0m` : s, orange, clay, amber, bold2, dim, green2, yellow, red, cyan2, boldOrange, HIDE_CURSOR, SHOW_CURSOR, CLEAR_SCREEN, CLEAR_LINE;
40072
+ var isTTY, esc2 = (code) => (s) => isTTY ? `${code}${s}\x1B[0m` : s, orange, clay, amber, bold2, dim, green, yellow, red, cyan2, boldOrange, HIDE_CURSOR, SHOW_CURSOR, CLEAR_SCREEN, CLEAR_LINE;
40073
40073
  var init_colors = __esm(() => {
40074
40074
  isTTY = process.stdout.isTTY && !process.env.NO_COLOR && process.env.TERM !== "dumb";
40075
40075
  orange = esc2("\x1B[38;5;208m");
@@ -40077,7 +40077,7 @@ var init_colors = __esm(() => {
40077
40077
  amber = esc2("\x1B[38;5;214m");
40078
40078
  bold2 = esc2("\x1B[1m");
40079
40079
  dim = esc2("\x1B[2m");
40080
- green2 = esc2("\x1B[32m");
40080
+ green = esc2("\x1B[32m");
40081
40081
  yellow = esc2("\x1B[33m");
40082
40082
  red = esc2("\x1B[31m");
40083
40083
  cyan2 = esc2("\x1B[36m");
@@ -40093,7 +40093,7 @@ var package_default;
40093
40093
  var init_package = __esm(() => {
40094
40094
  package_default = {
40095
40095
  name: "claudemesh-cli",
40096
- version: "0.9.5",
40096
+ version: "0.9.7",
40097
40097
  description: "Claude Code MCP client for claudemesh — peer mesh messaging between Claude sessions.",
40098
40098
  keywords: [
40099
40099
  "claude-code",
@@ -53953,15 +53953,6 @@ function drawTopBar(extra) {
53953
53953
  const gap = Math.max(1, cols - left.length - right.length - mid.length);
53954
53954
  process.stdout.write(moveTo(1, 1) + bg + left + mid + " ".repeat(gap) + right + reset);
53955
53955
  }
53956
- function drawBottomBar(left, right) {
53957
- const { cols, rows } = termSize();
53958
- const bg = "\x1B[48;5;208m\x1B[30m";
53959
- const reset = "\x1B[0m";
53960
- const l = ` ${left}`;
53961
- const r = right ? `${right} ` : "";
53962
- const gap = Math.max(1, cols - l.length - r.length);
53963
- process.stdout.write(moveTo(rows, 1) + bg + l + " ".repeat(gap) + r + reset);
53964
- }
53965
53956
  function enterFullScreen() {
53966
53957
  process.stdout.write(HIDE_CURSOR + CLEAR_SCREEN);
53967
53958
  drawTopBar();
@@ -54137,7 +54128,6 @@ async function runLaunchWizard(opts) {
54137
54128
  const { rows } = termSize();
54138
54129
  enterFullScreen();
54139
54130
  drawTopBar();
54140
- drawBottomBar("↑↓ navigate ⏎ select esc skip ctrl-c quit", `mesh: ${opts.meshSlug}`);
54141
54131
  const logoTop = Math.floor((rows - FRAME_HEIGHT - 16) / 2);
54142
54132
  const brandRow = logoTop + FRAME_HEIGHT + 1;
54143
54133
  const subtitleRow = brandRow + 1;
@@ -54154,11 +54144,11 @@ async function runLaunchWizard(opts) {
54154
54144
  });
54155
54145
  spinner.start();
54156
54146
  let row = formRow;
54157
- writeCentered(row, `Directory ${green2("✓")} ${process.cwd()}`);
54147
+ writeCentered(row, `Directory ${green("✓")} ${process.cwd()}`);
54158
54148
  row++;
54159
- writeCentered(row, `Name ${green2("✓")} ${opts.displayName}`);
54149
+ writeCentered(row, `Name ${green("✓")} ${opts.displayName}`);
54160
54150
  row++;
54161
- writeCentered(row, `Mesh ${green2("✓")} ${opts.meshSlug}`);
54151
+ writeCentered(row, `Mesh ${green("✓")} ${opts.meshSlug}`);
54162
54152
  row += 2;
54163
54153
  let role = opts.existingRole;
54164
54154
  let groups = opts.existingGroups;
@@ -54171,7 +54161,7 @@ async function runLaunchWizard(opts) {
54171
54161
  spinner.start();
54172
54162
  row++;
54173
54163
  } else {
54174
- writeCentered(row, `Role ${green2("✓")} ${role}`);
54164
+ writeCentered(row, `Role ${green("✓")} ${role}`);
54175
54165
  row++;
54176
54166
  }
54177
54167
  if (groups.length === 0) {
@@ -54183,7 +54173,7 @@ async function runLaunchWizard(opts) {
54183
54173
  row++;
54184
54174
  } else {
54185
54175
  const tags = groups.map((g) => `@${g.name}${g.role ? `:${g.role}` : ""}`).join(", ");
54186
- writeCentered(row, `Groups ${green2("✓")} ${tags}`);
54176
+ writeCentered(row, `Groups ${green("✓")} ${tags}`);
54187
54177
  row++;
54188
54178
  }
54189
54179
  if (opts.existingMessageMode === null) {
@@ -54202,7 +54192,7 @@ async function runLaunchWizard(opts) {
54202
54192
  spinner.start();
54203
54193
  row += 5;
54204
54194
  } else {
54205
- writeCentered(row, `Messages ${green2("✓")} ${messageMode}`);
54195
+ writeCentered(row, `Messages ${green("✓")} ${messageMode}`);
54206
54196
  row++;
54207
54197
  }
54208
54198
  let skipPermissions = opts.skipPermConfirm;
@@ -54229,7 +54219,6 @@ async function runLaunchWizard(opts) {
54229
54219
  }
54230
54220
  row += 2;
54231
54221
  writeCentered(row, dim("Launching Claude Code..."));
54232
- drawBottomBar(`${opts.displayName} on ${opts.meshSlug}`, `mode: ${messageMode}`);
54233
54222
  await new Promise((r) => setTimeout(r, 800));
54234
54223
  spinner.stop();
54235
54224
  exitFullScreen();
@@ -54307,7 +54296,7 @@ async function runLaunch(flags, rawArgs) {
54307
54296
  const useColor = !process.env.NO_COLOR && process.env.TERM !== "dumb" && process.stdout.isTTY;
54308
54297
  const bold3 = (s) => useColor ? `\x1B[1m${s}\x1B[22m` : s;
54309
54298
  const dim2 = (s) => useColor ? `\x1B[2m${s}\x1B[22m` : s;
54310
- const green3 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
54299
+ const green2 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
54311
54300
  const code = generatePairingCode();
54312
54301
  const listener = await startCallbackListener();
54313
54302
  const url = `https://claudemesh.com/cli-auth?port=${listener.port}&code=${code}&action=sync`;
@@ -54366,7 +54355,7 @@ async function runLaunch(flags, rawArgs) {
54366
54355
  saveConfig2(config2);
54367
54356
  justSynced = true;
54368
54357
  console.log(`
54369
- ${green3("✓")} Synced ${result.meshes.length} mesh(es): ${result.meshes.map((m) => m.slug).join(", ")}
54358
+ ${green2("✓")} Synced ${result.meshes.length} mesh(es): ${result.meshes.map((m) => m.slug).join(", ")}
54370
54359
  `);
54371
54360
  }
54372
54361
  if (config2.meshes.length === 0) {
@@ -54632,7 +54621,7 @@ async function probeBroker(url, timeoutMs = 4000) {
54632
54621
  async function runStatus() {
54633
54622
  const useColor = !process.env.NO_COLOR && process.env.TERM !== "dumb" && process.stdout.isTTY;
54634
54623
  const dim2 = (s) => useColor ? `\x1B[2m${s}\x1B[22m` : s;
54635
- const green3 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
54624
+ const green2 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
54636
54625
  const red2 = (s) => useColor ? `\x1B[31m${s}\x1B[39m` : s;
54637
54626
  console.log(`claudemesh status (v${VERSION})`);
54638
54627
  console.log("─".repeat(60));
@@ -54664,7 +54653,7 @@ async function runStatus() {
54664
54653
  error: probe.error
54665
54654
  });
54666
54655
  if (probe.ok) {
54667
- console.log(green3("reachable"));
54656
+ console.log(green2("reachable"));
54668
54657
  } else {
54669
54658
  console.log(red2(`unreachable (${probe.error})`));
54670
54659
  }
@@ -54676,7 +54665,7 @@ async function runStatus() {
54676
54665
  const allOk = results.every((r) => r.reachable);
54677
54666
  console.log("");
54678
54667
  if (allOk) {
54679
- console.log(green3("All meshes reachable."));
54668
+ console.log(green2("All meshes reachable."));
54680
54669
  process.exit(0);
54681
54670
  } else {
54682
54671
  const broken = results.filter((r) => !r.reachable).length;
@@ -54837,7 +54826,7 @@ function checkKeypairs() {
54837
54826
  async function runDoctor() {
54838
54827
  const useColor = !process.env.NO_COLOR && process.env.TERM !== "dumb" && process.stdout.isTTY;
54839
54828
  const dim2 = (s) => useColor ? `\x1B[2m${s}\x1B[22m` : s;
54840
- const green3 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
54829
+ const green2 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
54841
54830
  const red2 = (s) => useColor ? `\x1B[31m${s}\x1B[39m` : s;
54842
54831
  console.log(`claudemesh doctor (v${VERSION})`);
54843
54832
  console.log("─".repeat(60));
@@ -54850,7 +54839,7 @@ async function runDoctor() {
54850
54839
  checkKeypairs()
54851
54840
  ];
54852
54841
  for (const c of checks3) {
54853
- const mark = c.pass ? green3("✓") : red2("✗");
54842
+ const mark = c.pass ? green2("✓") : red2("✗");
54854
54843
  const detail = c.detail ? dim2(` (${c.detail})`) : "";
54855
54844
  console.log(`${mark} ${c.name}${detail}`);
54856
54845
  if (!c.pass && c.fix) {
@@ -54860,7 +54849,7 @@ async function runDoctor() {
54860
54849
  const failing = checks3.filter((c) => !c.pass);
54861
54850
  console.log("");
54862
54851
  if (failing.length === 0) {
54863
- console.log(green3("All checks passed."));
54852
+ console.log(green2("All checks passed."));
54864
54853
  process.exit(0);
54865
54854
  } else {
54866
54855
  console.log(red2(`${failing.length} check(s) failed.`));
@@ -54901,7 +54890,6 @@ async function runWelcome() {
54901
54890
  const { rows } = termSize();
54902
54891
  enterFullScreen();
54903
54892
  drawTopBar();
54904
- drawBottomBar("↑↓ navigate ⏎ select ctrl-c quit", "claudemesh.com");
54905
54893
  const logoTop = Math.floor((rows - FRAME_HEIGHT - 10) / 2);
54906
54894
  const brandRow = logoTop + FRAME_HEIGHT + 1;
54907
54895
  const subtitleRow = brandRow + 1;
@@ -54933,14 +54921,14 @@ async function runWelcome() {
54933
54921
  });
54934
54922
  exitFullScreen();
54935
54923
  if (choice === 0) {
54936
- console.log(green2("$") + ` claudemesh install
54924
+ console.log(green("$") + ` claudemesh install
54937
54925
  `);
54938
54926
  }
54939
54927
  break;
54940
54928
  }
54941
54929
  case "no-meshes": {
54942
- writeCentered(contentRow, green2("✓") + " MCP registered. Now join a mesh.");
54943
- writeCentered(contentRow + 2, dim("MCP server ") + green2("✓") + dim(" registered"));
54930
+ writeCentered(contentRow, green("✓") + " MCP registered. Now join a mesh.");
54931
+ writeCentered(contentRow + 2, dim("MCP server ") + green("✓") + dim(" registered"));
54944
54932
  writeCentered(contentRow + 3, dim("Mesh ") + yellow("○") + dim(" none joined"));
54945
54933
  menuRow = contentRow + 5;
54946
54934
  spinner.stop();
@@ -54955,11 +54943,11 @@ async function runWelcome() {
54955
54943
  });
54956
54944
  exitFullScreen();
54957
54945
  if (choice === 0) {
54958
- console.log(green2("$") + ` claudemesh join https://claudemesh.com/join/<token>
54946
+ console.log(green("$") + ` claudemesh join https://claudemesh.com/join/<token>
54959
54947
  `);
54960
54948
  console.log(dim(" Don't have an invite? Create one at ") + bold2("https://claudemesh.com") + dim(" or ask a mesh owner."));
54961
54949
  } else if (choice === 1) {
54962
- console.log(green2("$") + ` claudemesh create
54950
+ console.log(green("$") + ` claudemesh create
54963
54951
  `);
54964
54952
  }
54965
54953
  break;
@@ -54967,8 +54955,8 @@ async function runWelcome() {
54967
54955
  case "ready": {
54968
54956
  const cfg = loadConfig();
54969
54957
  const meshNames = cfg.meshes.map((m) => m.slug).join(", ");
54970
- writeCentered(contentRow, green2("✓") + " MCP registered");
54971
- writeCentered(contentRow + 1, green2("✓") + ` ${cfg.meshes.length} mesh(es): ${meshNames}`);
54958
+ writeCentered(contentRow, green("✓") + " MCP registered");
54959
+ writeCentered(contentRow + 1, green("✓") + ` ${cfg.meshes.length} mesh(es): ${meshNames}`);
54972
54960
  writeCentered(contentRow + 2, "");
54973
54961
  writeCentered(contentRow + 3, bold2("Ready to launch."));
54974
54962
  menuRow = contentRow + 5;
@@ -54987,19 +54975,19 @@ async function runWelcome() {
54987
54975
  exitFullScreen();
54988
54976
  switch (choice) {
54989
54977
  case 0:
54990
- console.log(green2("$") + ` claudemesh launch
54978
+ console.log(green("$") + ` claudemesh launch
54991
54979
  `);
54992
54980
  break;
54993
54981
  case 1:
54994
- console.log(green2("$") + ` claudemesh peers
54982
+ console.log(green("$") + ` claudemesh peers
54995
54983
  `);
54996
54984
  break;
54997
54985
  case 2:
54998
- console.log(green2("$") + ` claudemesh status
54986
+ console.log(green("$") + ` claudemesh status
54999
54987
  `);
55000
54988
  break;
55001
54989
  case 3:
55002
- console.log(green2("$") + ` claudemesh doctor
54990
+ console.log(green("$") + ` claudemesh doctor
55003
54991
  `);
55004
54992
  break;
55005
54993
  }
@@ -55016,7 +55004,7 @@ async function runWelcome() {
55016
55004
  });
55017
55005
  exitFullScreen();
55018
55006
  if (choice === 0) {
55019
- console.log(green2("$") + ` claudemesh doctor
55007
+ console.log(green("$") + ` claudemesh doctor
55020
55008
  `);
55021
55009
  }
55022
55010
  break;
@@ -55087,7 +55075,7 @@ async function runPeers(flags) {
55087
55075
  const useColor = !process.env.NO_COLOR && process.env.TERM !== "dumb" && process.stdout.isTTY;
55088
55076
  const dim2 = (s) => useColor ? `\x1B[2m${s}\x1B[22m` : s;
55089
55077
  const bold3 = (s) => useColor ? `\x1B[1m${s}\x1B[22m` : s;
55090
- const green3 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
55078
+ const green2 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
55091
55079
  const yellow2 = (s) => useColor ? `\x1B[33m${s}\x1B[39m` : s;
55092
55080
  await withMesh({ meshSlug: flags.mesh ?? null }, async (client2, mesh) => {
55093
55081
  const peers = await client2.listPeers();
@@ -55103,7 +55091,7 @@ async function runPeers(flags) {
55103
55091
  console.log("");
55104
55092
  for (const p of peers) {
55105
55093
  const groups = p.groups.length ? " [" + p.groups.map((g) => `@${g.name}${g.role ? `:${g.role}` : ""}`).join(", ") + "]" : "";
55106
- const statusIcon = p.status === "working" ? yellow2("●") : green3("●");
55094
+ const statusIcon = p.status === "working" ? yellow2("●") : green2("●");
55107
55095
  const name = bold3(p.displayName);
55108
55096
  const meta2 = [];
55109
55097
  if (p.peerType)
@@ -55591,7 +55579,7 @@ init_keypair();
55591
55579
  async function runSync(args) {
55592
55580
  const useColor = !process.env.NO_COLOR && process.env.TERM !== "dumb" && process.stdout.isTTY;
55593
55581
  const dim2 = (s) => useColor ? `\x1B[2m${s}\x1B[22m` : s;
55594
- const green3 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
55582
+ const green2 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
55595
55583
  const config2 = loadConfig();
55596
55584
  const code = generatePairingCode();
55597
55585
  const listener = await startCallbackListener();
@@ -55642,7 +55630,7 @@ async function runSync(args) {
55642
55630
  config2.accountId = result.account_id;
55643
55631
  saveConfig(config2);
55644
55632
  if (added > 0) {
55645
- console.log(green3(`✓ Added ${added} new mesh(es)`));
55633
+ console.log(green2(`✓ Added ${added} new mesh(es)`));
55646
55634
  } else {
55647
55635
  console.log(`Already up to date (${config2.meshes.length} meshes)`);
55648
55636
  }
@@ -55653,7 +55641,7 @@ init_config();
55653
55641
  async function runProfile(flags) {
55654
55642
  const useColor = !process.env.NO_COLOR && process.env.TERM !== "dumb" && process.stdout.isTTY;
55655
55643
  const dim2 = (s) => useColor ? `\x1B[2m${s}\x1B[22m` : s;
55656
- const green3 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
55644
+ const green2 = (s) => useColor ? `\x1B[32m${s}\x1B[39m` : s;
55657
55645
  const config2 = loadConfig();
55658
55646
  if (config2.meshes.length === 0) {
55659
55647
  console.error("No meshes joined. Run `claudemesh join <url>` first.");
@@ -55693,7 +55681,7 @@ async function runProfile(flags) {
55693
55681
  if (flags.json) {
55694
55682
  console.log(JSON.stringify(result, null, 2));
55695
55683
  } else if (result.ok) {
55696
- console.log(green3("✓ Profile updated"));
55684
+ console.log(green2("✓ Profile updated"));
55697
55685
  const member = result.member;
55698
55686
  printProfile(member, dim2);
55699
55687
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudemesh-cli",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "description": "Claude Code MCP client for claudemesh — peer mesh messaging between Claude sessions.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -48,10 +48,10 @@
48
48
  "prettier": "3.6.2",
49
49
  "typescript": "5.9.3",
50
50
  "vitest": "4.0.14",
51
- "@turbostarter/tsconfig": "0.1.0",
52
51
  "@turbostarter/vitest-config": "0.1.0",
52
+ "@turbostarter/eslint-config": "0.1.0",
53
53
  "@turbostarter/prettier-config": "0.1.0",
54
- "@turbostarter/eslint-config": "0.1.0"
54
+ "@turbostarter/tsconfig": "0.1.0"
55
55
  },
56
56
  "scripts": {
57
57
  "build": "bun build src/index.ts --target=node --outfile dist/index.js --banner \"#!/usr/bin/env node\" && chmod +x dist/index.js",