Fixes the 'live peer looks disconnected' class of bugs. Two layers: ROOT CAUSE — involuntary mesh context loss: The session→mesh binding lived only in the daemon's in-memory registry, so a daemon restart (e.g. `daemon down && up`) wiped it. Every live session then lost its mesh, and CLI commands fell back to an arbitrary default mesh — a peer that never moved looked offline. Fix: persist session bindings to ~/.claudemesh/daemon/sessions.json (secret-free — keypairs reload from the per-session keypair store). On boot the daemon rehydrates each binding whose pid is still alive (with a start-time PID-reuse guard), reloads its keypair, re-signs a parent attestation, and re-registers it — which reconnects its SessionBroker WS. Restarts are now transparent; sessions keep their mesh. DEFENSIVE LAYER — cross-mesh send resolution: `send` without --mesh and several joined meshes returned mesh_required; a prefix under --mesh X resolved against the default mesh's roster, not X's (only the full 64-char pubkey worked). Now a name/prefix is resolved across all joined meshes (or scoped to --mesh): unique match auto-selects its mesh, multi-mesh match asks for --mesh, none gives a clear error. Kills mesh_required for peers on a non-default mesh and fixes P3. Maps to field-report P1/P2/P3. P4 (shared member) left as-is (by design). New: 5 persistence unit tests. Full suite 119/119. Daemon boot verified. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
72 lines
1.8 KiB
JSON
72 lines
1.8 KiB
JSON
{
|
|
"name": "claudemesh-cli",
|
|
"version": "1.36.0",
|
|
"description": "Peer mesh for Claude Code sessions — CLI + MCP server.",
|
|
"keywords": [
|
|
"claude-code",
|
|
"mcp",
|
|
"model-context-protocol",
|
|
"claudemesh",
|
|
"peer-messaging",
|
|
"multi-agent"
|
|
],
|
|
"author": "Alejandro Gutiérrez",
|
|
"license": "MIT",
|
|
"homepage": "https://claudemesh.com",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/alezmad/claudemesh.git",
|
|
"directory": "apps/cli"
|
|
},
|
|
"type": "module",
|
|
"bin": {
|
|
"claudemesh": "./dist/entrypoints/cli.js"
|
|
},
|
|
"files": [
|
|
"dist",
|
|
"skills",
|
|
"README.md",
|
|
"LICENSE"
|
|
],
|
|
"publishConfig": {
|
|
"access": "public"
|
|
},
|
|
"scripts": {
|
|
"build": "bun build.ts",
|
|
"clean": "git clean -xdf .cache .turbo dist node_modules",
|
|
"dev": "bun --hot src/entrypoints/cli.ts",
|
|
"start": "bun src/entrypoints/cli.ts",
|
|
"format": "prettier --check . --ignore-path ../../.gitignore",
|
|
"lint": "eslint",
|
|
"prepublishOnly": "bun run build",
|
|
"test": "vitest run",
|
|
"typecheck": "tsc --noEmit"
|
|
},
|
|
"prettier": "@turbostarter/prettier-config",
|
|
"engines": {
|
|
"node": ">=20"
|
|
},
|
|
"dependencies": {
|
|
"@modelcontextprotocol/sdk": "1.27.1",
|
|
"citty": "0.2.2",
|
|
"libsodium-wrappers": "0.7.15",
|
|
"qrcode-terminal": "0.12.0",
|
|
"ws": "8.20.0",
|
|
"zod": "4.1.13"
|
|
},
|
|
"devDependencies": {
|
|
"@claudemesh/sdk": "workspace:*",
|
|
"@turbostarter/eslint-config": "workspace:*",
|
|
"@turbostarter/prettier-config": "workspace:*",
|
|
"@turbostarter/tsconfig": "workspace:*",
|
|
"@turbostarter/vitest-config": "workspace:*",
|
|
"@types/libsodium-wrappers": "0.7.14",
|
|
"@types/qrcode-terminal": "0.12.2",
|
|
"@types/ws": "8.5.13",
|
|
"eslint": "catalog:",
|
|
"prettier": "catalog:",
|
|
"typescript": "catalog:",
|
|
"vitest": "catalog:"
|
|
}
|
|
}
|