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.
- package/dist/cli.js +48 -15
- 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 {
|
|
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
|
|
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>
|
|
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
|
|
26
|
-
rogerrat --port 9000
|
|
27
|
-
rogerrat --host 0.0.0.0 --token sekret
|
|
28
|
-
rogerrat --
|
|
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
|
|
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 ${
|
|
85
|
-
console.log(` listening on
|
|
86
|
-
console.log(` public origin
|
|
87
|
-
console.log(` data
|
|
88
|
-
console.log(` auth
|
|
89
|
-
console.log(` admin UI
|
|
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.
|
|
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"
|