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.
- package/dist/index.js +35 -47
- 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,
|
|
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
|
-
|
|
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.
|
|
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 ${
|
|
54147
|
+
writeCentered(row, `Directory ${green("✓")} ${process.cwd()}`);
|
|
54158
54148
|
row++;
|
|
54159
|
-
writeCentered(row, `Name ${
|
|
54149
|
+
writeCentered(row, `Name ${green("✓")} ${opts.displayName}`);
|
|
54160
54150
|
row++;
|
|
54161
|
-
writeCentered(row, `Mesh ${
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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
|
|
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
|
-
${
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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 ?
|
|
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(
|
|
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(
|
|
54924
|
+
console.log(green("$") + ` claudemesh install
|
|
54937
54925
|
`);
|
|
54938
54926
|
}
|
|
54939
54927
|
break;
|
|
54940
54928
|
}
|
|
54941
54929
|
case "no-meshes": {
|
|
54942
|
-
writeCentered(contentRow,
|
|
54943
|
-
writeCentered(contentRow + 2, dim("MCP server ") +
|
|
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(
|
|
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(
|
|
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,
|
|
54971
|
-
writeCentered(contentRow + 1,
|
|
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(
|
|
54978
|
+
console.log(green("$") + ` claudemesh launch
|
|
54991
54979
|
`);
|
|
54992
54980
|
break;
|
|
54993
54981
|
case 1:
|
|
54994
|
-
console.log(
|
|
54982
|
+
console.log(green("$") + ` claudemesh peers
|
|
54995
54983
|
`);
|
|
54996
54984
|
break;
|
|
54997
54985
|
case 2:
|
|
54998
|
-
console.log(
|
|
54986
|
+
console.log(green("$") + ` claudemesh status
|
|
54999
54987
|
`);
|
|
55000
54988
|
break;
|
|
55001
54989
|
case 3:
|
|
55002
|
-
console.log(
|
|
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(
|
|
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
|
|
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("●") :
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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.
|
|
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/
|
|
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",
|