discord-ops 0.20.2 → 0.21.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/CHANGELOG.md +19 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +47 -175
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +41 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +152 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/validate-flags.d.ts +9 -0
- package/dist/cli/validate-flags.d.ts.map +1 -0
- package/dist/cli/validate-flags.js +31 -0
- package/dist/cli/validate-flags.js.map +1 -0
- package/dist/client.d.ts +3 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +23 -7
- package/dist/client.js.map +1 -1
- package/dist/config/schema.d.ts +16 -34
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +7 -11
- package/dist/config/schema.js.map +1 -1
- package/dist/security/audit.js +8 -2
- package/dist/security/audit.js.map +1 -1
- package/dist/tools/audit/query-audit-log.js +1 -1
- package/dist/tools/audit/query-audit-log.js.map +1 -1
- package/dist/tools/channels/get-channel.d.ts.map +1 -1
- package/dist/tools/channels/get-channel.js +3 -1
- package/dist/tools/channels/get-channel.js.map +1 -1
- package/dist/tools/channels/permissions.js +1 -1
- package/dist/tools/channels/permissions.js.map +1 -1
- package/dist/tools/guilds/create-invite.d.ts +2 -1
- package/dist/tools/guilds/create-invite.d.ts.map +1 -1
- package/dist/tools/guilds/create-invite.js +19 -8
- package/dist/tools/guilds/create-invite.js.map +1 -1
- package/dist/tools/guilds/index.d.ts +0 -1
- package/dist/tools/guilds/index.d.ts.map +1 -1
- package/dist/tools/guilds/index.js +0 -1
- package/dist/tools/guilds/index.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -12
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/members/get-member.js +1 -1
- package/dist/tools/members/get-member.js.map +1 -1
- package/dist/tools/members/list-members.js +1 -1
- package/dist/tools/members/list-members.js.map +1 -1
- package/dist/tools/messaging/index.d.ts +1 -2
- package/dist/tools/messaging/index.d.ts.map +1 -1
- package/dist/tools/messaging/index.js +1 -2
- package/dist/tools/messaging/index.js.map +1 -1
- package/dist/tools/messaging/notify-owners.js +2 -2
- package/dist/tools/messaging/search.d.ts +2 -1
- package/dist/tools/messaging/search.d.ts.map +1 -1
- package/dist/tools/messaging/search.js +79 -42
- package/dist/tools/messaging/search.js.map +1 -1
- package/dist/tools/messaging/send-embed.d.ts +2 -1
- package/dist/tools/messaging/send-embed.d.ts.map +1 -1
- package/dist/tools/messaging/send-embed.js +21 -14
- package/dist/tools/messaging/send-embed.js.map +1 -1
- package/dist/tools/messaging/send-message.js +2 -2
- package/dist/tools/profiles.d.ts +14 -0
- package/dist/tools/profiles.d.ts.map +1 -0
- package/dist/tools/profiles.js +63 -0
- package/dist/tools/profiles.js.map +1 -0
- package/dist/tools/threads/create-thread.d.ts.map +1 -1
- package/dist/tools/threads/create-thread.js +24 -5
- package/dist/tools/threads/create-thread.js.map +1 -1
- package/dist/tools/types.d.ts +15 -14
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +5 -13
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/webhooks/execute-webhook.d.ts.map +1 -1
- package/dist/tools/webhooks/execute-webhook.js +45 -12
- package/dist/tools/webhooks/execute-webhook.js.map +1 -1
- package/dist/transport/http.d.ts +23 -2
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +61 -21
- package/dist/transport/http.js.map +1 -1
- package/dist/utils/og-fetch.d.ts +9 -0
- package/dist/utils/og-fetch.d.ts.map +1 -1
- package/dist/utils/og-fetch.js +135 -47
- package/dist/utils/og-fetch.js.map +1 -1
- package/package.json +14 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# discord-ops
|
|
2
2
|
|
|
3
|
+
## 0.21.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- b1d687e: Add `discord-ops init` CLI subcommand for non-interactive scaffolding of per-project `.discord-ops.json` config files. Accepts `--project`, `--guild-id`, `--token-env`, `--channel`, `--force`, and `--default` flags. Runs without a Discord connection.
|
|
8
|
+
- b1d687e: Add `max_pages` parameter to `search_messages` (1–5, default 1). When set above 1, the tool paginates through results using the `before` cursor and returns up to `max_pages × 100` messages. Response now includes `has_more: boolean` to indicate further pages exist.
|
|
9
|
+
- b1d687e: Add `initial_message` parameter to `create_thread`. When provided, the message is posted into the thread immediately after creation, eliminating the need for a follow-up `send_message` call.
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- f5441f0: Fix audit log redaction to recurse into arrays of objects. Previously, sensitive keys inside array elements (e.g. embed fields with a `token` or `webhook_url` key) passed through unredacted.
|
|
14
|
+
- 774d97b: Restrict CORS `Access-Control-Allow-Origin` from wildcard `*` to `http://localhost` by default. The HTTP transport now accepts an `allowedOrigin` option (and `--allowed-origin` CLI flag) to configure the allowed origin explicitly, preventing arbitrary web pages from fingerprinting the `/health` endpoint or establishing unauthenticated SSE connections.
|
|
15
|
+
- 3e7faab: Make `guild_id` optional in `execute_webhook`. The parameter was declared required but never used in the handler body. Callers that omit it no longer receive a validation error, while existing callers that provide it continue to work unchanged.
|
|
16
|
+
- b1d687e: Enforce auth token requirement on HTTP serve mode startup. The server now refuses to start without `DISCORD_OPS_HTTP_TOKEN` unless `--allow-unauthenticated` is explicitly passed, preventing accidental unauthenticated exposure of the bot API.
|
|
17
|
+
- bcc2627: Add `trustProxy` option to HTTP transport for proxy-aware per-IP rate limiting. When enabled, extracts the real client IP from the leftmost non-private address in `X-Forwarded-For` instead of using `req.socket.remoteAddress`. Defaults to `false` so existing behavior is unchanged.
|
|
18
|
+
- eca9978: Add standard security response headers to HTTP transport. All non-OPTIONS responses now include `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, `Content-Security-Policy: default-src 'none'`, and `Referrer-Policy: no-referrer`. OPTIONS preflight responses are intentionally excluded.
|
|
19
|
+
- 3b82f09: Fix SSRF vulnerability in og-fetch: resolve hostname via DNS before fetching and re-validate the resolved IP against the blocklist to prevent DNS rebinding attacks. Also adds 100.64.0.0/10 (shared address space) and 198.18.0.0/15 (benchmarking) to the blocked ranges.
|
|
20
|
+
- c27e2f4: Validate embed image and URL fields against private/reserved IP ranges before passing to Discord API. Caller-supplied `image_url` in `send_embed` and all URL fields in `execute_webhook` embeds (url, image.url, thumbnail.url, author.url, author.icon_url, avatar_url) are now checked with `isPublicHttpUrl()` to prevent SSRF via Discord's CDN proxy.
|
|
21
|
+
|
|
3
22
|
## 0.20.2
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/cli/index.d.ts
CHANGED
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { createRequire } from "node:module";
|
|
3
2
|
import { loadConfig } from "../config/index.js";
|
|
4
3
|
import { DiscordClient } from "../client.js";
|
|
5
4
|
import { createServer } from "../server.js";
|
|
6
5
|
import { startStdioTransport } from "../transport/stdio.js";
|
|
7
6
|
import { startHttpTransport } from "../transport/http.js";
|
|
8
7
|
import { logger, setLogLevel } from "../utils/logger.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
const require = createRequire(import.meta.url);
|
|
13
|
-
const { version: PKG_VERSION } = require("../../package.json");
|
|
8
|
+
import { runInit } from "./init.js";
|
|
9
|
+
import { validateFlags } from "./validate-flags.js";
|
|
10
|
+
export { validateFlags } from "./validate-flags.js";
|
|
14
11
|
async function main() {
|
|
15
12
|
const args = process.argv.slice(2);
|
|
13
|
+
// Reject unrecognised flags early
|
|
14
|
+
validateFlags(args);
|
|
16
15
|
// Handle --help
|
|
17
16
|
if (args.includes("--help") || args.includes("-h")) {
|
|
18
17
|
printUsage();
|
|
@@ -20,76 +19,29 @@ async function main() {
|
|
|
20
19
|
}
|
|
21
20
|
// Handle --version
|
|
22
21
|
if (args.includes("--version") || args.includes("-v")) {
|
|
23
|
-
console.log(
|
|
22
|
+
console.log("discord-ops 0.21.0");
|
|
24
23
|
process.exit(0);
|
|
25
24
|
}
|
|
25
|
+
// Handle init subcommand (does not require DISCORD_TOKEN)
|
|
26
|
+
if (args[0] === "init") {
|
|
27
|
+
await runInit(args.slice(1));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
26
30
|
// Handle health subcommand
|
|
27
31
|
if (args[0] === "health") {
|
|
28
32
|
await runHealthCheck();
|
|
29
33
|
return;
|
|
30
34
|
}
|
|
31
|
-
// Handle setup subcommand
|
|
32
|
-
if (args[0] === "setup") {
|
|
33
|
-
await runSetup();
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
// Handle validate subcommand
|
|
37
|
-
if (args[0] === "validate") {
|
|
38
|
-
await runValidate();
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
// Handle run subcommand: discord-ops run <tool> --args '<json>'
|
|
42
|
-
if (args[0] === "run") {
|
|
43
|
-
const toolName = args[1];
|
|
44
|
-
if (!toolName) {
|
|
45
|
-
console.error("Usage: discord-ops run <tool> --args '<json>'");
|
|
46
|
-
process.exit(1);
|
|
47
|
-
}
|
|
48
|
-
const argsIndex = args.indexOf("--args");
|
|
49
|
-
if (argsIndex === -1 || !args[argsIndex + 1]) {
|
|
50
|
-
console.error("Usage: discord-ops run <tool> --args '<json>'");
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
53
|
-
await runTool(toolName, args[argsIndex + 1]);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
// Parse global flags
|
|
57
|
-
const dryRun = args.includes("--dry-run");
|
|
58
|
-
// Parse --profile flag
|
|
59
|
-
const profileIndex = args.indexOf("--profile");
|
|
60
|
-
const profileArg = profileIndex !== -1 ? args[profileIndex + 1] : undefined;
|
|
61
|
-
// Parse --tools flag (comma-separated)
|
|
62
|
-
const toolsIndex = args.indexOf("--tools");
|
|
63
|
-
const toolsArg = toolsIndex !== -1
|
|
64
|
-
? args[toolsIndex + 1]
|
|
65
|
-
?.split(",")
|
|
66
|
-
.map((t) => t.trim())
|
|
67
|
-
.filter(Boolean)
|
|
68
|
-
: undefined;
|
|
69
35
|
// Configure log level
|
|
70
36
|
const logLevel = process.env.DISCORD_OPS_LOG_LEVEL;
|
|
71
37
|
if (logLevel)
|
|
72
38
|
setLogLevel(logLevel);
|
|
73
39
|
// Load config (does NOT require Discord connection)
|
|
74
40
|
const config = loadConfig();
|
|
75
|
-
// Resolve profile: --tools > --profile > per-project config > global config > "full"
|
|
76
|
-
const resolvedProfile = toolsArg?.length
|
|
77
|
-
? undefined
|
|
78
|
-
: (profileArg ?? config.perProject?.tool_profile ?? config.global.tool_profile ?? "full");
|
|
79
|
-
// Resolve add/remove: per-project overrides global
|
|
80
|
-
const profileAdd = config.perProject?.tool_profile_add ?? config.global.tool_profile_add;
|
|
81
|
-
const profileRemove = config.perProject?.tool_profile_remove ?? config.global.tool_profile_remove;
|
|
82
|
-
const serverOptions = {
|
|
83
|
-
dryRun,
|
|
84
|
-
profile: resolvedProfile,
|
|
85
|
-
tools: toolsArg,
|
|
86
|
-
profileAdd,
|
|
87
|
-
profileRemove,
|
|
88
|
-
};
|
|
89
41
|
// Create lazy Discord client
|
|
90
42
|
const discord = new DiscordClient(config.defaultToken);
|
|
91
43
|
// Create MCP server with tool context
|
|
92
|
-
const { server
|
|
44
|
+
const { server } = createServer({ discord, config });
|
|
93
45
|
// Handle serve subcommand (HTTP/SSE transport)
|
|
94
46
|
if (args[0] === "serve") {
|
|
95
47
|
const portIndex = args.indexOf("--port");
|
|
@@ -99,7 +51,10 @@ async function main() {
|
|
|
99
51
|
console.error("Invalid --port value: must be between 1 and 65535");
|
|
100
52
|
process.exit(1);
|
|
101
53
|
}
|
|
102
|
-
|
|
54
|
+
const originIndex = args.indexOf("--allowed-origin");
|
|
55
|
+
const allowedOrigin = originIndex !== -1 ? args[originIndex + 1] : undefined;
|
|
56
|
+
const allowUnauthenticated = args.includes("--allow-unauthenticated");
|
|
57
|
+
await startHttpTransport(server, { port, allowedOrigin, allowUnauthenticated });
|
|
103
58
|
// Graceful shutdown
|
|
104
59
|
const shutdown = async () => {
|
|
105
60
|
logger.info("Shutting down...");
|
|
@@ -110,7 +65,7 @@ async function main() {
|
|
|
110
65
|
process.on("SIGTERM", shutdown);
|
|
111
66
|
return;
|
|
112
67
|
}
|
|
113
|
-
//
|
|
68
|
+
// Start stdio transport
|
|
114
69
|
await startStdioTransport(server);
|
|
115
70
|
// Graceful shutdown
|
|
116
71
|
const shutdown = async () => {
|
|
@@ -124,20 +79,6 @@ async function main() {
|
|
|
124
79
|
async function runHealthCheck() {
|
|
125
80
|
try {
|
|
126
81
|
const config = loadConfig();
|
|
127
|
-
// Run config validation first
|
|
128
|
-
const validation = validateConfig(config);
|
|
129
|
-
if (validation.warnings.length > 0) {
|
|
130
|
-
console.log("Config warnings:");
|
|
131
|
-
for (const w of validation.warnings) {
|
|
132
|
-
console.log(` ⚠ ${w}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (validation.errors.length > 0) {
|
|
136
|
-
console.log("Config errors:");
|
|
137
|
-
for (const e of validation.errors) {
|
|
138
|
-
console.log(` ✗ ${e}`);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
82
|
const discord = new DiscordClient(config.defaultToken);
|
|
142
83
|
// Collect unique tokens: default + any project-specific ones
|
|
143
84
|
const tokens = new Map(); // token → project names
|
|
@@ -154,46 +95,23 @@ async function runHealthCheck() {
|
|
|
154
95
|
}
|
|
155
96
|
}
|
|
156
97
|
}
|
|
157
|
-
console.log(
|
|
158
|
-
let failures = 0;
|
|
98
|
+
console.log(`Bots configured: ${tokens.size}`);
|
|
159
99
|
for (const [token, projects] of tokens) {
|
|
160
100
|
console.log(`\nConnecting bot for: ${projects.join(", ")}...`);
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
console.log(` Members: ${guild.memberCount}`);
|
|
170
|
-
console.log(` Permissions: ${me.permissions.toArray().join(", ")}`);
|
|
171
|
-
}
|
|
172
|
-
catch (err) {
|
|
173
|
-
console.log(`\n ${guild.name} (${id})`);
|
|
174
|
-
console.log(` ✗ Failed to fetch permissions: ${err instanceof Error ? err.message : String(err)}`);
|
|
175
|
-
failures++;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
console.log(` ✗ Connection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
181
|
-
failures++;
|
|
101
|
+
const client = await discord.getClient(token);
|
|
102
|
+
console.log(` Bot: ${client.user?.tag}`);
|
|
103
|
+
console.log(` Guilds: ${client.guilds.cache.size}`);
|
|
104
|
+
for (const [id, guild] of client.guilds.cache) {
|
|
105
|
+
const me = await guild.members.fetchMe();
|
|
106
|
+
console.log(`\n ${guild.name} (${id})`);
|
|
107
|
+
console.log(` Members: ${guild.memberCount}`);
|
|
108
|
+
console.log(` Permissions: ${me.permissions.toArray().join(", ")}`);
|
|
182
109
|
}
|
|
183
110
|
}
|
|
184
111
|
console.log(`\nProjects configured: ${Object.keys(config.global.projects).length}`);
|
|
185
112
|
for (const [name, project] of Object.entries(config.global.projects)) {
|
|
186
113
|
const tokenInfo = project.token_env ? ` [${project.token_env}]` : "";
|
|
187
|
-
|
|
188
|
-
? process.env[project.token_env]
|
|
189
|
-
? " ✓"
|
|
190
|
-
: " ✗ NOT SET"
|
|
191
|
-
: "";
|
|
192
|
-
console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}${tokenInfo}${tokenSet}`);
|
|
193
|
-
}
|
|
194
|
-
if (failures > 0) {
|
|
195
|
-
console.log(`\nHealth check completed with ${failures} failure(s).`);
|
|
196
|
-
process.exit(1);
|
|
114
|
+
console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}${tokenInfo}`);
|
|
197
115
|
}
|
|
198
116
|
console.log("\nHealth check passed.");
|
|
199
117
|
await discord.destroy();
|
|
@@ -203,87 +121,41 @@ async function runHealthCheck() {
|
|
|
203
121
|
process.exit(1);
|
|
204
122
|
}
|
|
205
123
|
}
|
|
206
|
-
async function runValidate() {
|
|
207
|
-
try {
|
|
208
|
-
const config = loadConfig();
|
|
209
|
-
const result = validateConfig(config);
|
|
210
|
-
printValidationResult(result);
|
|
211
|
-
process.exit(result.errors.length > 0 ? 1 : 0);
|
|
212
|
-
}
|
|
213
|
-
catch (err) {
|
|
214
|
-
console.error("Validation failed:", err instanceof Error ? err.message : err);
|
|
215
|
-
process.exit(1);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
function printValidationResult(result) {
|
|
219
|
-
console.log(`\ndiscord-ops config validation\n`);
|
|
220
|
-
console.log(`Projects: ${result.projects.length}`);
|
|
221
|
-
for (const p of result.projects) {
|
|
222
|
-
const tokenStatus = p.tokenEnv
|
|
223
|
-
? p.tokenSet
|
|
224
|
-
? `[${p.tokenEnv}] ✓`
|
|
225
|
-
: `[${p.tokenEnv}] ✗ NOT SET`
|
|
226
|
-
: "(default token)";
|
|
227
|
-
console.log(`\n ${p.name}:`);
|
|
228
|
-
console.log(` Guild: ${p.guildId}`);
|
|
229
|
-
console.log(` Token: ${tokenStatus}`);
|
|
230
|
-
console.log(` Channels: ${Object.keys(p.channels).join(", ")}`);
|
|
231
|
-
if (p.defaultChannel)
|
|
232
|
-
console.log(` Default: ${p.defaultChannel}`);
|
|
233
|
-
}
|
|
234
|
-
if (result.warnings.length > 0) {
|
|
235
|
-
console.log("\nWarnings:");
|
|
236
|
-
for (const w of result.warnings) {
|
|
237
|
-
console.log(` ⚠ ${w}`);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
if (result.errors.length > 0) {
|
|
241
|
-
console.log("\nErrors:");
|
|
242
|
-
for (const e of result.errors) {
|
|
243
|
-
console.log(` ✗ ${e}`);
|
|
244
|
-
}
|
|
245
|
-
console.log("\nValidation FAILED.");
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
console.log("\nValidation passed.");
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
124
|
function printUsage() {
|
|
252
125
|
console.log(`
|
|
253
126
|
discord-ops - Agency-grade Discord MCP server
|
|
254
127
|
|
|
255
128
|
USAGE:
|
|
256
|
-
discord-ops
|
|
257
|
-
discord-ops serve
|
|
258
|
-
discord-ops
|
|
259
|
-
discord-ops
|
|
260
|
-
discord-ops
|
|
261
|
-
discord-ops
|
|
262
|
-
discord-ops --help Show this help
|
|
263
|
-
discord-ops --version Show version
|
|
264
|
-
|
|
265
|
-
EXAMPLES:
|
|
266
|
-
discord-ops run send_message --args '{"project":"my-app","channel":"general","content":"Hello!"}'
|
|
267
|
-
discord-ops run send_template --args '{"project":"my-app","template":"release","vars":{"version":"1.0.0","name":"my-app","highlights":"Initial release","npm":"my-app@latest"}}'
|
|
129
|
+
discord-ops Start MCP server (stdio transport)
|
|
130
|
+
discord-ops serve Start MCP server (HTTP/SSE transport)
|
|
131
|
+
discord-ops health Run health check + permission audit
|
|
132
|
+
discord-ops init Scaffold a per-project .discord-ops.json
|
|
133
|
+
discord-ops --help Show this help
|
|
134
|
+
discord-ops --version Show version
|
|
268
135
|
|
|
269
136
|
OPTIONS:
|
|
270
|
-
--
|
|
271
|
-
--
|
|
272
|
-
--
|
|
273
|
-
|
|
137
|
+
--port <port> HTTP port for serve mode (default: 3000)
|
|
138
|
+
--allowed-origin <origin> Allowed CORS origin (default: http://localhost)
|
|
139
|
+
--allow-unauthenticated Allow serve mode without DISCORD_OPS_HTTP_TOKEN (insecure)
|
|
140
|
+
|
|
141
|
+
INIT FLAGS:
|
|
142
|
+
--project <name> Project name (required)
|
|
143
|
+
--guild-id <snowflake> Discord guild/server ID (required)
|
|
144
|
+
--token-env <VAR> Env var for bot token (default: DISCORD_TOKEN)
|
|
145
|
+
--channel <alias>=<id> Channel alias, repeatable (e.g. builds=1234567890)
|
|
146
|
+
--force Overwrite existing .discord-ops.json
|
|
147
|
+
--default Mark this project as default_project
|
|
274
148
|
|
|
275
149
|
ENVIRONMENT:
|
|
276
|
-
DISCORD_TOKEN Default Discord bot token (required
|
|
277
|
-
|
|
150
|
+
DISCORD_TOKEN Default Discord bot token (required)
|
|
151
|
+
DISCORD_OPS_HTTP_TOKEN Bearer token for HTTP transport auth (required for serve mode)
|
|
278
152
|
<PROJECT>_TOKEN Per-project bot tokens (configured via token_env in config)
|
|
279
153
|
DISCORD_OPS_CONFIG Path to global config file (default: ~/.discord-ops.json)
|
|
280
154
|
DISCORD_OPS_LOG_LEVEL Log level: debug, info, warn, error (default: info)
|
|
281
|
-
DISCORD_OPS_DRY_RUN Enable dry-run mode (any truthy value)
|
|
282
|
-
DRY_RUN Enable dry-run mode (any truthy value, alias)
|
|
283
155
|
|
|
284
156
|
CONFIG FILES:
|
|
285
157
|
~/.discord-ops.json Global project routing config
|
|
286
|
-
.discord-ops.json Per-project
|
|
158
|
+
.discord-ops.json Per-project config (created by discord-ops init)
|
|
287
159
|
|
|
288
160
|
DOCUMENTATION:
|
|
289
161
|
https://github.com/bookedsolidtech/discord-ops
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { GlobalConfig } from "../config/schema.js";
|
|
2
|
+
export interface InitOptions {
|
|
3
|
+
project: string;
|
|
4
|
+
guildId: string;
|
|
5
|
+
tokenEnv: string;
|
|
6
|
+
channels: Record<string, string>;
|
|
7
|
+
force: boolean;
|
|
8
|
+
markDefault: boolean;
|
|
9
|
+
/** Override CWD for testability */
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface InitResult {
|
|
13
|
+
config: GlobalConfig;
|
|
14
|
+
filePath: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parses --channel alias=id pairs from CLI args.
|
|
18
|
+
* Returns a record of alias → channel snowflake, or an error string.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseChannelArgs(channelArgs: string[]): Record<string, string> | string;
|
|
21
|
+
/**
|
|
22
|
+
* Builds the GlobalConfig object for the init command.
|
|
23
|
+
* Throws if the resulting config fails schema validation.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildInitConfig(opts: InitOptions): InitResult;
|
|
26
|
+
/**
|
|
27
|
+
* Writes the init config to disk and prints the success message.
|
|
28
|
+
* Separated from buildInitConfig so tests can mock fs writes.
|
|
29
|
+
*/
|
|
30
|
+
export declare function writeInitConfig(result: InitResult): void;
|
|
31
|
+
/**
|
|
32
|
+
* Parses CLI args for the `discord-ops init` subcommand and returns InitOptions,
|
|
33
|
+
* or throws an error string if required flags are missing or malformed.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseInitArgs(args: string[]): InitOptions;
|
|
36
|
+
/**
|
|
37
|
+
* Entry point for the `discord-ops init` subcommand.
|
|
38
|
+
* Parses args, builds config, validates, writes to disk, prints result.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runInit(args: string[]): Promise<void>;
|
|
41
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAkBvF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAuB7D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAExD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAyDzD;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC3D"}
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { GlobalConfigSchema } from "../config/schema.js";
|
|
4
|
+
/**
|
|
5
|
+
* Parses --channel alias=id pairs from CLI args.
|
|
6
|
+
* Returns a record of alias → channel snowflake, or an error string.
|
|
7
|
+
*/
|
|
8
|
+
export function parseChannelArgs(channelArgs) {
|
|
9
|
+
const channels = {};
|
|
10
|
+
for (const entry of channelArgs) {
|
|
11
|
+
const eqIdx = entry.indexOf("=");
|
|
12
|
+
if (eqIdx === -1) {
|
|
13
|
+
return `Invalid --channel value "${entry}": expected format alias=snowflake_id`;
|
|
14
|
+
}
|
|
15
|
+
const alias = entry.slice(0, eqIdx).trim();
|
|
16
|
+
const id = entry.slice(eqIdx + 1).trim();
|
|
17
|
+
if (!alias) {
|
|
18
|
+
return `Invalid --channel value "${entry}": alias cannot be empty`;
|
|
19
|
+
}
|
|
20
|
+
if (!/^\d{17,20}$/.test(id)) {
|
|
21
|
+
return `Invalid --channel value "${entry}": "${id}" is not a valid Discord snowflake ID (17-20 digits)`;
|
|
22
|
+
}
|
|
23
|
+
channels[alias] = id;
|
|
24
|
+
}
|
|
25
|
+
return channels;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds the GlobalConfig object for the init command.
|
|
29
|
+
* Throws if the resulting config fails schema validation.
|
|
30
|
+
*/
|
|
31
|
+
export function buildInitConfig(opts) {
|
|
32
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
33
|
+
const filePath = join(cwd, ".discord-ops.json");
|
|
34
|
+
if (existsSync(filePath) && !opts.force) {
|
|
35
|
+
throw new Error(`.discord-ops.json already exists in ${cwd}. Use --force to overwrite.`);
|
|
36
|
+
}
|
|
37
|
+
const raw = {
|
|
38
|
+
projects: {
|
|
39
|
+
[opts.project]: {
|
|
40
|
+
guild_id: opts.guildId,
|
|
41
|
+
token_env: opts.tokenEnv,
|
|
42
|
+
channels: opts.channels,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
default_project: opts.markDefault ? opts.project : undefined,
|
|
46
|
+
};
|
|
47
|
+
// Validate against schema — throws ZodError if invalid
|
|
48
|
+
const parsed = GlobalConfigSchema.parse(raw);
|
|
49
|
+
return { config: parsed, filePath };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Writes the init config to disk and prints the success message.
|
|
53
|
+
* Separated from buildInitConfig so tests can mock fs writes.
|
|
54
|
+
*/
|
|
55
|
+
export function writeInitConfig(result) {
|
|
56
|
+
writeFileSync(result.filePath, JSON.stringify(result.config, null, 2) + "\n", "utf-8");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parses CLI args for the `discord-ops init` subcommand and returns InitOptions,
|
|
60
|
+
* or throws an error string if required flags are missing or malformed.
|
|
61
|
+
*/
|
|
62
|
+
export function parseInitArgs(args) {
|
|
63
|
+
let project;
|
|
64
|
+
let guildId;
|
|
65
|
+
let tokenEnv = "DISCORD_TOKEN";
|
|
66
|
+
const channelArgs = [];
|
|
67
|
+
let force = false;
|
|
68
|
+
let markDefault = false;
|
|
69
|
+
for (let i = 0; i < args.length; i++) {
|
|
70
|
+
const arg = args[i];
|
|
71
|
+
switch (arg) {
|
|
72
|
+
case "--project":
|
|
73
|
+
project = args[++i];
|
|
74
|
+
break;
|
|
75
|
+
case "--guild-id":
|
|
76
|
+
guildId = args[++i];
|
|
77
|
+
break;
|
|
78
|
+
case "--token-env":
|
|
79
|
+
tokenEnv = args[++i] ?? tokenEnv;
|
|
80
|
+
break;
|
|
81
|
+
case "--channel":
|
|
82
|
+
if (args[i + 1] !== undefined) {
|
|
83
|
+
channelArgs.push(args[++i]);
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
case "--force":
|
|
87
|
+
force = true;
|
|
88
|
+
break;
|
|
89
|
+
case "--default":
|
|
90
|
+
markDefault = true;
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const errors = [];
|
|
97
|
+
if (!project)
|
|
98
|
+
errors.push("--project <name> is required");
|
|
99
|
+
if (!guildId)
|
|
100
|
+
errors.push("--guild-id <snowflake> is required");
|
|
101
|
+
if (errors.length > 0) {
|
|
102
|
+
throw new Error(errors.join("\n"));
|
|
103
|
+
}
|
|
104
|
+
const channelsResult = parseChannelArgs(channelArgs);
|
|
105
|
+
if (typeof channelsResult === "string") {
|
|
106
|
+
throw new Error(channelsResult);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
project: project,
|
|
110
|
+
guildId: guildId,
|
|
111
|
+
tokenEnv,
|
|
112
|
+
channels: channelsResult,
|
|
113
|
+
force,
|
|
114
|
+
markDefault,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Entry point for the `discord-ops init` subcommand.
|
|
119
|
+
* Parses args, builds config, validates, writes to disk, prints result.
|
|
120
|
+
*/
|
|
121
|
+
export async function runInit(args) {
|
|
122
|
+
let opts;
|
|
123
|
+
try {
|
|
124
|
+
opts = parseInitArgs(args);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
console.error("Error:", err instanceof Error ? err.message : String(err));
|
|
128
|
+
console.error("\nUsage: discord-ops init --project <name> --guild-id <snowflake> [options]");
|
|
129
|
+
console.error(" --token-env <VAR> Env var for bot token (default: DISCORD_TOKEN)");
|
|
130
|
+
console.error(" --channel <alias>=<id> Channel alias (repeatable)");
|
|
131
|
+
console.error(" --force Overwrite existing .discord-ops.json");
|
|
132
|
+
console.error(" --default Mark as default_project");
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
let result;
|
|
136
|
+
try {
|
|
137
|
+
result = buildInitConfig(opts);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
console.error("Error:", err instanceof Error ? err.message : String(err));
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
writeInitConfig(result);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
console.error("Error writing config:", err instanceof Error ? err.message : String(err));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
console.log(`\u2713 Created .discord-ops.json for project "${opts.project}" (guild: ${opts.guildId})`);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Known double-dash flags accepted by the CLI. */
|
|
2
|
+
export declare const KNOWN_FLAGS: Set<string>;
|
|
3
|
+
/**
|
|
4
|
+
* Validates that every --flag in args is a recognised flag.
|
|
5
|
+
* Stops scanning at a bare "--" separator.
|
|
6
|
+
* Throws with a human-readable message on the first unknown flag.
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateFlags(args: string[]): void;
|
|
9
|
+
//# sourceMappingURL=validate-flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-flags.d.ts","sourceRoot":"","sources":["../../src/cli/validate-flags.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,eAAO,MAAM,WAAW,aAYtB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CASlD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Known double-dash flags accepted by the CLI. */
|
|
2
|
+
export const KNOWN_FLAGS = new Set([
|
|
3
|
+
"--help",
|
|
4
|
+
"--version",
|
|
5
|
+
"--port",
|
|
6
|
+
"--allowed-origin",
|
|
7
|
+
// init subcommand flags
|
|
8
|
+
"--project",
|
|
9
|
+
"--guild-id",
|
|
10
|
+
"--token-env",
|
|
11
|
+
"--channel",
|
|
12
|
+
"--force",
|
|
13
|
+
"--default",
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Validates that every --flag in args is a recognised flag.
|
|
17
|
+
* Stops scanning at a bare "--" separator.
|
|
18
|
+
* Throws with a human-readable message on the first unknown flag.
|
|
19
|
+
*/
|
|
20
|
+
export function validateFlags(args) {
|
|
21
|
+
for (const arg of args) {
|
|
22
|
+
if (arg === "--")
|
|
23
|
+
break;
|
|
24
|
+
if (arg.startsWith("--")) {
|
|
25
|
+
if (!KNOWN_FLAGS.has(arg)) {
|
|
26
|
+
throw new Error(`Unknown flag: ${arg}. Valid flags: ${[...KNOWN_FLAGS].join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=validate-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-flags.js","sourceRoot":"","sources":["../../src/cli/validate-flags.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,kBAAkB;IAClB,wBAAwB;IACxB,WAAW;IACX,YAAY;IACZ,aAAa;IACb,WAAW;IACX,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;QACxB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|