claudemesh-cli 1.0.3 → 1.1.0

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.
@@ -88,7 +88,7 @@ __export(exports_urls, {
88
88
  VERSION: () => VERSION,
89
89
  URLS: () => URLS
90
90
  });
91
- var URLS, VERSION = "1.0.3", env;
91
+ var URLS, VERSION = "1.1.0", env;
92
92
  var init_urls = __esm(() => {
93
93
  URLS = {
94
94
  BROKER: process.env.CLAUDEMESH_BROKER_URL ?? "wss://ic.claudemesh.com/ws",
@@ -6715,6 +6715,263 @@ var init_recall = __esm(() => {
6715
6715
  init_exit_codes();
6716
6716
  });
6717
6717
 
6718
+ // src/commands/broker-actions.ts
6719
+ var exports_broker_actions = {};
6720
+ __export(exports_broker_actions, {
6721
+ runVisible: () => runVisible,
6722
+ runTaskComplete: () => runTaskComplete,
6723
+ runTaskClaim: () => runTaskClaim,
6724
+ runSummary: () => runSummary,
6725
+ runStatusSet: () => runStatusSet,
6726
+ runStats: () => runStats,
6727
+ runPing: () => runPing,
6728
+ runMsgStatus: () => runMsgStatus,
6729
+ runGroupLeave: () => runGroupLeave,
6730
+ runGroupJoin: () => runGroupJoin,
6731
+ runForget: () => runForget,
6732
+ runClock: () => runClock
6733
+ });
6734
+ async function runStatusSet(state, opts) {
6735
+ const valid = ["idle", "working", "dnd"];
6736
+ if (!valid.includes(state)) {
6737
+ render.err(`Invalid status: ${state}`, `must be one of: ${valid.join(", ")}`);
6738
+ return EXIT.INVALID_ARGS;
6739
+ }
6740
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6741
+ await client.setStatus(state);
6742
+ });
6743
+ if (opts.json) {
6744
+ console.log(JSON.stringify({ status: state }));
6745
+ return EXIT.SUCCESS;
6746
+ }
6747
+ render.ok(`status set to ${bold(state)}`);
6748
+ return EXIT.SUCCESS;
6749
+ }
6750
+ async function runSummary(text, opts) {
6751
+ if (!text) {
6752
+ render.err("Usage: claudemesh summary <text>");
6753
+ return EXIT.INVALID_ARGS;
6754
+ }
6755
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6756
+ await client.setSummary(text);
6757
+ });
6758
+ if (opts.json) {
6759
+ console.log(JSON.stringify({ summary: text }));
6760
+ return EXIT.SUCCESS;
6761
+ }
6762
+ render.ok("summary set", dim(text));
6763
+ return EXIT.SUCCESS;
6764
+ }
6765
+ async function runVisible(value, opts) {
6766
+ let visible;
6767
+ if (value === "true" || value === "1" || value === "yes")
6768
+ visible = true;
6769
+ else if (value === "false" || value === "0" || value === "no")
6770
+ visible = false;
6771
+ else {
6772
+ render.err("Usage: claudemesh visible <true|false>");
6773
+ return EXIT.INVALID_ARGS;
6774
+ }
6775
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6776
+ await client.setVisible(visible);
6777
+ });
6778
+ if (opts.json) {
6779
+ console.log(JSON.stringify({ visible }));
6780
+ return EXIT.SUCCESS;
6781
+ }
6782
+ render.ok(visible ? "you are now visible to peers" : "you are now hidden", visible ? undefined : "direct messages still reach you");
6783
+ return EXIT.SUCCESS;
6784
+ }
6785
+ async function runGroupJoin(name, opts) {
6786
+ if (!name) {
6787
+ render.err("Usage: claudemesh group join @<name> [--role X]");
6788
+ return EXIT.INVALID_ARGS;
6789
+ }
6790
+ const cleanName = name.startsWith("@") ? name.slice(1) : name;
6791
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6792
+ await client.joinGroup(cleanName, opts.role);
6793
+ });
6794
+ if (opts.json) {
6795
+ console.log(JSON.stringify({ group: cleanName, role: opts.role ?? null }));
6796
+ return EXIT.SUCCESS;
6797
+ }
6798
+ render.ok(`joined ${clay("@" + cleanName)}`, opts.role ? `as ${opts.role}` : undefined);
6799
+ return EXIT.SUCCESS;
6800
+ }
6801
+ async function runGroupLeave(name, opts) {
6802
+ if (!name) {
6803
+ render.err("Usage: claudemesh group leave @<name>");
6804
+ return EXIT.INVALID_ARGS;
6805
+ }
6806
+ const cleanName = name.startsWith("@") ? name.slice(1) : name;
6807
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6808
+ await client.leaveGroup(cleanName);
6809
+ });
6810
+ if (opts.json) {
6811
+ console.log(JSON.stringify({ group: cleanName, left: true }));
6812
+ return EXIT.SUCCESS;
6813
+ }
6814
+ render.ok(`left ${clay("@" + cleanName)}`);
6815
+ return EXIT.SUCCESS;
6816
+ }
6817
+ async function runForget(id, opts) {
6818
+ if (!id) {
6819
+ render.err("Usage: claudemesh forget <memory-id>");
6820
+ return EXIT.INVALID_ARGS;
6821
+ }
6822
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6823
+ await client.forget(id);
6824
+ });
6825
+ if (opts.json) {
6826
+ console.log(JSON.stringify({ id, forgotten: true }));
6827
+ return EXIT.SUCCESS;
6828
+ }
6829
+ render.ok(`forgot ${dim(id.slice(0, 8))}`);
6830
+ return EXIT.SUCCESS;
6831
+ }
6832
+ async function runMsgStatus(id, opts) {
6833
+ if (!id) {
6834
+ render.err("Usage: claudemesh msg-status <message-id>");
6835
+ return EXIT.INVALID_ARGS;
6836
+ }
6837
+ return await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6838
+ const result = await client.messageStatus(id);
6839
+ if (!result) {
6840
+ if (opts.json)
6841
+ console.log(JSON.stringify({ id, found: false }));
6842
+ else
6843
+ render.err(`Message ${id} not found or timed out.`);
6844
+ return EXIT.NOT_FOUND;
6845
+ }
6846
+ if (opts.json) {
6847
+ console.log(JSON.stringify(result, null, 2));
6848
+ return EXIT.SUCCESS;
6849
+ }
6850
+ render.section(`message ${id.slice(0, 12)}…`);
6851
+ render.kv([
6852
+ ["target", result.targetSpec],
6853
+ ["delivered", result.delivered ? "yes" : "no"],
6854
+ ["delivered_at", result.deliveredAt ?? dim("—")]
6855
+ ]);
6856
+ if (result.recipients.length > 0) {
6857
+ render.blank();
6858
+ render.heading("recipients");
6859
+ for (const r of result.recipients) {
6860
+ process.stdout.write(` ${bold(r.name)} ${dim(r.pubkey.slice(0, 12) + "…")} ${dim("·")} ${r.status}
6861
+ `);
6862
+ }
6863
+ }
6864
+ return EXIT.SUCCESS;
6865
+ });
6866
+ }
6867
+ async function runClock(opts) {
6868
+ return await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6869
+ const result = await client.getClock();
6870
+ if (!result) {
6871
+ if (opts.json)
6872
+ console.log(JSON.stringify({ error: "timed out" }));
6873
+ else
6874
+ render.err("Clock query timed out");
6875
+ return EXIT.INTERNAL_ERROR;
6876
+ }
6877
+ if (opts.json) {
6878
+ console.log(JSON.stringify(result, null, 2));
6879
+ return EXIT.SUCCESS;
6880
+ }
6881
+ const statusLabel = result.speed === 0 ? "not started" : result.paused ? "paused" : "running";
6882
+ render.section(`mesh clock — ${statusLabel}`);
6883
+ render.kv([
6884
+ ["speed", `x${result.speed}`],
6885
+ ["tick", String(result.tick)],
6886
+ ["sim_time", result.simTime],
6887
+ ["started_at", result.startedAt]
6888
+ ]);
6889
+ return EXIT.SUCCESS;
6890
+ });
6891
+ }
6892
+ async function runStats(opts) {
6893
+ return await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6894
+ const peers = await client.listPeers();
6895
+ if (opts.json) {
6896
+ console.log(JSON.stringify({
6897
+ mesh: client.meshSlug,
6898
+ peers: peers.map((p) => ({ name: p.displayName, pubkey: p.pubkey, stats: p.stats ?? null }))
6899
+ }, null, 2));
6900
+ return EXIT.SUCCESS;
6901
+ }
6902
+ render.section(client.meshSlug);
6903
+ for (const p of peers) {
6904
+ const s = p.stats;
6905
+ if (!s) {
6906
+ process.stdout.write(` ${bold(p.displayName)} ${dim("(no stats)")}
6907
+ `);
6908
+ continue;
6909
+ }
6910
+ const up = s.uptime != null ? `${Math.floor(s.uptime / 60)}m` : "—";
6911
+ process.stdout.write(` ${bold(p.displayName)} ${dim(`in:${s.messagesIn ?? 0} out:${s.messagesOut ?? 0} tools:${s.toolCalls ?? 0} up:${up} err:${s.errors ?? 0}`)}
6912
+ `);
6913
+ }
6914
+ return EXIT.SUCCESS;
6915
+ });
6916
+ }
6917
+ async function runPing(opts) {
6918
+ return await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6919
+ const peers = await client.listPeers();
6920
+ if (opts.json) {
6921
+ console.log(JSON.stringify({
6922
+ mesh: client.meshSlug,
6923
+ ws_status: client.status,
6924
+ peers_online: peers.length,
6925
+ push_buffer: client.pushHistory.length
6926
+ }, null, 2));
6927
+ return EXIT.SUCCESS;
6928
+ }
6929
+ render.section(`ping ${client.meshSlug}`);
6930
+ render.kv([
6931
+ ["ws_status", client.status],
6932
+ ["peers_online", String(peers.length)],
6933
+ ["push_buffer", String(client.pushHistory.length)]
6934
+ ]);
6935
+ return EXIT.SUCCESS;
6936
+ });
6937
+ }
6938
+ async function runTaskClaim(id, opts) {
6939
+ if (!id) {
6940
+ render.err("Usage: claudemesh task claim <id>");
6941
+ return EXIT.INVALID_ARGS;
6942
+ }
6943
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6944
+ await client.claimTask(id);
6945
+ });
6946
+ if (opts.json) {
6947
+ console.log(JSON.stringify({ id, claimed: true }));
6948
+ return EXIT.SUCCESS;
6949
+ }
6950
+ render.ok(`claimed ${dim(id.slice(0, 8))}`);
6951
+ return EXIT.SUCCESS;
6952
+ }
6953
+ async function runTaskComplete(id, result, opts) {
6954
+ if (!id) {
6955
+ render.err("Usage: claudemesh task complete <id> [result]");
6956
+ return EXIT.INVALID_ARGS;
6957
+ }
6958
+ await withMesh({ meshSlug: opts.mesh ?? null }, async (client) => {
6959
+ await client.completeTask(id, result);
6960
+ });
6961
+ if (opts.json) {
6962
+ console.log(JSON.stringify({ id, completed: true, result: result ?? null }));
6963
+ return EXIT.SUCCESS;
6964
+ }
6965
+ render.ok(`completed ${dim(id.slice(0, 8))}`, result);
6966
+ return EXIT.SUCCESS;
6967
+ }
6968
+ var init_broker_actions = __esm(() => {
6969
+ init_connect();
6970
+ init_render();
6971
+ init_styles();
6972
+ init_exit_codes();
6973
+ });
6974
+
6718
6975
  // src/commands/remind.ts
