discord-ops 0.20.1 → 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.
Files changed (85) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/cli/index.d.ts +1 -1
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +51 -178
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/init.d.ts +41 -0
  7. package/dist/cli/init.d.ts.map +1 -0
  8. package/dist/cli/init.js +152 -0
  9. package/dist/cli/init.js.map +1 -0
  10. package/dist/cli/validate-flags.d.ts +9 -0
  11. package/dist/cli/validate-flags.d.ts.map +1 -0
  12. package/dist/cli/validate-flags.js +31 -0
  13. package/dist/cli/validate-flags.js.map +1 -0
  14. package/dist/client.d.ts +3 -2
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +23 -7
  17. package/dist/client.js.map +1 -1
  18. package/dist/config/schema.d.ts +16 -34
  19. package/dist/config/schema.d.ts.map +1 -1
  20. package/dist/config/schema.js +7 -11
  21. package/dist/config/schema.js.map +1 -1
  22. package/dist/security/audit.js +8 -2
  23. package/dist/security/audit.js.map +1 -1
  24. package/dist/security/rate-limiter.d.ts.map +1 -1
  25. package/dist/security/rate-limiter.js +5 -3
  26. package/dist/security/rate-limiter.js.map +1 -1
  27. package/dist/tools/audit/query-audit-log.js +1 -1
  28. package/dist/tools/audit/query-audit-log.js.map +1 -1
  29. package/dist/tools/channels/get-channel.d.ts.map +1 -1
  30. package/dist/tools/channels/get-channel.js +3 -1
  31. package/dist/tools/channels/get-channel.js.map +1 -1
  32. package/dist/tools/channels/permissions.js +1 -1
  33. package/dist/tools/channels/permissions.js.map +1 -1
  34. package/dist/tools/guilds/create-invite.d.ts +2 -1
  35. package/dist/tools/guilds/create-invite.d.ts.map +1 -1
  36. package/dist/tools/guilds/create-invite.js +20 -9
  37. package/dist/tools/guilds/create-invite.js.map +1 -1
  38. package/dist/tools/guilds/index.d.ts +0 -1
  39. package/dist/tools/guilds/index.d.ts.map +1 -1
  40. package/dist/tools/guilds/index.js +0 -1
  41. package/dist/tools/guilds/index.js.map +1 -1
  42. package/dist/tools/index.d.ts.map +1 -1
  43. package/dist/tools/index.js +0 -12
  44. package/dist/tools/index.js.map +1 -1
  45. package/dist/tools/members/get-member.js +1 -1
  46. package/dist/tools/members/get-member.js.map +1 -1
  47. package/dist/tools/members/list-members.js +1 -1
  48. package/dist/tools/members/list-members.js.map +1 -1
  49. package/dist/tools/messaging/index.d.ts +1 -2
  50. package/dist/tools/messaging/index.d.ts.map +1 -1
  51. package/dist/tools/messaging/index.js +1 -2
  52. package/dist/tools/messaging/index.js.map +1 -1
  53. package/dist/tools/messaging/notify-owners.js +2 -2
  54. package/dist/tools/messaging/search.d.ts +2 -1
  55. package/dist/tools/messaging/search.d.ts.map +1 -1
  56. package/dist/tools/messaging/search.js +79 -42
  57. package/dist/tools/messaging/search.js.map +1 -1
  58. package/dist/tools/messaging/send-embed.d.ts +2 -1
  59. package/dist/tools/messaging/send-embed.d.ts.map +1 -1
  60. package/dist/tools/messaging/send-embed.js +21 -14
  61. package/dist/tools/messaging/send-embed.js.map +1 -1
  62. package/dist/tools/messaging/send-message.js +2 -2
  63. package/dist/tools/profiles.d.ts +14 -0
  64. package/dist/tools/profiles.d.ts.map +1 -0
  65. package/dist/tools/profiles.js +63 -0
  66. package/dist/tools/profiles.js.map +1 -0
  67. package/dist/tools/threads/create-thread.d.ts.map +1 -1
  68. package/dist/tools/threads/create-thread.js +24 -5
  69. package/dist/tools/threads/create-thread.js.map +1 -1
  70. package/dist/tools/types.d.ts +15 -14
  71. package/dist/tools/types.d.ts.map +1 -1
  72. package/dist/tools/types.js +5 -13
  73. package/dist/tools/types.js.map +1 -1
  74. package/dist/tools/webhooks/execute-webhook.d.ts.map +1 -1
  75. package/dist/tools/webhooks/execute-webhook.js +45 -12
  76. package/dist/tools/webhooks/execute-webhook.js.map +1 -1
  77. package/dist/transport/http.d.ts +23 -2
  78. package/dist/transport/http.d.ts.map +1 -1
  79. package/dist/transport/http.js +61 -21
  80. package/dist/transport/http.js.map +1 -1
  81. package/dist/utils/og-fetch.d.ts +9 -0
  82. package/dist/utils/og-fetch.d.ts.map +1 -1
  83. package/dist/utils/og-fetch.js +135 -47
  84. package/dist/utils/og-fetch.js.map +1 -1
  85. package/package.json +14 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
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
+
22
+ ## 0.20.2
23
+
24
+ ### Patch Changes
25
+
26
+ - 09596d6: Fix port range validation, rate-limiter stats aggregation, and invite channel consistency
27
+ - **CLI**: `--port` now rejects out-of-range values (negative, zero, >65535) with a clear message; previously only `NaN` and falsy values were caught
28
+ - **RateLimiter.stats()**: returns the max-used bucket instead of the sum across all buckets, making `used/limit` a meaningful per-bucket pressure ratio rather than a misleading aggregate
29
+ - **create_invite**: switched from `getChannel` (text-only) to `getAnyChannel` so voice and stage channels are now supported; aligns with the server-layer permission pre-check which already used `getAnyChannel`
30
+ - **SSRF**: block `0.0.0.0` (unspecified IPv4, routes to localhost on many systems) and `::` (IPv6 unspecified address) in OG metadata fetcher
31
+
3
32
  ## 0.20.1
