






















@@ -1,5 +1,6 @@
11import type { Command } from "commander";
22import { danger } from "../globals.js";
3+import { listBundledPackageChannelMetadata } from "../plugins/bundled-package-channel-metadata.js";
34import { defaultRuntime } from "../runtime.js";
45import { formatDocsLink } from "../terminal/links.js";
56import { theme } from "../terminal/theme.js";
@@ -35,6 +36,31 @@ function getOptionNames(command: Command): string[] {
3536return command.options.map((option) => option.attributeName());
3637}
373839+function addChannelSetupOptions(command: Command): Command {
40+const seenFlags = new Set(command.options.map((option) => option.flags));
41+const channels = listBundledPackageChannelMetadata().toSorted((left, right) => {
42+const leftOrder = left.order ?? Number.MAX_SAFE_INTEGER;
43+const rightOrder = right.order ?? Number.MAX_SAFE_INTEGER;
44+return leftOrder === rightOrder
45+ ? (left.id ?? "").localeCompare(right.id ?? "")
46+ : leftOrder - rightOrder;
47+});
48+for (const channel of channels) {
49+for (const option of channel.cliAddOptions ?? []) {
50+if (seenFlags.has(option.flags)) {
51+continue;
52+}
53+seenFlags.add(option.flags);
54+if (option.defaultValue !== undefined) {
55+command.option(option.flags, option.description, option.defaultValue);
56+} else {
57+command.option(option.flags, option.description);
58+}
59+}
60+}
61+return command;
62+}
63+3864export function registerChannelsCli(program: Command) {
3965const channelNames = formatCliChannelOptions();
4066const channels = program
@@ -134,52 +160,29 @@ export function registerChannelsCli(program: Command) {
134160});
135161});
136162137-channels
138-.command("add")
139-.description("Add or update a channel account")
140-.option("--channel <name>", `Channel (${channelNames})`)
141-.option("--account <id>", "Account id (default when omitted)")
142-.option("--name <name>", "Display name for this account")
143-.option("--token <token>", "Bot token (Telegram/Discord)")
144-.option("--private-key <key>", "Nostr private key (nsec... or hex)")
145-.option("--token-file <path>", "Bot token file (Telegram)")
146-.option("--bot-token <token>", "Slack bot token (xoxb-...)")
147-.option("--app-token <token>", "Slack app token (xapp-...)")
148-.option("--signal-number <e164>", "Signal account number (E.164)")
149-.option("--cli-path <path>", "CLI path (signal-cli or imsg)")
150-.option("--db-path <path>", "iMessage database path")
151-.option("--service <service>", "iMessage service (imessage|sms|auto)")
152-.option("--region <region>", "iMessage region (for SMS)")
153-.option("--auth-dir <path>", "WhatsApp auth directory override")
154-.option("--http-url <url>", "Signal HTTP daemon base URL")
155-.option("--http-host <host>", "Signal HTTP host")
156-.option("--http-port <port>", "Signal HTTP port")
157-.option("--webhook-path <path>", "Webhook path (Google Chat/BlueBubbles)")
158-.option("--webhook-url <url>", "Google Chat webhook URL")
159-.option("--audience-type <type>", "Google Chat audience type (app-url|project-number)")
160-.option("--audience <value>", "Google Chat audience value (app URL or project number)")
161-.option("--homeserver <url>", "Matrix homeserver URL")
162-.option("--user-id <id>", "Matrix user ID")
163-.option("--access-token <token>", "Matrix access token")
164-.option("--password <password>", "Matrix password")
165-.option("--device-name <name>", "Matrix device name")
166-.option("--initial-sync-limit <n>", "Matrix initial sync limit")
167-.option("--ship <ship>", "Tlon ship name (~sampel-palnet)")
168-.option("--url <url>", "Tlon ship URL")
169-.option("--relay-urls <list>", "Nostr relay URLs (comma-separated)")
170-.option("--code <code>", "Tlon login code")
171-.option("--group-channels <list>", "Tlon group channels (comma-separated)")
172-.option("--dm-allowlist <list>", "Tlon DM allowlist (comma-separated ships)")
173-.option("--auto-discover-channels", "Tlon auto-discover group channels")
174-.option("--no-auto-discover-channels", "Disable Tlon auto-discovery")
175-.option("--use-env", "Use env token (default account only)", false)
176-.action(async (opts, command) => {
177-await runChannelsCommand(async () => {
178-const { channelsAddCommand } = await loadChannelsCommands();
179-const hasFlags = hasExplicitOptions(command, getOptionNames(command));
180-await channelsAddCommand(opts, defaultRuntime, { hasFlags });
181-});
163+addChannelSetupOptions(
164+channels
165+.command("add")
166+.description("Add or update a channel account")
167+.option("--channel <name>", `Channel (${channelNames})`)
168+.option("--account <id>", "Account id (default when omitted)")
169+.option("--name <name>", "Display name for this account")
170+.option("--token <token>", "Channel token or credential payload")
171+.option("--token-file <path>", "Read channel token or credential payload from file")
172+.option("--bot-token <token>", "Bot token")
173+.option("--app-token <token>", "App token")
174+.option("--password <password>", "Channel password or login secret")
175+.option("--cli-path <path>", "Channel CLI path")
176+.option("--url <url>", "Channel setup URL")
177+.option("--http-url <url>", "Channel HTTP service URL")
178+.option("--use-env", "Use env-backed credentials when supported", false),
179+).action(async (opts, command) => {
180+await runChannelsCommand(async () => {
181+const { channelsAddCommand } = await loadChannelsCommands();
182+const hasFlags = hasExplicitOptions(command, getOptionNames(command));
183+await channelsAddCommand(opts, defaultRuntime, { hasFlags });
182184});
185+});
183186184187channels
185188.command("remove")
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。