6719
6976
  var exports_remind = {};
6720
6977
  __export(exports_remind, {
@@ -10163,6 +10420,16 @@ function formatPush(p, meshSlug) {
10163
10420
  return `[${meshSlug}]${tag} from ${p.senderPubkey.slice(0, 12)}… (${p.priority}, ${p.createdAt}):
10164
10421
  ${body}`;
10165
10422
  }
10423
+ function maybeWarnDeprecated(toolName) {
10424
+ const hint = DEPRECATED_TOOL_HINTS[toolName];
10425
+ if (!hint)
10426
+ return;
10427
+ if (warnedTools.has(toolName))
10428
+ return;
10429
+ warnedTools.add(toolName);
10430
+ process.stderr.write(`[claudemesh] mcp tool "${toolName}" is soft-deprecated in 1.1.0 ` + `and will be removed in 2.0.0. Use \`${hint}\` instead.
10431
+ `);
10432
+ }
10166
10433
  async function startMcpServer() {
10167
10434
  const serviceIdx = process.argv.indexOf("--service");
10168
10435
  if (serviceIdx !== -1 && process.argv[serviceIdx + 1]) {
@@ -10458,6 +10725,7 @@ ${manifest.allowed_tools.map((t) => ` - ${t}`).join(`
10458
10725
  if (config.meshes.length === 0) {
10459
10726
  return text("No meshes joined. Run `claudemesh join https://claudemesh.com/join/<token>` first.", true);
10460
10727
  }
10728
+ maybeWarnDeprecated(name);
10461
10729
  switch (name) {
10462
10730
  case "send_message": {
10463
10731
  const { to, message, priority } = args ?? {};
@@ -12221,12 +12489,40 @@ async function startServiceProxy(serviceName) {
12221
12489
  process.on("SIGTERM", shutdown);
12222
12490
  process.on("SIGINT", shutdown);
12223
12491
  }
12224
- var peerNameCache, peerNameCacheAge = 0, CACHE_TTL_MS = 30000;
12492
+ var peerNameCache, peerNameCacheAge = 0, CACHE_TTL_MS = 30000, DEPRECATED_TOOL_HINTS, warnedTools;
12225
12493
  var init_server = __esm(() => {
12226
12494
  init_definitions();
12227
12495
  init_facade();
12228
12496
  init_facade8();
12229
12497
  peerNameCache = new Map;
12498
+ DEPRECATED_TOOL_HINTS = {
12499
+ send_message: "claudemesh send <to> <msg> [--mesh X] [--priority Y]",
12500
+ list_peers: "claudemesh peers --json",
12501
+ check_messages: "claudemesh inbox --json",
12502
+ message_status: "claudemesh msg-status <id>",
12503
+ set_profile: "claudemesh profile --avatar X --bio Y",
12504
+ set_status: "claudemesh status set <state>",
12505
+ set_summary: "claudemesh summary <text>",
12506
+ set_visible: "claudemesh visible <true|false>",
12507
+ join_group: "claudemesh group join @<name> [--role X]",
12508
+ leave_group: "claudemesh group leave @<name>",
12509
+ get_state: "claudemesh state get <key> --json",
12510
+ set_state: "claudemesh state set <key> <value>",
12511
+ list_state: "claudemesh state list --json",
12512
+ remember: "claudemesh remember <text>",
12513
+ recall: "claudemesh recall <query> --json",
12514
+ forget: "claudemesh forget <id>",
12515
+ schedule_reminder: "claudemesh remind <msg> --in/--at/--cron",
12516
+ list_scheduled: "claudemesh remind list --json",
12517
+ cancel_scheduled: "claudemesh remind cancel <id>",
12518
+ mesh_info: "claudemesh info --json",
12519
+ mesh_stats: "claudemesh stats --json",
12520
+ mesh_clock: "claudemesh clock --json",
12521
+ ping_mesh: "claudemesh ping",
12522
+ claim_task: "claudemesh task claim <id>",
12523
+ complete_task: "claudemesh task complete <id>"
12524
+ };
12525
+ warnedTools = new Set;
12230
12526
  });
12231
12527
 
12232
12528
  // src/commands/mcp.ts
@@ -12521,12 +12817,28 @@ Messaging
12521
12817
  claudemesh peers see who's online
12522
12818
  claudemesh send <to> <msg> send a message
12523
12819
  claudemesh inbox drain pending messages
12820
+ claudemesh msg-status <id> check delivery status
12524
12821
  claudemesh state get|set|list shared state
12525
12822
  claudemesh remember <text> store a memory
12526
12823
  claudemesh recall <query> search memories
12824
+ claudemesh forget <id> remove a memory
12527
12825
  claudemesh remind ... schedule a reminder
12528
12826
  claudemesh profile view or edit your profile
12529
12827
  claudemesh info mesh overview
12828
+ claudemesh stats per-peer activity counters
12829
+ claudemesh clock mesh logical clock state
12830
+ claudemesh ping diagnostic round-trip
12831
+
12832
+ Identity / presence
12833
+ claudemesh status set <state> set peer status (idle | working | dnd)
12834
+ claudemesh summary <text> broadcast 1-2 sentence work summary
12835
+ claudemesh visible <true|false> toggle peer visibility
12836
+ claudemesh group join @<name> join a group (--role X optional)
12837
+ claudemesh group leave @<name> leave a group
12838
+
12839
+ Tasks
12840
+ claudemesh task claim <id> claim an unclaimed task
12841
+ claudemesh task complete <id> mark task done [result]
12530
12842
 
12531
12843
  Auth
12532
12844
  claudemesh login sign in (browser or paste token)
@@ -12723,6 +13035,11 @@ async function main() {
12723
13035
  process.exit(await recall2(positionals.join(" "), { json: !!flags.json }));
12724
13036
  break;
12725
13037
  }
13038
+ case "forget": {
13039
+ const { runForget: runForget2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13040
+ process.exit(await runForget2(positionals[0], { mesh: flags.mesh, json: !!flags.json }));
13041
+ break;
13042
+ }
12726
13043
  case "remind": {
12727
13044
  const { runRemind: runRemind2 } = await Promise.resolve().then(() => (init_remind(), exports_remind));
12728
13045
  await runRemind2({ mesh: flags.mesh }, positionals);
@@ -12733,6 +13050,64 @@ async function main() {
12733
13050
  await runProfile2(flags);
12734
13051
  break;
12735
13052
  }
13053
+ case "summary": {
13054
+ const { runSummary: runSummary2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13055
+ process.exit(await runSummary2(positionals.join(" "), { mesh: flags.mesh, json: !!flags.json }));
13056
+ break;
13057
+ }
13058
+ case "visible": {
13059
+ const { runVisible: runVisible2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13060
+ process.exit(await runVisible2(positionals[0], { mesh: flags.mesh, json: !!flags.json }));
13061
+ break;
13062
+ }
13063
+ case "group": {
13064
+ const sub = positionals[0];
13065
+ if (sub === "join") {
13066
+ const { runGroupJoin: runGroupJoin2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13067
+ process.exit(await runGroupJoin2(positionals[1], { mesh: flags.mesh, role: flags.role, json: !!flags.json }));
13068
+ } else if (sub === "leave") {
13069
+ const { runGroupLeave: runGroupLeave2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13070
+ process.exit(await runGroupLeave2(positionals[1], { mesh: flags.mesh, json: !!flags.json }));
13071
+ } else {
13072
+ console.error("Usage: claudemesh group <join|leave> @<name> [--role X]");
13073
+ process.exit(EXIT.INVALID_ARGS);
13074
+ }
13075
+ break;
13076
+ }
13077
+ case "msg-status": {
13078
+ const { runMsgStatus: runMsgStatus2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13079
+ process.exit(await runMsgStatus2(positionals[0], { mesh: flags.mesh, json: !!flags.json }));
13080
+ break;
13081
+ }
13082
+ case "clock": {
13083
+ const { runClock: runClock2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13084
+ process.exit(await runClock2({ mesh: flags.mesh, json: !!flags.json }));
13085
+ break;
13086
+ }
13087
+ case "stats": {
13088
+ const { runStats: runStats2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13089
+ process.exit(await runStats2({ mesh: flags.mesh, json: !!flags.json }));
13090
+ break;
13091
+ }
13092
+ case "ping": {
13093
+ const { runPing: runPing2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13094
+ process.exit(await runPing2({ mesh: flags.mesh, json: !!flags.json }));
13095
+ break;
13096
+ }
13097
+ case "task": {
13098
+ const sub = positionals[0];
13099
+ if (sub === "claim") {
13100
+ const { runTaskClaim: runTaskClaim2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13101
+ process.exit(await runTaskClaim2(positionals[1], { mesh: flags.mesh, json: !!flags.json }));
13102
+ } else if (sub === "complete") {
13103
+ const { runTaskComplete: runTaskComplete2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13104
+ process.exit(await runTaskComplete2(positionals[1], positionals.slice(2).join(" ") || undefined, { mesh: flags.mesh, json: !!flags.json }));
13105
+ } else {
13106
+ console.error("Usage: claudemesh task <claim|complete> <id> [result]");
13107
+ process.exit(EXIT.INVALID_ARGS);
13108
+ }
13109
+ break;
13110
+ }
12736
13111
  case "login": {
12737
13112
  const { login: login2 } = await Promise.resolve().then(() => (init_login(), exports_login));
12738
13113
  process.exit(await login2());
@@ -12769,8 +13144,13 @@ async function main() {
12769
13144
  break;
12770
13145
  }
12771
13146
  case "status": {
12772
- const { runStatus: runStatus2 } = await Promise.resolve().then(() => (init_status(), exports_status));
12773
- await runStatus2();
13147
+ if (positionals[0] === "set") {
13148
+ const { runStatusSet: runStatusSet2 } = await Promise.resolve().then(() => (init_broker_actions(), exports_broker_actions));
13149
+ process.exit(await runStatusSet2(positionals[1] ?? "", { mesh: flags.mesh, json: !!flags.json }));
13150
+ } else {
13151
+ const { runStatus: runStatus2 } = await Promise.resolve().then(() => (init_status(), exports_status));
13152
+ await runStatus2();
13153
+ }
12774
13154
  break;
12775
13155
  }
12776
13156
  case "sync": {
@@ -12866,4 +13246,4 @@ main().catch((err) => {
12866
13246
  process.exit(EXIT.INTERNAL_ERROR);
12867
13247
  });
12868
13248
 
12869
- //# debugId=AC9613431467FF4964756E2164756E21
13249
+ //# debugId=0A4A6F72C9E014B864756E2164756E21