@meshwhisper/cli 0.1.0 → 0.2.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.
package/dist/index.d.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export declare function generateVapidKeys(): {
3
+ publicKey: string;
4
+ privateKey: string;
5
+ };
package/dist/index.js CHANGED
@@ -1,173 +1,580 @@
1
1
  #!/usr/bin/env node
2
2
  // ============================================================
3
3
  // MeshWhisper CLI
4
- // Developer tooling. Usage:
5
- // npx @meshwhisper/cli init
4
+ //
5
+ // npx @meshwhisper/cli init scaffold a project: node deployment + SDK skeleton
6
+ // npx @meshwhisper/cli doctor health-check a MeshWhisper node
7
+ // npx @meshwhisper/cli vapid generate Web Push VAPID keys
8
+ //
9
+ // The init command is the front door described in docs/direction.md:
10
+ // npm install → running node + SDK skeleton in under 30 minutes.
6
11
  // ============================================================
7
12
  import * as fs from 'node:fs';
8
13
  import * as path from 'node:path';
9
- import * as readline from 'node:readline/promises';
14
+ import * as readline from 'node:readline';
15
+ import { generateKeyPairSync } from 'node:crypto';
10
16
  import { stdin as input, stdout as output } from 'node:process';
11
17
  import pc from 'picocolors';
18
+ const FOUNDATION_RELAY = 'wss://relay.meshwhisper.org';
19
+ const FOUNDATION_FEDERATION_PUBKEY = '34904664a3b5b0b35a8eb41bd3b1d493b79981af2a47069e246db28854d6ce23';
20
+ const DOCS_URL = 'https://github.com/twotwoonethree/meshwhisper/tree/main/docs';
12
21
  // ============================================================
13
- // Helpers
22
+ // Prompter
14
23
  // ============================================================
