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.
Files changed (82) hide show
  1. package/CHANGELOG.md +19 -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 +47 -175
  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/tools/audit/query-audit-log.js +1 -1
  25. package/dist/tools/audit/query-audit-log.js.map +1 -1
  26. package/dist/tools/channels/get-channel.d.ts.map +1 -1
  27. package/dist/tools/channels/get-channel.js +3 -1
  28. package/dist/tools/channels/get-channel.js.map +1 -1
  29. package/dist/tools/channels/permissions.js +1 -1
  30. package/dist/tools/channels/permissions.js.map +1 -1
  31. package/dist/tools/guilds/create-invite.d.ts +2 -1
  32. package/dist/tools/guilds/create-invite.d.ts.map +1 -1
  33. package/dist/tools/guilds/create-invite.js +19 -8
  34. package/dist/tools/guilds/create-invite.js.map +1 -1
  35. package/dist/tools/guilds/index.d.ts +0 -1
  36. package/dist/tools/guilds/index.d.ts.map +1 -1
  37. package/dist/tools/guilds/index.js +0 -1
  38. package/dist/tools/guilds/index.js.map +1 -1
  39. package/dist/tools/index.d.ts.map +1 -1
  40. package/dist/tools/index.js +0 -12
  41. package/dist/tools/index.js.map +1 -1
  42. package/dist/tools/members/get-member.js +1 -1
  43. package/dist/tools/members/get-member.js.map +1 -1
  44. package/dist/tools/members/list-members.js +1 -1
  45. package/dist/tools/members/list-members.js.map +1 -1
  46. package/dist/tools/messaging/index.d.ts +1 -2
  47. package/dist/tools/messaging/index.d.ts.map +1 -1
  48. package/dist/tools/messaging/index.js +1 -2
  49. package/dist/tools/messaging/index.js.map +1 -1
  50. package/dist/tools/messaging/notify-owners.js +2 -2
  51. package/dist/tools/messaging/search.d.ts +2 -1
  52. package/dist/tools/messaging/search.d.ts.map +1 -1
  53. package/dist/tools/messaging/search.js +79 -42
  54. package/dist/tools/messaging/search.js.map +1 -1
  55. package/dist/tools/messaging/send-embed.d.ts +2 -1
  56. package/dist/tools/messaging/send-embed.d.ts.map +1 -1
  57. package/dist/tools/messaging/send-embed.js +21 -14
  58. package/dist/tools/messaging/send-embed.js.map +1 -1
  59. package/dist/tools/messaging/send-message.js +2 -2
  60. package/dist/tools/profiles.d.ts +14 -0
  61. package/dist/tools/profiles.d.ts.map +1 -0
  62. package/dist/tools/profiles.js +63 -0
  63. package/dist/tools/profiles.js.map +1 -0
  64. package/dist/tools/threads/create-thread.d.ts.map +1 -1
  65. package/dist/tools/threads/create-thread.js +24 -5
  66. package/dist/tools/threads/create-thread.js.map +1 -1
  67. package/dist/tools/types.d.ts +15 -14
  68. package/dist/tools/types.d.ts.map +1 -1
  69. package/dist/tools/types.js +5 -13
  70. package/dist/tools/types.js.map +1 -1
  71. package/dist/tools/webhooks/execute-webhook.d.ts.map +1 -1
  72. package/dist/tools/webhooks/execute-webhook.js +45 -12
  73. package/dist/tools/webhooks/execute-webhook.js.map +1 -1
  74. package/dist/transport/http.d.ts +23 -2
  75. package/dist/transport/http.d.ts.map +1 -1
  76. package/dist/transport/http.js +61 -21
  77. package/dist/transport/http.js.map +1 -1
  78. package/dist/utils/og-fetch.d.ts +9 -0
  79. package/dist/utils/og-fetch.d.ts.map +1 -1
  80. package/dist/utils/og-fetch.js +135 -47
  81. package/dist/utils/og-fetch.js.map +1 -1
  82. 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
@@ -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,76 +19,29 @@ 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");
@@ -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
- 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 });
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
- // Default: start stdio transport
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(`\nBots configured: ${tokens.size}`);
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
- try {
162
- const client = await discord.getClient(token);
163
- console.log(` Bot: ${client.user?.tag}`);
164
- console.log(` Guilds: ${client.guilds.cache.size}`);
165
- for (const [id, guild] of client.guilds.cache) {
166
- try {
167
- const me = await guild.members.fetchMe();
168
- console.log(`\n ${guild.name} (${id})`);
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
- const tokenSet = project.token_env
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 Start MCP server (stdio transport)
257
- discord-ops serve Start MCP server (HTTP/SSE transport)
258
- discord-ops run <tool> --args '{}' Run any tool directly (no AI/MCP required)
259
- discord-ops setup Interactive setup wizard
260
- discord-ops health Run health check + permission audit
261
- discord-ops validate Validate config without connecting to Discord
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
- --dry-run Simulate destructive operations without calling Discord API
271
- --port <port> HTTP port for serve mode (default: 3000)
272
- --profile <name> Load a tool subset: full, monitoring, readonly, moderation
273
- --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
274
148
 
275
149
  ENVIRONMENT:
276
- DISCORD_TOKEN Default Discord bot token (required unless all projects have token_env)
277
- 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)
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 overrides (in repo root)
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
@@ -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"}
@@ -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"}