4
33
 
5
34
  ### Patch Changes
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export { validateFlags } from "./validate-flags.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -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 { runSetup } from "./setup.js";
10
- import { runTool } from "./run.js";
11
- import { validateConfig } from "../config/validate.js";
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,85 +19,42 @@ async function main() {
20
19
  }
21
20
  // Handle --version
22
21
  if (args.includes("--version") || args.includes("-v")) {
23
- console.log(`discord-ops ${PKG_VERSION}`);
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, meta } = createServer({ discord, config }, serverOptions);
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");
96
- const port = portIndex !== -1 ? parseInt(args[portIndex + 1], 10) : undefined;
97
- if (portIndex !== -1 && (!port || isNaN(port))) {
98
- console.error("Invalid --port value");
48
+ const portStr = portIndex !== -1 ? args[portIndex + 1] : undefined;
49
+ const port = portStr !== undefined ? parseInt(portStr, 10) : undefined;
50
+ if (port !== undefined && (isNaN(port) || port < 1 || port > 65535)) {
51
+ console.error("Invalid --port value: must be between 1 and 65535");
99
52
  process.exit(1);
100
53
  }
101
- await startHttpTransport(server, meta, { port });
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 });
102
58
  // Graceful shutdown
103
59
  const shutdown = async () => {
104
60
  logger.info("Shutting down...");
@@ -109,7 +65,7 @@ async function main() {
109
65
  process.on("SIGTERM", shutdown);
110
66
  return;
111
67
  }
112
- // Default: start stdio transport
68
+ // Start stdio transport
113
69
  await startStdioTransport(server);
114
70
  // Graceful shutdown
115
71
  const shutdown = async () => {
@@ -123,20 +79,6 @@ async function main() {
123
79
  async function runHealthCheck() {
124
80
  try {
125
81
  const config = loadConfig();
126
- // Run config validation first
127
- const validation = validateConfig(config);
128
- if (validation.warnings.length > 0) {
129
- console.log("Config warnings:");
130
- for (const w of validation.warnings) {
131
- console.log(` ⚠ ${w}`);
132
- }
133
- }
134
- if (validation.errors.length > 0) {
135
- console.log("Config errors:");
136
- for (const e of validation.errors) {
137
- console.log(` ✗ ${e}`);
138
- }
139
- }
140
82
  const discord = new DiscordClient(config.defaultToken);
141
83
  // Collect unique tokens: default + any project-specific ones
142
84
  const tokens = new Map(); // token → project names
@@ -153,46 +95,23 @@ async function runHealthCheck() {
153
95
  }
154
96
  }
155
97
  }
156
- console.log(`\nBots configured: ${tokens.size}`);
157
- let failures = 0;
98
+ console.log(`Bots configured: ${tokens.size}`);
158
99
  for (const [token, projects] of tokens) {
159
100
  console.log(`\nConnecting bot for: ${projects.join(", ")}...`);
160
- try {
161
- const client = await discord.getClient(token);
162
- console.log(` Bot: ${client.user?.tag}`);
163
- console.log(` Guilds: ${client.guilds.cache.size}`);
164
- for (const [id, guild] of client.guilds.cache) {
165
- try {
166
- const me = await guild.members.fetchMe();
167
- console.log(`\n ${guild.name} (${id})`);
168
- console.log(` Members: ${guild.memberCount}`);
169
- console.log(` Permissions: ${me.permissions.toArray().join(", ")}`);
170
- }
171
- catch (err) {
172
- console.log(`\n ${guild.name} (${id})`);
173
- console.log(` ✗ Failed to fetch permissions: ${err instanceof Error ? err.message : String(err)}`);
174
- failures++;
175
- }
176
- }
177
- }
178
- catch (err) {
179
- console.log(` ✗ Connection failed: ${err instanceof Error ? err.message : String(err)}`);
180
- 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(", ")}`);
181
109
  }
182
110
  }
183
111
  console.log(`\nProjects configured: ${Object.keys(config.global.projects).length}`);
184
112
  for (const [name, project] of Object.entries(config.global.projects)) {
185
113
  const tokenInfo = project.token_env ? ` [${project.token_env}]` : "";
186
- const tokenSet = project.token_env
187
- ? process.env[project.token_env]
188
- ? " ✓"
189
- : " ✗ NOT SET"
190
- : "";
191
- console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}${tokenInfo}${tokenSet}`);
192
- }
193
- if (failures > 0) {
194
- console.log(`\nHealth check completed with ${failures} failure(s).`);
195
- process.exit(1);
114
+ console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}${tokenInfo}`);
196
115
  }
197
116
  console.log("\nHealth check passed.");
198
117
  await discord.destroy();
@@ -202,87 +121,41 @@ async function runHealthCheck() {
202
121
  process.exit(1);
203
122
  }
204
123
  }
205
- async function runValidate() {
206
- try {
207
- const config = loadConfig();
208
- const result = validateConfig(config);
209
- printValidationResult(result);
210
- process.exit(result.errors.length > 0 ? 1 : 0);
211
- }
212
- catch (err) {
213
- console.error("Validation failed:", err instanceof Error ? err.message : err);
214
- process.exit(1);
215
- }
216
- }
217
- function printValidationResult(result) {
218
- console.log(`\ndiscord-ops config validation\n`);
219
- console.log(`Projects: ${result.projects.length}`);
220
- for (const p of result.projects) {
221
- const tokenStatus = p.tokenEnv
222
- ? p.tokenSet
223
- ? `[${p.tokenEnv}] ✓`
224
- : `[${p.tokenEnv}] ✗ NOT SET`
225
- : "(default token)";
226
- console.log(`\n ${p.name}:`);
227
- console.log(` Guild: ${p.guildId}`);
228
- console.log(` Token: ${tokenStatus}`);
229
- console.log(` Channels: ${Object.keys(p.channels).join(", ")}`);
230
- if (p.defaultChannel)
231
- console.log(` Default: ${p.defaultChannel}`);
232
- }
233
- if (result.warnings.length > 0) {
234
- console.log("\nWarnings:");
235
- for (const w of result.warnings) {
236
- console.log(` ⚠ ${w}`);
237
- }
238
- }
239
- if (result.errors.length > 0) {
240
- console.log("\nErrors:");
241
- for (const e of result.errors) {
242
- console.log(` ✗ ${e}`);
243
- }
244
- console.log("\nValidation FAILED.");
245
- }
246
- else {
247
- console.log("\nValidation passed.");
248
- }
249
- }
250
124
  function printUsage() {
251
125
  console.log(`
252
126
  discord-ops - Agency-grade Discord MCP server
253
127
 
254
128
  USAGE:
255
- discord-ops Start MCP server (stdio transport)
256
- discord-ops serve Start MCP server (HTTP/SSE transport)
257
- discord-ops run <tool> --args '{}' Run any tool directly (no AI/MCP required)
258
- discord-ops setup Interactive setup wizard
259
- discord-ops health Run health check + permission audit
260
- discord-ops validate Validate config without connecting to Discord
261
- discord-ops --help Show this help
262
- discord-ops --version Show version
263
-
264
- EXAMPLES:
265
- discord-ops run send_message --args '{"project":"my-app","channel":"general","content":"Hello!"}'
266
- 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
267
135
 
268
136
  OPTIONS:
269
- --dry-run Simulate destructive operations without calling Discord API
270
- --port <port> HTTP port for serve mode (default: 3000)
271
- --profile <name> Load a tool subset: full, monitoring, readonly, moderation
272
- --tools "t1,t2,..." Load only the listed tools (overrides --profile)
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
273
148
 
274
149
  ENVIRONMENT:
275
- DISCORD_TOKEN Default Discord bot token (required unless all projects have token_env)
276
- DISCORD_OPS_TOKEN_ENV Override which env var holds the default token (default: DISCORD_TOKEN)
150
+ DISCORD_TOKEN Default Discord bot token (required)
151
+ DISCORD_OPS_HTTP_TOKEN Bearer token for HTTP transport auth (required for serve mode)
277
152
  <PROJECT>_TOKEN Per-project bot tokens (configured via token_env in config)
278
153
  DISCORD_OPS_CONFIG Path to global config file (default: ~/.discord-ops.json)
279
154
  DISCORD_OPS_LOG_LEVEL Log level: debug, info, warn, error (default: info)
280
- DISCORD_OPS_DRY_RUN Enable dry-run mode (any truthy value)
281
- DRY_RUN Enable dry-run mode (any truthy value, alias)
282
155
 
283
156
  CONFIG FILES:
284
157
  ~/.discord-ops.json Global project routing config
285
- .discord-ops.json Per-project overrides (in repo root)
158
+ .discord-ops.json Per-project config (created by discord-ops init)
286
159
 
287
160
  DOCUMENTATION:
288
161
  https://github.com/bookedsolidtech/discord-ops
@@ -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"}
@@ -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"}