15
- function randomHex(bytes) {
16
- const buf = new Uint8Array(bytes);
17
- globalThis.crypto.getRandomValues(buf);
18
- return Buffer.from(buf).toString('hex');
19
- }
20
- function randomBase64(bytes) {
21
- const buf = new Uint8Array(bytes);
22
- globalThis.crypto.getRandomValues(buf);
23
- return Buffer.from(buf).toString('base64');
24
+ // Line-queue prompter: unlike readline/promises, this buffers lines that
25
+ // arrive before a question is asked, so piped stdin (CI, tests, heredocs)
26
+ // works the same as an interactive TTY.
27
+ class Prompter {
28
+ queue = [];
29
+ waiters = [];
30
+ closed = false;
31
+ iface;
32
+ constructor() {
33
+ this.iface = readline.createInterface({ input, output, terminal: input.isTTY ?? false });
34
+ this.iface.on('line', (line) => {
35
+ const waiter = this.waiters.shift();
36
+ if (waiter)
37
+ waiter(line);
38
+ else
39
+ this.queue.push(line);
40
+ });
41
+ this.iface.on('close', () => {
42
+ this.closed = true;
43
+ for (const waiter of this.waiters)
44
+ waiter('');
45
+ this.waiters = [];
46
+ });
47
+ }
48
+ async question(prompt) {
49
+ output.write(prompt);
50
+ if (this.queue.length > 0) {
51
+ const line = this.queue.shift();
52
+ if (!input.isTTY)
53
+ output.write(line + '\n');
54
+ return line;
55
+ }
56
+ if (this.closed) {
57
+ output.write('\n');
58
+ return '';
59
+ }
60
+ return new Promise((resolve) => this.waiters.push(resolve));
61
+ }
62
+ close() {
63
+ if (!this.closed)
64
+ this.iface.close();
65
+ }
24
66
  }
25
- function printBanner() {
67
+ // ============================================================
68
+ // Output helpers
69
+ // ============================================================
70
+ function banner() {
26
71
  console.log('');
27
72
  console.log(pc.bold(pc.cyan(' MeshWhisper CLI')));
28
- console.log(pc.dim(' Serverless P2P E2EE messaging SDK'));
73
+ console.log(pc.dim(' Self-hostable E2EE messaging SDK + relay node'));
29
74
  console.log('');
30
75
  }
31
- function printStep(n, text) {
32
- console.log(pc.bold(pc.green(` ${n}.`)) + ' ' + text);
76
+ function step(n, text) {
77
+ console.log('');
78
+ console.log(pc.bold(pc.green(` ${n}.`)) + ' ' + pc.bold(text));
33
79
  }
34
- function printNote(text) {
80
+ function note(text) {
35
81
  console.log(pc.dim(` ${text}`));
36
82
  }
83
+ function wrote(file) {
84
+ console.log(` ${pc.green('✓')} wrote ${pc.cyan(file)}`);
85
+ }
86
+ function cmd(text) {
87
+ console.log(` ${pc.yellow(text)}`);
88
+ }
37
89
  // ============================================================
38
- // Commands
90
+ // VAPID key generation (Web Push, RFC 8292) — no dependencies.
91
+ // Same output format as `npx web-push generate-vapid-keys`.
39
92
  // ============================================================
40
- async function cmdInit() {
41
- printBanner();
42
- console.log(pc.bold(' Initializing a new MeshWhisper project\n'));
43
- const rl = readline.createInterface({ input, output });
44
- // Detect package.json to guess the bundle ID
45
- let detectedBundleId = 'com.example.myapp';
46
- try {
47
- const pkgRaw = fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8');
48
- const pkg = JSON.parse(pkgRaw);
49
- if (pkg.name) {
50
- // Convert "my-app" → "com.example.my-app" as a suggestion
51
- detectedBundleId = `com.example.${pkg.name.replace(/^@[^/]+\//, '')}`;
52
- }
93
+ function b64url(buf) {
94
+ return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
95
+ }
96
+ export function generateVapidKeys() {
97
+ const { publicKey, privateKey } = generateKeyPairSync('ec', { namedCurve: 'P-256' });
98
+ const pub = publicKey.export({ format: 'jwk' });
99
+ const priv = privateKey.export({ format: 'jwk' });
100
+ const x = Buffer.from(pub.x, 'base64url');
101
+ const y = Buffer.from(pub.y, 'base64url');
102
+ // Uncompressed EC point: 0x04 || X || Y (65 bytes)
103
+ const point = Buffer.concat([Buffer.from([0x04]), x, y]);
104
+ return { publicKey: b64url(point), privateKey: priv.d };
105
+ }
106
+ // ============================================================
107
+ // Generated file templates
108
+ // ============================================================
109
+ function dockerfileNode() {
110
+ return `# MeshWhisper Node — relay, store-and-forward, push forwarding, media
111
+ # storage, encrypted archive, username directory, federation.
112
+ # Installs the published @meshwhisper/node package; no repo checkout needed.
113
+
114
+ FROM node:22-alpine AS builder
115
+ # python3/make/g++ compile better-sqlite3's native bindings
116
+ RUN apk add --no-cache python3 make g++ \\
117
+ && npm install -g --prefix /opt/meshwhisper @meshwhisper/node
118
+
119
+ FROM node:22-alpine
120
+ ENV NODE_ENV=production
121
+ ENV DB_PATH=/data/meshwhisper.db
122
+ COPY --from=builder /opt/meshwhisper /opt/meshwhisper
123
+ # sqlite CLI enables the documented hot-backup procedure:
124
+ # docker compose exec node sqlite3 /data/meshwhisper.db ".backup /data/backup.db"
125
+ RUN apk add --no-cache sqlite \\
126
+ && mkdir -p /data \\
127
+ && addgroup -S meshwhisper && adduser -S meshwhisper -G meshwhisper \\
128
+ && chown meshwhisper:meshwhisper /data
129
+ USER meshwhisper
130
+ EXPOSE 8080
131
+ HEALTHCHECK --interval=30s --timeout=5s --retries=3 \\
132
+ CMD wget -qO- http://localhost:\${PORT:-8080}/health || exit 1
133
+ CMD ["/opt/meshwhisper/bin/meshwhisper-node"]
134
+ `;
135
+ }
136
+ function dockerfilePush() {
137
+ return `# MeshWhisper push service — Web Push (VAPID) / APNs / FCM wake signals.
138
+ FROM node:22-alpine AS builder
139
+ RUN npm install -g --prefix /opt/meshwhisper @meshwhisper/push-service
140
+
141
+ FROM node:22-alpine
142
+ ENV NODE_ENV=production
143
+ COPY --from=builder /opt/meshwhisper /opt/meshwhisper
144
+ RUN addgroup -S meshwhisper && adduser -S meshwhisper -G meshwhisper
145
+ USER meshwhisper
146
+ EXPOSE 4000
147
+ CMD ["/opt/meshwhisper/bin/meshwhisper-push"]
148
+ `;
149
+ }
150
+ function dockerCompose(opts) {
151
+ const lines = [];
152
+ lines.push('# Generated by `npx @meshwhisper/cli init`.');
153
+ lines.push('# Copy this directory to your server, review .env, then: docker compose up -d');
154
+ lines.push('# Full operator guide: docs/self-hosting.md in the MeshWhisper repo.');
155
+ lines.push('');
156
+ lines.push('services:');
157
+ lines.push(' node:');
158
+ lines.push(' build:');
159
+ lines.push(' context: .');
160
+ lines.push(' dockerfile: Dockerfile.node');
161
+ lines.push(' restart: unless-stopped');
162
+ lines.push(' ports:');
163
+ lines.push(' # Bound to localhost — your reverse proxy (Caddy/nginx) terminates TLS.');
164
+ lines.push(' - "127.0.0.1:8080:8080"');
165
+ lines.push(' environment:');
166
+ lines.push(' PORT: "8080"');
167
+ lines.push(' BASE_URL: "${BASE_URL}"');
168
+ lines.push(' DB_PATH: "/data/meshwhisper.db"');
169
+ lines.push(' BLOB_TTL_HOURS: "720"');
170
+ lines.push(' MEDIA_TTL_HOURS: "168"');
171
+ lines.push(' # Trust X-Forwarded-For from the reverse proxy for rate limiting');
172
+ lines.push(' TRUST_PROXY: "1"');
173
+ if (opts.push) {
174
+ lines.push(' PUSH_WEBHOOK_URL: "http://push:4000/notify"');
53
175
  }
54
- catch { /* no package.json — ignore */ }
55
- const bundleId = (await rl.question(pc.bold(' App bundle ID') + pc.dim(` (e.g. ${detectedBundleId}): `))).trim() || detectedBundleId;
56
- const nodeChoice = (await rl.question(pc.bold(' Node') + pc.dim(' [mesh/self-hosted] (default: mesh): '))).trim().toLowerCase() || 'mesh';
57
- let nodeConfig = '"mesh"';
58
- let selfHostedUrl = '';
59
- if (nodeChoice === 'self-hosted' || nodeChoice === 'self') {
60
- selfHostedUrl = (await rl.question(pc.bold(' Node WebSocket URL') + pc.dim(' (e.g. wss://msg.myapp.com): '))).trim();
61
- nodeConfig = selfHostedUrl ? `"${selfHostedUrl}"` : '"mesh"';
176
+ if (opts.federation) {
177
+ lines.push(' # Open federation: forward packets for any relay that completes');
178
+ lines.push(' # the handshake. See docs/federation.md for the threat model.');
179
+ lines.push(' FEDERATION_MODE: "open"');
62
180
  }
63
- rl.close();
64
- const developerKey = randomBase64(32);
65
- const salt = randomHex(32);
66
- console.log('');
67
- printStep(1, 'Generated developer key and salt');
68
- printNote('Keep these in your environment variables — do not commit them.');
69
- // Print env block
70
- console.log('');
71
- console.log(pc.bgBlack(pc.white(' .env ')));
72
- console.log('');
73
- console.log(` MESHWHISPER_DEVELOPER_KEY=${developerKey}`);
74
- console.log(` MESHWHISPER_SALT=${salt}`);
75
- if (selfHostedUrl) {
76
- console.log(` MESHWHISPER_NODE_URL=${selfHostedUrl}`);
181
+ lines.push(' volumes:');
182
+ lines.push(' - node_data:/data');
183
+ if (opts.federation) {
184
+ lines.push(' - ./federation-peers.json:/data/federation-peers.json:ro');
77
185
  }
78
- console.log('');
79
- // Print SDK init snippet
80
- printStep(2, 'Add this to your app entry point');
81
- console.log('');
82
- console.log(pc.bgBlack(pc.white(' TypeScript / JavaScript ')));
83
- console.log('');
84
- const snippet = `import { MeshWhisper } from '@meshwhisper/sdk';
186
+ lines.push(' healthcheck:');
187
+ lines.push(' test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]');
188
+ lines.push(' interval: 30s');
189
+ lines.push(' timeout: 5s');
190
+ lines.push(' retries: 3');
191
+ if (opts.push) {
192
+ lines.push('');
193
+ lines.push(' push:');
194
+ lines.push(' build:');
195
+ lines.push(' context: .');
196
+ lines.push(' dockerfile: Dockerfile.push');
197
+ lines.push(' restart: unless-stopped');
198
+ lines.push(' environment:');
199
+ lines.push(' PUSH_PORT: "4000"');
200
+ lines.push(' VAPID_PUBLIC_KEY: "${VAPID_PUBLIC_KEY}"');
201
+ lines.push(' VAPID_PRIVATE_KEY: "${VAPID_PRIVATE_KEY}"');
202
+ lines.push(' VAPID_SUBJECT: "${VAPID_SUBJECT}"');
203
+ }
204
+ lines.push('');
205
+ lines.push('volumes:');
206
+ lines.push(' node_data:');
207
+ lines.push('');
208
+ return lines.join('\n');
209
+ }
210
+ function envFile(opts) {
211
+ const lines = [];
212
+ lines.push('# MeshWhisper node environment — do NOT commit this file.');
213
+ lines.push(`BASE_URL=${opts.baseUrl}`);
214
+ if (opts.push && opts.vapid) {
215
+ lines.push('');
216
+ lines.push('# Web Push (generated by `npx @meshwhisper/cli init`; regenerate with `npx @meshwhisper/cli vapid`)');
217
+ lines.push(`VAPID_PUBLIC_KEY=${opts.vapid.publicKey}`);
218
+ lines.push(`VAPID_PRIVATE_KEY=${opts.vapid.privateKey}`);
219
+ lines.push(`VAPID_SUBJECT=mailto:${opts.contactEmail}`);
220
+ }
221
+ lines.push('');
222
+ return lines.join('\n');
223
+ }
224
+ function federationPeersFile() {
225
+ return JSON.stringify({
226
+ peers: [
227
+ {
228
+ pubkey: FOUNDATION_FEDERATION_PUBKEY,
229
+ url: FOUNDATION_RELAY,
230
+ },
231
+ ],
232
+ }, null, 2) + '\n';
233
+ }
234
+ function browserSkeleton(opts) {
235
+ const pushSetup = opts.push
236
+ ? `
237
+ // -- Web Push: wakes the app when a message arrives while it's closed --
238
+ // Serve meshwhisper-sw.js from your domain root:
239
+ // cp node_modules/@meshwhisper/service-worker/dist/meshwhisper-sw.js public/
240
+ const registration = await navigator.serviceWorker.register('/meshwhisper-sw.js');
241
+ const subscription = await registration.pushManager.subscribe({
242
+ userVisibleOnly: true,
243
+ applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY),
244
+ });
245
+ `
246
+ : '';
247
+ const pushConfig = opts.push
248
+ ? `
249
+ push: {
250
+ platform: 'webpush',
251
+ subscription: subscription.toJSON() as WebPushSubscription,
252
+ },`
253
+ : '';
254
+ const pushImport = opts.push ? `\nimport type { WebPushSubscription } from '@meshwhisper/sdk';` : '';
255
+ const vapidConst = opts.push
256
+ ? `\n// Your VAPID *public* key (same value as VAPID_PUBLIC_KEY in the node's .env)\nconst VAPID_PUBLIC_KEY = 'paste_your_vapid_public_key_here';\n
257
+ function urlBase64ToUint8Array(base64String: string): Uint8Array {
258
+ const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
259
+ const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
260
+ const raw = atob(base64);
261
+ return Uint8Array.from(raw, (c) => c.charCodeAt(0));
262
+ }\n`
263
+ : '';
264
+ return `// Generated by \`npx @meshwhisper/cli init\` — browser/PWA messaging module.
265
+ // Everything is encrypted on-device; the node never holds a decryption key.
266
+
267
+ import { MeshWhisper } from '@meshwhisper/sdk';${pushImport}
268
+
269
+ const NAMESPACE = ${JSON.stringify(opts.namespace)};
270
+ const NODE_URL = ${JSON.stringify(opts.nodeUrl)};
271
+ ${vapidConst}
272
+ export async function initMessaging(
273
+ onText: (senderId: string, text: string) => void,
274
+ onStatus?: (messageId: string, status: string) => void,
275
+ ) {${pushSetup}
276
+ const mw = await MeshWhisper.init({
277
+ namespace: NAMESPACE,
278
+ node: NODE_URL,${pushConfig}
279
+ onMessage: async (message) => {
280
+ const media = await MeshWhisper.downloadMedia(message);
281
+ if (media) {
282
+ console.log('media from', message.senderId, '-', media.byteLength, 'bytes');
283
+ await MeshWhisper.markRead(message.id, message.senderId);
284
+ return;
285
+ }
286
+ onText(message.senderId, new TextDecoder().decode(new Uint8Array(message.payload)));
287
+ await MeshWhisper.markRead(message.id, message.senderId);
288
+ },
289
+ onMessageStatus: (messageId, status) => onStatus?.(messageId, status),
290
+ onConnectionStatus: (status) => console.log('[meshwhisper]', status),
291
+ });
292
+
293
+ return mw;
294
+ }
295
+
296
+ // Your peer ID — share it (or register a username) so contacts can reach you
297
+ export function myId(): string {
298
+ return MeshWhisper.instance.getLocalPeerId();
299
+ }
300
+
301
+ export async function send(recipientId: string, text: string): Promise<void> {
302
+ await MeshWhisper.send(recipientId, new TextEncoder().encode(text));
303
+ }
304
+
305
+ export async function history(peerId: string) {
306
+ return MeshWhisper.getMessages(peerId, { limit: 50 });
307
+ }
308
+ `;
309
+ }
310
+ function nodeSkeleton(opts) {
311
+ return `// Generated by \`npx @meshwhisper/cli init\` — minimal terminal chat.
312
+ //
313
+ // Run two of these (different usernames) and message each other:
314
+ // npx tsx meshwhisper-chat.mts alice
315
+ // npx tsx meshwhisper-chat.mts bob
316
+ // Then in alice's terminal: /add @bob
317
+ // and start typing.
318
+
319
+ import * as readline from 'node:readline/promises';
320
+ import { stdin as input, stdout as output } from 'node:process';
321
+ import { MeshWhisper } from '@meshwhisper/sdk';
322
+ import { NodeStorage } from '@meshwhisper/sdk/persistence/node';
323
+
324
+ const NAMESPACE = ${JSON.stringify(opts.namespace)};
325
+ const NODE_URL = ${JSON.stringify(opts.nodeUrl)};
326
+
327
+ const username = process.argv[2];
328
+ if (!username) {
329
+ console.error('usage: npx tsx meshwhisper-chat.mts <username>');
330
+ process.exit(1);
331
+ }
85
332
 
86
333
  const mw = await MeshWhisper.init({
87
- namespace: '${bundleId}',
88
- node: ${nodeConfig},
89
- developerKey: process.env.MESHWHISPER_DEVELOPER_KEY,
334
+ namespace: NAMESPACE,
335
+ node: NODE_URL,
336
+ username,
337
+ storage: new NodeStorage(\`./.meshwhisper/\${username}\`),
338
+ onMessage: async (message) => {
339
+ const text = new TextDecoder().decode(new Uint8Array(message.payload));
340
+ console.log(\`\\n \${message.senderId.slice(0, 8)}… \${text}\`);
341
+ await MeshWhisper.markRead(message.id, message.senderId);
342
+ },
343
+ onConnectionStatus: (status) => console.log(\` [\${status}]\`),
90
344
  });
91
345
 
92
- // Send a message
93
- await MeshWhisper.send(recipientId, new TextEncoder().encode('Hello!'));
346
+ console.log(\` you are @\${username} (\${mw.getLocalPeerId().slice(0, 16)}…)\`);
347
+ console.log(' /add @name add a contact by username');
348
+ console.log(' anything else is sent to the last-added contact\\n');
94
349
 
95
- // Receive messages
96
- MeshWhisper.onMessage((message) => {
97
- const text = new TextDecoder().decode(new Uint8Array(message.payload));
98
- console.log('Received:', text);
99
- });
350
+ let currentPeer: string | null = null;
351
+ const rl = readline.createInterface({ input, output });
352
+
353
+ for (;;) {
354
+ const line = (await rl.question('> ')).trim();
355
+ if (!line) continue;
356
+ if (line === '/quit') break;
357
+ if (line.startsWith('/add ')) {
358
+ const target = line.slice(5).trim();
359
+ const peerId = await MeshWhisper.addContactByKey(target);
360
+ if (peerId) {
361
+ currentPeer = peerId;
362
+ console.log(\` added \${target} → \${peerId.slice(0, 16)}…\`);
363
+ } else {
364
+ console.log(\` could not find \${target}\`);
365
+ }
366
+ continue;
367
+ }
368
+ if (!currentPeer) {
369
+ console.log(' no contact yet — /add @name first');
370
+ continue;
371
+ }
372
+ await MeshWhisper.send(currentPeer, new TextEncoder().encode(line));
373
+ }
374
+
375
+ rl.close();
376
+ process.exit(0);
100
377
  `;
101
- snippet.split('\n').forEach((line) => console.log(' ' + pc.cyan(line)));
102
- if (nodeChoice === 'self-hosted' || nodeChoice === 'self') {
103
- printStep(3, 'Deploy your MeshWhisper Node');
104
- console.log('');
105
- printNote('Use the provided Dockerfile in the @meshwhisper/node package:');
106
- console.log('');
107
- console.log(` docker build -t meshwhisper-node ./node_modules/@meshwhisper/node`);
108
- console.log(` docker run -p 443:8080 \\`);
109
- console.log(` -e PORT=8080 \\`);
110
- console.log(` -e PUSH_WEBHOOK_URL=https://your-push-server/notify \\`);
111
- console.log(` meshwhisper-node`);
112
- console.log('');
113
- printNote('Or use docker compose up with the generated docker-compose.yml.');
114
- writeDockerCompose(selfHostedUrl);
378
+ }
379
+ // ============================================================
380
+ // File-writing helpers
381
+ // ============================================================
382
+ function writeIfAbsent(filePath, content, mode) {
383
+ if (fs.existsSync(filePath)) {
384
+ console.log(` ${pc.yellow('!')} ${pc.cyan(path.relative(process.cwd(), filePath))} already exists — left untouched`);
385
+ return false;
386
+ }
387
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
388
+ fs.writeFileSync(filePath, content, mode !== undefined ? { mode } : undefined);
389
+ wrote(path.relative(process.cwd(), filePath));
390
+ return true;
391
+ }
392
+ function appendGitignore(entries) {
393
+ const gitignorePath = path.join(process.cwd(), '.gitignore');
394
+ const existing = fs.existsSync(gitignorePath) ? fs.readFileSync(gitignorePath, 'utf-8') : '';
395
+ const missing = entries.filter((e) => !existing.split('\n').some((l) => l.trim() === e));
396
+ if (missing.length === 0)
397
+ return;
398
+ const block = `${existing.endsWith('\n') || existing === '' ? '' : '\n'}\n# MeshWhisper — secrets and local identity stores\n${missing.join('\n')}\n`;
399
+ fs.appendFileSync(gitignorePath, block);
400
+ wrote('.gitignore (updated)');
401
+ }
402
+ // ============================================================
403
+ // init
404
+ // ============================================================
405
+ async function cmdInit() {
406
+ banner();
407
+ console.log(pc.bold(' Scaffolding a MeshWhisper project\n'));
408
+ const rl = new Prompter();
409
+ // -- Namespace --
410
+ let suggestedNs = 'com.example.myapp';
411
+ try {
412
+ const pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'));
413
+ if (pkg.name)
414
+ suggestedNs = `com.example.${pkg.name.replace(/^@[^/]+\//, '')}`;
115
415
  }
416
+ catch { /* no package.json */ }
417
+ const namespace = (await rl.question(pc.bold(' App namespace / bundle ID ') + pc.dim(`(${suggestedNs}): `))).trim() || suggestedNs;
418
+ // -- Node choice --
116
419
  console.log('');
117
- console.log(pc.bold(pc.green(' Done!')));
118
- console.log(pc.dim(' Docs: https://meshwhisper.io/docs'));
420
+ console.log(pc.bold(' Which node should your app connect to?'));
421
+ console.log(` ${pc.cyan('1)')} Foundation relay ${pc.dim('— zero setup, fine for development and small deployments')}`);
422
+ console.log(` ${pc.cyan('2)')} Self-hosted ${pc.dim('— your own node on your own server (recommended for production)')}`);
423
+ const nodeChoice = (await rl.question(pc.bold(' Choice ') + pc.dim('(1): '))).trim() || '1';
424
+ const selfHosted = nodeChoice === '2';
425
+ let nodeUrl = FOUNDATION_RELAY;
426
+ let wantPush = false;
427
+ let wantFederation = false;
428
+ let contactEmail = 'you@example.com';
429
+ if (selfHosted) {
430
+ const urlAnswer = (await rl.question(pc.bold(' Node WebSocket URL ') + pc.dim('(wss://relay.myapp.com): '))).trim();
431
+ nodeUrl = urlAnswer || 'wss://relay.myapp.com';
432
+ if (!/^wss?:\/\//.test(nodeUrl))
433
+ nodeUrl = `wss://${nodeUrl}`;
434
+ const pushAnswer = (await rl.question(pc.bold(' Enable Web Push notifications? ') + pc.dim('[Y/n]: '))).trim().toLowerCase();
435
+ wantPush = pushAnswer === '' || pushAnswer === 'y' || pushAnswer === 'yes';
436
+ if (wantPush) {
437
+ contactEmail = (await rl.question(pc.bold(' Contact email for VAPID ') + pc.dim('(you@example.com): '))).trim() || contactEmail;
438
+ }
439
+ const fedAnswer = (await rl.question(pc.bold(' Join the relay mesh? ') + pc.dim('open federation — your node forwards packets for other relays [Y/n]: '))).trim().toLowerCase();
440
+ wantFederation = fedAnswer === '' || fedAnswer === 'y' || fedAnswer === 'yes';
441
+ }
442
+ // -- App platform --
119
443
  console.log('');
120
- }
121
- function writeDockerCompose(nodeUrl) {
122
- const compose = `# Generated by meshwhisper init
123
- # docker compose up
124
-
125
- services:
126
- node:
127
- build:
128
- context: .
129
- dockerfile: node/Dockerfile
130
- ports:
131
- - "8080:8080"
132
- environment:
133
- PORT: "8080"
134
- BLOB_TTL_HOURS: "72"
135
- MEDIA_TTL_HOURS: "168"
136
- # BASE_URL: https://msg.myapp.com
137
- PUSH_WEBHOOK_URL: "http://push:4000/notify"
138
- restart: unless-stopped
139
- healthcheck:
140
- test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
141
- interval: 30s
142
- timeout: 5s
143
- retries: 3
144
-
145
- push:
146
- build:
147
- context: .
148
- dockerfile: push-service/Dockerfile
149
- environment:
150
- PUSH_PORT: "4000"
151
- # APNs uncomment and fill in for iOS push support
152
- # APNS_KEY_ID: XXXXXXXXXX
153
- # APNS_TEAM_ID: YYYYYYYYYY
154
- # APNS_KEY_PATH: /run/secrets/apns_key
155
- # APNS_BUNDLE_ID: com.example.myapp
156
- # FCM — uncomment and fill in for Android push support
157
- # FCM_SERVICE_ACCOUNT_PATH: /run/secrets/fcm_service_account
158
- # FCM_PROJECT_ID: my-firebase-project
159
- restart: unless-stopped
160
- `;
161
- const outPath = path.join(process.cwd(), 'docker-compose.yml');
162
- if (fs.existsSync(outPath)) {
163
- console.log('');
164
- printNote(`docker-compose.yml already exists — skipping. Delete it and re-run to regenerate.`);
444
+ console.log(pc.bold(' What kind of app are you building?'));
445
+ console.log(` ${pc.cyan('1)')} Browser / PWA`);
446
+ console.log(` ${pc.cyan('2)')} Node.js ${pc.dim('— bot, backend, CLI')}`);
447
+ const platformChoice = (await rl.question(pc.bold(' Choice ') + pc.dim('(1): '))).trim() || '1';
448
+ const isBrowser = platformChoice !== '2';
449
+ rl.close();
450
+ console.log('');
451
+ // -- Write node deployment (self-hosted only) --
452
+ if (selfHosted) {
453
+ const deployDir = path.join(process.cwd(), 'meshwhisper-node');
454
+ const baseUrl = nodeUrl.replace(/^wss:\/\//, 'https://').replace(/^ws:\/\//, 'http://');
455
+ const vapid = wantPush ? generateVapidKeys() : undefined;
456
+ writeIfAbsent(path.join(deployDir, 'docker-compose.yml'), dockerCompose({ push: wantPush, federation: wantFederation }));
457
+ writeIfAbsent(path.join(deployDir, 'Dockerfile.node'), dockerfileNode());
458
+ if (wantPush)
459
+ writeIfAbsent(path.join(deployDir, 'Dockerfile.push'), dockerfilePush());
460
+ writeIfAbsent(path.join(deployDir, '.env'), envFile({ baseUrl, push: wantPush, vapid, contactEmail }), 0o600);
461
+ if (wantFederation)
462
+ writeIfAbsent(path.join(deployDir, 'federation-peers.json'), federationPeersFile());
463
+ }
464
+ // -- Write SDK skeleton --
465
+ const skeletonPath = isBrowser
466
+ ? path.join(process.cwd(), 'src', 'meshwhisper.ts')
467
+ : path.join(process.cwd(), 'meshwhisper-chat.mts');
468
+ writeIfAbsent(skeletonPath, isBrowser
469
+ ? browserSkeleton({ namespace, nodeUrl, push: selfHosted && wantPush })
470
+ : nodeSkeleton({ namespace, nodeUrl }));
471
+ appendGitignore([
472
+ ...(selfHosted ? ['meshwhisper-node/.env'] : []),
473
+ '.meshwhisper/',
474
+ ]);
475
+ // -- Health-check the chosen node --
476
+ if (!selfHosted) {
477
+ const healthUrl = nodeUrl.replace(/^wss/, 'https').replace(/^ws(?!s)/, 'http') + '/health';
478
+ try {
479
+ const resp = await fetch(healthUrl, { signal: AbortSignal.timeout(4000) });
480
+ if (resp.ok)
481
+ console.log(` ${pc.green('✓')} node reachable at ${pc.cyan(nodeUrl)}`);
482
+ else
483
+ console.log(` ${pc.yellow('!')} node at ${nodeUrl} returned HTTP ${resp.status}`);
484
+ }
485
+ catch {
486
+ console.log(` ${pc.yellow('!')} could not reach ${nodeUrl} — check connectivity`);
487
+ }
488
+ }
489
+ // -- Next steps --
490
+ console.log('');
491
+ console.log(pc.bold(pc.green(' Done. Next steps:')));
492
+ let n = 1;
493
+ step(n++, 'Install the SDK');
494
+ cmd(`npm install @meshwhisper/sdk${isBrowser && selfHosted && wantPush ? ' @meshwhisper/service-worker' : ''}`);
495
+ if (selfHosted) {
496
+ step(n++, 'Deploy your node');
497
+ note('Copy meshwhisper-node/ to your server, put TLS in front of port 8080');
498
+ note('(Caddy: `reverse_proxy localhost:8080` — done), then:');
499
+ cmd('docker compose up -d');
500
+ note(`Verify: npx @meshwhisper/cli doctor ${nodeUrl}`);
501
+ if (wantFederation) {
502
+ note('Your node will auto-generate its federation identity at /data/federation-key.json');
503
+ note('and peer with the Foundation relay. docs/federation.md has the details.');
504
+ }
505
+ }
506
+ if (isBrowser) {
507
+ step(n++, 'Wire src/meshwhisper.ts into your app');
508
+ cmd(`import { initMessaging, myId, send } from './meshwhisper';`);
509
+ if (selfHosted && wantPush) {
510
+ note('Paste your VAPID public key (meshwhisper-node/.env) into src/meshwhisper.ts');
511
+ note('and copy the service worker to your public dir:');
512
+ cmd('cp node_modules/@meshwhisper/service-worker/dist/meshwhisper-sw.js public/');
513
+ }
165
514
  }
166
515
  else {
167
- fs.writeFileSync(outPath, compose, 'utf-8');
516
+ step(n++, 'Try it — two terminals, two identities');
517
+ cmd('npx tsx meshwhisper-chat.mts alice');
518
+ cmd('npx tsx meshwhisper-chat.mts bob');
519
+ note('In alice: /add @bob — then chat. End-to-end encrypted via your node.');
520
+ }
521
+ console.log('');
522
+ console.log(pc.dim(` Docs: ${DOCS_URL}`));
523
+ console.log('');
524
+ }
525
+ // ============================================================
526
+ // doctor
527
+ // ============================================================
528
+ async function cmdDoctor(urlArg) {
529
+ banner();
530
+ const raw = urlArg || FOUNDATION_RELAY;
531
+ const base = raw.replace(/^wss:\/\//, 'https://').replace(/^ws:\/\//, 'http://').replace(/\/+$/, '');
532
+ const healthUrl = base.startsWith('http') ? `${base}/health` : `https://${base}/health`;
533
+ console.log(` checking ${pc.cyan(healthUrl)}\n`);
534
+ let body;
535
+ try {
536
+ const resp = await fetch(healthUrl, { signal: AbortSignal.timeout(5000) });
537
+ if (!resp.ok) {
538
+ console.log(` ${pc.red('✗')} HTTP ${resp.status}`);
539
+ process.exit(1);
540
+ }
541
+ body = (await resp.json());
542
+ }
543
+ catch (err) {
544
+ console.log(` ${pc.red('✗')} unreachable: ${err.message}`);
545
+ process.exit(1);
546
+ }
547
+ const ok = body.status === 'ok';
548
+ console.log(` ${ok ? pc.green('✓') : pc.red('✗')} status: ${String(body.status)}`);
549
+ for (const [key, value] of Object.entries(body)) {
550
+ if (key === 'status')
551
+ continue;
552
+ console.log(` ${pc.dim(key + ':')} ${String(value)}`);
553
+ }
554
+ if ('federationPeersConnected' in body) {
555
+ const connected = Number(body.federationPeersConnected);
168
556
  console.log('');
169
- printNote(`Wrote docker-compose.yml`);
557
+ if (connected > 0) {
558
+ console.log(` ${pc.green('✓')} federating with ${connected} peer relay(s)`);
559
+ }
560
+ else {
561
+ console.log(pc.dim(' not currently federating — see docs/federation.md to join the mesh'));
562
+ }
170
563
  }
564
+ console.log('');
565
+ if (!ok)
566
+ process.exit(1);
567
+ }
568
+ // ============================================================
569
+ // vapid
570
+ // ============================================================
571
+ function cmdVapid() {
572
+ banner();
573
+ const keys = generateVapidKeys();
574
+ console.log(pc.bold(' Web Push VAPID keys') + pc.dim(' — public goes in your app AND node .env; private is server-only\n'));
575
+ console.log(` VAPID_PUBLIC_KEY=${keys.publicKey}`);
576
+ console.log(` VAPID_PRIVATE_KEY=${keys.privateKey}`);
577
+ console.log('');
171
578
  }
172
579
  // ============================================================
173
580
  // Entry point
@@ -177,18 +584,26 @@ switch (command) {
177
584
  case 'init':
178
585
  await cmdInit();
179
586
  break;
587
+ case 'doctor':
588
+ await cmdDoctor(args[0]);
589
+ break;
590
+ case 'vapid':
591
+ cmdVapid();
592
+ break;
180
593
  case undefined:
181
594
  case '--help':
182
595
  case '-h':
183
- printBanner();
596
+ banner();
184
597
  console.log(' Usage:');
185
598
  console.log('');
186
- console.log(' npx @meshwhisper/cli init Initialize a new project');
599
+ console.log(` ${pc.cyan('npx @meshwhisper/cli init')} Scaffold a project: node deployment + SDK skeleton`);
600
+ console.log(` ${pc.cyan('npx @meshwhisper/cli doctor [url]')} Health-check a MeshWhisper node`);
601
+ console.log(` ${pc.cyan('npx @meshwhisper/cli vapid')} Generate Web Push VAPID keys`);
187
602
  console.log('');
188
603
  break;
189
604
  default:
190
605
  console.error(pc.red(` Unknown command: ${command}`));
191
- console.error(` Run ${pc.bold('meshwhisper --help')} for usage.`);
606
+ console.error(` Run ${pc.bold('npx @meshwhisper/cli --help')} for usage.`);
192
607
  process.exit(1);
193
608
  }
194
609
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "@meshwhisper/cli",
3
- "version": "0.1.0",
4
- "description": "MeshWhisper CLI developer tooling for MeshWhisper projects",
3
+ "version": "0.2.0",
4
+ "description": "MeshWhisper CLI \u2014 developer tooling for MeshWhisper projects",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "meshwhisper": "dist/index.js"
8
8
  },
9
- "files": ["dist"],
10
- "publishConfig": { "access": "public" },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
11
15
  "scripts": {
12
16
  "prepublishOnly": "npm run build",
13
17
  "build": "tsc",