rogerrat 1.1.0 → 1.1.1

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/cli.js +48 -15
  2. package/package.json +3 -2
package/dist/cli.js CHANGED
@@ -1,10 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import { serve } from "@hono/node-server";
3
- import { parseArgs } from "node:util";
3
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
4
4
  import { homedir } from "node:os";
5
- import { join } from "node:path";
5
+ import { dirname, join } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { parseArgs } from "node:util";
6
8
  import { createApp } from "./app.js";
7
- const HELP = `rogerrat — walkie-talkie MCP hub for AI agents
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ let PKG_VERSION = "?";
11
+ try {
12
+ PKG_VERSION = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf8")).version;
13
+ }
14
+ catch {
15
+ /* keep "?" if not found */
16
+ }
17
+ const HELP = `rogerrat ${PKG_VERSION} — walkie-talkie MCP hub for AI agents
8
18
 
9
19
  usage:
10
20
  rogerrat [options]
@@ -16,16 +26,21 @@ options:
16
26
  (required when --host is not 127.0.0.1 or localhost)
17
27
  --admin-token <s> enable /admin dashboard with this token
18
28
  (metadata only — never exposes message content)
19
- --data <path> channels.json path (default: ~/.rogerrat/channels.json)
29
+ --data-dir <path> single directory holding all rogerrat data
30
+ (default: ~/.rogerrat — channels.json, accounts.json,
31
+ identities.json, stats.json, webhooks.json, transcripts/
32
+ all live here)
33
+ --data <path> legacy: just the channels.json path (overrides data-dir)
20
34
  --origin <url> public origin advertised in connect snippets
21
35
  (default: http://<host>:<port>)
22
36
  --help, -h show this help
23
37
 
24
38
  examples:
25
- rogerrat # local only, no auth
26
- rogerrat --port 9000 # different port
27
- rogerrat --host 0.0.0.0 --token sekret # LAN with auth
28
- rogerrat --origin https://my.example # if behind a reverse proxy
39
+ rogerrat # local only, no auth, data in ~/.rogerrat
40
+ rogerrat --port 9000 # different port
41
+ rogerrat --host 0.0.0.0 --token sekret # LAN with auth (bearer required)
42
+ rogerrat --data-dir /var/lib/rogerrat # custom data directory
43
+ rogerrat --origin https://my.example # if behind a reverse proxy
29
44
 
30
45
  after starting, install once in your AI client:
31
46
  claude mcp add --transport http rogerrat http://127.0.0.1:7424/mcp
@@ -47,6 +62,7 @@ function main() {
47
62
  host: { type: "string" },
48
63
  token: { type: "string" },
49
64
  "admin-token": { type: "string" },
65
+ "data-dir": { type: "string" },
50
66
  data: { type: "string" },
51
67
  origin: { type: "string" },
52
68
  help: { type: "boolean", short: "h" },
@@ -68,29 +84,46 @@ function main() {
68
84
  const host = parsed.values.host ?? "127.0.0.1";
69
85
  const token = parsed.values.token;
70
86
  const adminToken = parsed.values["admin-token"];
71
- const dataPath = parsed.values.data ?? join(homedir(), ".rogerrat", "channels.json");
87
+ const dataDir = parsed.values["data-dir"] ?? join(homedir(), ".rogerrat");
88
+ if (!existsSync(dataDir))
89
+ mkdirSync(dataDir, { recursive: true });
90
+ const dataPath = parsed.values.data ?? join(dataDir, "channels.json");
72
91
  const origin = parsed.values.origin ?? `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${port}`;
73
92
  if (!isLocalHost(host) && !token) {
74
93
  console.error(`error: --token is required when binding to ${host} (non-localhost). use --token to set a shared secret, or --host 127.0.0.1 to restrict to local.`);
75
94
  process.exit(2);
76
95
  }
96
+ // Centralize all server-side state under one directory. The data-dir is the umbrella;
97
+ // individual --xxx flags can still override specific files for power users.
77
98
  process.env.ROGERRAT_DB = dataPath;
99
+ process.env.ROGERRAT_ACCOUNTS = process.env.ROGERRAT_ACCOUNTS ?? join(dataDir, "accounts.json");
100
+ process.env.ROGERRAT_IDENTITIES = process.env.ROGERRAT_IDENTITIES ?? join(dataDir, "identities.json");
101
+ process.env.ROGERRAT_STATS = process.env.ROGERRAT_STATS ?? join(dataDir, "stats.json");
102
+ process.env.ROGERRAT_TRANSCRIPTS = process.env.ROGERRAT_TRANSCRIPTS ?? join(dataDir, "transcripts");
103
+ process.env.ROGERRAT_WEBHOOKS = process.env.ROGERRAT_WEBHOOKS ?? join(dataDir, "webhooks.json");
78
104
  const app = createApp({
79
105
  publicOrigin: origin,
80
106
  authRequired: !!token,
81
107
  staticToken: token,
82
108
  adminToken,
83
109
  });
84
- console.log(`rogerrat ${process.env.npm_package_version ?? "0.1.1"} — local walkie-talkie hub`);
85
- console.log(` listening on http://${host}:${port}`);
86
- console.log(` public origin ${origin}`);
87
- console.log(` data file ${dataPath}`);
88
- console.log(` auth ${token ? "required (bearer token)" : "disabled (local-only)"}`);
89
- console.log(` admin UI ${adminToken ? `enabled at ${origin}/admin` : "disabled (use --admin-token to enable)"}`);
110
+ console.log(`rogerrat ${PKG_VERSION} — local walkie-talkie hub`);
111
+ console.log(` listening on http://${host}:${port}`);
112
+ console.log(` public origin ${origin}`);
113
+ console.log(` data dir ${dataDir}`);
114
+ console.log(` auth ${token ? "required (bearer token on /mcp/*)" : "disabled (local-only)"}`);
115
+ console.log(` admin UI ${adminToken ? `enabled at ${origin}/admin` : "disabled (pass --admin-token to enable)"}`);
116
+ console.log(` email recovery ${process.env.RESEND_API_KEY ? "enabled (Resend)" : "disabled (set RESEND_API_KEY to enable)"}`);
90
117
  console.log("");
91
118
  console.log(`install once in your AI client:`);
92
119
  console.log(` claude mcp add --transport http rogerrat ${origin}/mcp${token ? ` --header "Authorization: Bearer ${token}"` : ""}`);
93
120
  console.log("");
121
+ console.log(`landing ${origin}/`);
122
+ console.log(`account ${origin}/account`);
123
+ console.log(`policy ${origin}/policy`);
124
+ if (adminToken)
125
+ console.log(`admin ${origin}/admin (token: <hidden>)`);
126
+ console.log("");
94
127
  serve({ fetch: app.fetch, hostname: host, port });
95
128
  }
96
129
  main();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rogerrat",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Walkie-talkie MCP server for AI coding agents. Two Claudes (or Cursor, Cline, Claude Desktop) talk to each other over a hosted hub or your own localhost.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -32,7 +32,8 @@
32
32
  "dist/**/*.js",
33
33
  "dist/**/*.d.ts",
34
34
  "README.md",
35
- "LICENSE"
35
+ "LICENSE",
36
+ "package.json"
36
37
  ],
37
38
  "engines": {
38
39
  "node": ">=20"