@zhin.js/scaffold-wizard 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 凉菜
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # @zhin.js/scaffold-wizard
2
+
3
+ Zhin 项目脚手架的**共享交互向导**库。适配器、AI、数据库的分步引导与配置合并逻辑集中在此,供 `create-zhin-app` 与 `@zhin.js/cli` 的 `zhin setup` 共用,避免两套实现漂移。
4
+
5
+ ## 消费者
6
+
7
+ | 包 / 命令 | 用途 |
8
+ |-----------|------|
9
+ | `create-zhin-app` (`pnpm create zhin-app`) | 新建 workspace 时运行完整向导并生成项目 |
10
+ | `@zhin.js/cli` → `zhin setup` | 已有项目增量配置(database / adapters / AI) |
11
+ | `@zhin.js/cli` → `zhin onboard` | 项目内外入口;重新配置时委托 `zhin setup` |
12
+
13
+ `zhin new` 负责插件包脚手架,**不**使用本包。
14
+
15
+ ## 模块职责
16
+
17
+ | 模块 | 说明 |
18
+ |------|------|
19
+ | `adapter.ts` / `adapter-configurers.ts` | 适配器选择与分步配置(Telegram polling/webhook、GitHub App、OneBot11 等) |
20
+ | `ai.ts` | AI Provider、触发方式、会话与安全默认值 |
21
+ | `database.ts` | 数据库类型与连接参数 |
22
+ | `project-deps.ts` | 依赖收集(含启用 AI 时预装 `@modelcontextprotocol/sdk`)、SQLite 前置条件 |
23
+ | `apply.ts` | 将向导结果写入 `zhin.config.*`、`.env`、`package.json` |
24
+ | `types.ts` | `InitOptions` 等共享类型 |
25
+
26
+ ## 主要 API
27
+
28
+ ```typescript
29
+ import {
30
+ configureDatabaseOptions,
31
+ configureAdapters,
32
+ configureAI,
33
+ finalizeWizardOptions,
34
+ applyWizardOptionsToConfig,
35
+ appendWizardEnvVars,
36
+ collectWizardDependencies,
37
+ mergeDependenciesIntoPackageJson,
38
+ getAdapterSetupNotes,
39
+ } from '@zhin.js/scaffold-wizard';
40
+ ```
41
+
42
+ 典型流程(与 `create-zhin-app` / `zhin setup` 一致):
43
+
44
+ 1. 交互调用 `configureDatabaseOptions` / `configureAdapters` / `configureAI`
45
+ 2. `finalizeWizardOptions(options)` — 补全 AI / GitHub 等所需的 SQLite
46
+ 3. `applyWizardOptionsToConfig(config, options)` — 合并进配置对象
47
+ 4. `appendWizardEnvVars` + `mergeDependenciesIntoPackageJson` — 写 `.env` 与依赖
48
+
49
+ ## 开发
50
+
51
+ ```bash
52
+ pnpm --filter @zhin.js/scaffold-wizard build
53
+ pnpm --filter @zhin.js/scaffold-wizard test
54
+ ```
55
+
56
+ `create-zhin-app` 与 `@zhin.js/cli` 的 `build` 脚本会自动先构建本包;单独 `pnpm --filter @zhin.js/cli build` 也会触发依赖构建。
57
+
58
+ 修改向导行为时,请同时跑:
59
+
60
+ ```bash
61
+ pnpm --filter create-zhin-app test
62
+ pnpm vitest run basic/cli/tests
63
+ ```
64
+
65
+ ## 文档链接
66
+
67
+ 适配器向导内嵌文档 URL 指向 [zhin.js.org/adapters/](https://zhin.js.org/adapters/) 各平台页;索引见 [Essentials · Adapters](https://zhin.js.org/essentials/adapters)。
@@ -0,0 +1,19 @@
1
+ /** 平台适配器文档索引 */
2
+ export declare const ADAPTERS_DOCS_URL = "https://zhin.js.org/adapters/";
3
+ /** @deprecated 使用 ADAPTERS_DOCS_URL */
4
+ export declare const ADAPTERS_INDEX_URL = "https://zhin.js.org/adapters/";
5
+ /** 框架级适配器概念(多平台、群管工具等) */
6
+ export declare const ADAPTERS_ESSENTIALS_URL = "https://zhin.js.org/essentials/adapters";
7
+ /** 各适配器文档页(与 docs/adapters/*.md 同步) */
8
+ export declare const adapterDocsUrl: (slug: string) => string;
9
+ export interface BotConfigureContext {
10
+ envVars: Record<string, string>;
11
+ markRequiresDatabase: () => void;
12
+ }
13
+ export declare function configureTelegramBot(ctx: BotConfigureContext): Promise<Record<string, unknown>>;
14
+ export declare function configureGitHubBot(ctx: BotConfigureContext): Promise<Record<string, unknown>>;
15
+ export declare function configureOneBot11Bot(ctx: BotConfigureContext): Promise<Record<string, unknown>>;
16
+ export declare function configureQQBot(ctx: BotConfigureContext): Promise<Record<string, unknown>>;
17
+ export declare function configureDiscordBot(ctx: BotConfigureContext): Promise<Record<string, unknown>>;
18
+ export declare function configureSlackBot(ctx: BotConfigureContext): Promise<Record<string, unknown>>;
19
+ //# sourceMappingURL=adapter-configurers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-configurers.d.ts","sourceRoot":"","sources":["../src/adapter-configurers.ts"],"names":[],"mappings":"AAGA,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AAEjE,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,kCAAoB,CAAC;AAEpD,0BAA0B;AAC1B,eAAO,MAAM,uBAAuB,4CAA4C,CAAC;AAEjF,uCAAuC;AACvC,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,WAA2C,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,oBAAoB,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+FrG;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAmJnG;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAuErG;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAgE/F;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoEpG;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0ElG"}
@@ -0,0 +1,502 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ /** 平台适配器文档索引 */
4
+ export const ADAPTERS_DOCS_URL = 'https://zhin.js.org/adapters/';
5
+ /** @deprecated 使用 ADAPTERS_DOCS_URL */
6
+ export const ADAPTERS_INDEX_URL = ADAPTERS_DOCS_URL;
7
+ /** 框架级适配器概念(多平台、群管工具等) */
8
+ export const ADAPTERS_ESSENTIALS_URL = 'https://zhin.js.org/essentials/adapters';
9
+ /** 各适配器文档页(与 docs/adapters/*.md 同步) */
10
+ export const adapterDocsUrl = (slug) => `https://zhin.js.org/adapters/${slug}`;
11
+ export async function configureTelegramBot(ctx) {
12
+ console.log(chalk.gray(' 文档: ' + adapterDocsUrl('telegram')));
13
+ const { botName } = await inquirer.prompt([
14
+ {
15
+ type: 'input',
16
+ name: 'botName',
17
+ message: ' Bot 标识名称:',
18
+ default: 'telegram-bot',
19
+ validate: (v) => (v.trim() ? true : '名称不能为空'),
20
+ },
21
+ ]);
22
+ const { token } = await inquirer.prompt([
23
+ {
24
+ type: 'password',
25
+ name: 'token',
26
+ message: ' Telegram Bot Token(@BotFather 获取):',
27
+ validate: (v) => (v.trim() ? true : 'Token 不能为空'),
28
+ },
29
+ ]);
30
+ ctx.envVars.TELEGRAM_TOKEN = token;
31
+ const { transport } = await inquirer.prompt([
32
+ {
33
+ type: 'select',
34
+ name: 'transport',
35
+ message: ' 消息接收方式:',
36
+ choices: [
37
+ {
38
+ name: '长轮询 polling(默认,本地开发无需公网)',
39
+ value: 'polling',
40
+ },
41
+ {
42
+ name: 'Webhook(生产环境,需 HTTPS 公网域名)',
43
+ value: 'webhook',
44
+ },
45
+ ],
46
+ default: 'polling',
47
+ },
48
+ ]);
49
+ const botConfig = {
50
+ context: 'telegram',
51
+ name: botName.trim(),
52
+ token: '${TELEGRAM_TOKEN}',
53
+ polling: transport === 'polling',
54
+ };
55
+ if (transport === 'webhook') {
56
+ console.log('');
57
+ console.log(chalk.yellow(' Webhook 前置条件:'));
58
+ console.log(chalk.gray(' • Bot 进程需绑定可被 Telegram 访问的 HTTPS 域名(有效 TLS 证书)'));
59
+ console.log(chalk.gray(' • 在 @BotFather 可配合 setWebhook,或由 Telegraf 在 launch 时注册'));
60
+ console.log(chalk.gray(' • 防火墙/反向代理需放行 webhook.port(默认由 Telegraf 监听)'));
61
+ const webhook = await inquirer.prompt([
62
+ {
63
+ type: 'input',
64
+ name: 'domain',
65
+ message: ' Webhook 公网 HTTPS 域名(如 https://bot.example.com):',
66
+ validate: (v) => {
67
+ if (!v.trim())
68
+ return '域名不能为空';
69
+ if (!/^https:\/\/.+/i.test(v.trim()))
70
+ return '须以 https:// 开头';
71
+ return true;
72
+ },
73
+ },
74
+ {
75
+ type: 'input',
76
+ name: 'path',
77
+ message: ' Webhook 路径:',
78
+ default: '/telegram-webhook',
79
+ },
80
+ {
81
+ type: 'input',
82
+ name: 'port',
83
+ message: ' 本地监听端口(Telegraf webhook server):',
84
+ default: '8443',
85
+ validate: (v) => {
86
+ const p = parseInt(v, 10);
87
+ if (Number.isNaN(p) || p < 1 || p > 65535)
88
+ return '请输入 1–65535 端口';
89
+ return true;
90
+ },
91
+ },
92
+ ]);
93
+ botConfig.polling = false;
94
+ botConfig.webhook = {
95
+ domain: webhook.domain.trim(),
96
+ path: webhook.path.trim(),
97
+ port: parseInt(webhook.port, 10),
98
+ };
99
+ }
100
+ return botConfig;
101
+ }
102
+ export async function configureGitHubBot(ctx) {
103
+ console.log(chalk.gray(' 文档: ' + adapterDocsUrl('github')));
104
+ ctx.markRequiresDatabase();
105
+ const { botName } = await inquirer.prompt([
106
+ {
107
+ type: 'input',
108
+ name: 'botName',
109
+ message: ' Bot 标识名称:',
110
+ default: 'github-bot',
111
+ validate: (v) => (v.trim() ? true : '名称不能为空'),
112
+ },
113
+ ]);
114
+ const { authMode } = await inquirer.prompt([
115
+ {
116
+ type: 'select',
117
+ name: 'authMode',
118
+ message: ' 认证方式:',
119
+ choices: [
120
+ {
121
+ name: 'GitHub App(推荐生产:JWT → Installation Token)',
122
+ value: 'github_app',
123
+ },
124
+ {
125
+ name: 'gh CLI(本地开发:需 gh auth login)',
126
+ value: 'gh_cli',
127
+ },
128
+ ],
129
+ default: 'github_app',
130
+ },
131
+ ]);
132
+ const botConfig = {
133
+ context: 'github',
134
+ name: botName.trim(),
135
+ };
136
+ if (authMode === 'github_app') {
137
+ console.log(chalk.gray(' 在 github.com/settings/apps 创建 App,记录 App ID 并下载 .pem 私钥'));
138
+ const appConfig = await inquirer.prompt([
139
+ {
140
+ type: 'input',
141
+ name: 'app_id',
142
+ message: ' GitHub App ID:',
143
+ validate: (v) => (v.trim() ? true : 'App ID 不能为空'),
144
+ },
145
+ {
146
+ type: 'input',
147
+ name: 'private_key',
148
+ message: ' 私钥路径或 PEM 内容(如 ./data/github-app.pem):',
149
+ default: './data/github-app.pem',
150
+ validate: (v) => (v.trim() ? true : '私钥不能为空'),
151
+ },
152
+ ]);
153
+ ctx.envVars.GITHUB_APP_ID = appConfig.app_id.trim();
154
+ botConfig.app_id = '${GITHUB_APP_ID}';
155
+ botConfig.private_key = appConfig.private_key.trim();
156
+ }
157
+ else {
158
+ console.log(chalk.gray(' 请确保已执行 gh auth login,且 gh 在 PATH 中'));
159
+ }
160
+ const { eventsMode } = await inquirer.prompt([
161
+ {
162
+ type: 'select',
163
+ name: 'eventsMode',
164
+ message: ' 事件接收方式:',
165
+ choices: [
166
+ {
167
+ name: 'Webhook 实时推送(需 @zhin.js/host-router + 公网 URL)',
168
+ value: 'webhook',
169
+ },
170
+ {
171
+ name: '轮询 polling(无需公网,默认 60s 间隔)',
172
+ value: 'polling',
173
+ },
174
+ ],
175
+ default: 'webhook',
176
+ },
177
+ ]);
178
+ if (eventsMode === 'webhook') {
179
+ console.log('');
180
+ console.log(chalk.yellow(' Webhook 前置条件:'));
181
+ console.log(chalk.gray(' • plugins 需包含 @zhin.js/host-router(脚手架已默认写入)'));
182
+ console.log(chalk.gray(' • GitHub App Webhook URL 填 https://<你的域名>/pub/github/webhook'));
183
+ console.log(chalk.gray(' • /pub/* 路径绕过 Bearer 认证,供 GitHub 回调'));
184
+ const webhook = await inquirer.prompt([
185
+ {
186
+ type: 'password',
187
+ name: 'webhook_secret',
188
+ message: ' Webhook Secret(与 GitHub App 设置一致):',
189
+ validate: (v) => (v.trim() ? true : 'Webhook 模式需填写 Secret'),
190
+ },
191
+ {
192
+ type: 'input',
193
+ name: 'webhook_path',
194
+ message: ' Webhook 路径:',
195
+ default: '/pub/github/webhook',
196
+ },
197
+ ]);
198
+ ctx.envVars.GITHUB_WEBHOOK_SECRET = webhook.webhook_secret;
199
+ botConfig.webhook_secret = '${GITHUB_WEBHOOK_SECRET}';
200
+ botConfig.webhook_path = webhook.webhook_path.trim();
201
+ }
202
+ else {
203
+ const { poll_interval } = await inquirer.prompt([
204
+ {
205
+ type: 'input',
206
+ name: 'poll_interval',
207
+ message: ' 轮询间隔(秒):',
208
+ default: '60',
209
+ validate: (v) => {
210
+ const n = parseInt(v, 10);
211
+ if (Number.isNaN(n) || n < 10)
212
+ return '建议不小于 10 秒';
213
+ return true;
214
+ },
215
+ },
216
+ ]);
217
+ botConfig.poll_interval = parseInt(poll_interval, 10);
218
+ }
219
+ const { enableMcp } = await inquirer.prompt([
220
+ {
221
+ type: 'confirm',
222
+ name: 'enableMcp',
223
+ message: ' 配置 server-github MCP PAT?(可选,用于 fork 等 MCP 工具)',
224
+ default: false,
225
+ },
226
+ ]);
227
+ if (enableMcp) {
228
+ const { pat } = await inquirer.prompt([
229
+ {
230
+ type: 'password',
231
+ name: 'pat',
232
+ message: ' GitHub Personal Access Token:',
233
+ validate: (v) => (v.trim() ? true : 'PAT 不能为空'),
234
+ },
235
+ ]);
236
+ ctx.envVars.GITHUB_PERSONAL_ACCESS_TOKEN = pat;
237
+ }
238
+ return botConfig;
239
+ }
240
+ export async function configureOneBot11Bot(ctx) {
241
+ console.log(chalk.gray(' 文档: ' + adapterDocsUrl('onebot11')));
242
+ const { connection } = await inquirer.prompt([
243
+ {
244
+ type: 'select',
245
+ name: 'connection',
246
+ message: ' 连接方式:',
247
+ choices: [
248
+ { name: '正向 WebSocket (ws) — 本 Bot 连接 OneBot 实现', value: 'ws' },
249
+ { name: '反向 WebSocket (wss) — OneBot 实现连本 Bot(需 host-router)', value: 'wss' },
250
+ ],
251
+ default: 'ws',
252
+ },
253
+ ]);
254
+ const { botName } = await inquirer.prompt([
255
+ {
256
+ type: 'input',
257
+ name: 'botName',
258
+ message: ' Bot 标识名称:',
259
+ default: 'onebot-bot',
260
+ validate: (v) => (v.trim() ? true : '名称不能为空'),
261
+ },
262
+ ]);
263
+ const botConfig = {
264
+ context: 'onebot11',
265
+ connection,
266
+ name: botName.trim(),
267
+ };
268
+ if (connection === 'ws') {
269
+ const { url } = await inquirer.prompt([
270
+ {
271
+ type: 'input',
272
+ name: 'url',
273
+ message: ' OneBot WS 地址:',
274
+ default: 'ws://127.0.0.1:6700',
275
+ validate: (v) => (v.trim() ? true : '地址不能为空'),
276
+ },
277
+ ]);
278
+ botConfig.url = url.trim();
279
+ }
280
+ else {
281
+ console.log(chalk.gray(' 反向 WS 需启用 @zhin.js/host-router,OneBot 实现配置连接到此 Bot'));
282
+ const { path: wsPath } = await inquirer.prompt([
283
+ {
284
+ type: 'input',
285
+ name: 'path',
286
+ message: ' 反向 WS 路径:',
287
+ default: '/onebot11/ws',
288
+ validate: (v) => (v.trim() ? true : '路径不能为空'),
289
+ },
290
+ ]);
291
+ botConfig.path = wsPath.trim();
292
+ }
293
+ const { accessToken } = await inquirer.prompt([
294
+ {
295
+ type: 'password',
296
+ name: 'accessToken',
297
+ message: ' access_token(无则留空):',
298
+ default: '',
299
+ },
300
+ ]);
301
+ if (accessToken?.trim()) {
302
+ ctx.envVars.ONEBOT11_ACCESS_TOKEN = accessToken.trim();
303
+ botConfig.access_token = '${ONEBOT11_ACCESS_TOKEN}';
304
+ }
305
+ return botConfig;
306
+ }
307
+ export async function configureQQBot(ctx) {
308
+ console.log(chalk.gray(' 文档: ' + adapterDocsUrl('qq')));
309
+ const credentials = await inquirer.prompt([
310
+ {
311
+ type: 'input',
312
+ name: 'name',
313
+ message: ' Bot 标识名称:',
314
+ default: 'qq-bot',
315
+ validate: (v) => (v.trim() ? true : '名称不能为空'),
316
+ },
317
+ {
318
+ type: 'input',
319
+ name: 'appID',
320
+ message: ' App ID(QQ 开放平台):',
321
+ validate: (v) => (v.trim() ? true : 'App ID 不能为空'),
322
+ },
323
+ {
324
+ type: 'password',
325
+ name: 'token',
326
+ message: ' Token:',
327
+ validate: (v) => (v.trim() ? true : 'Token 不能为空'),
328
+ },
329
+ {
330
+ type: 'password',
331
+ name: 'secret',
332
+ message: ' Secret:',
333
+ validate: (v) => (v.trim() ? true : 'Secret 不能为空'),
334
+ },
335
+ ]);
336
+ ctx.envVars.QQ_APP_ID = credentials.appID.trim();
337
+ ctx.envVars.QQ_TOKEN = credentials.token;
338
+ ctx.envVars.QQ_SECRET = credentials.secret;
339
+ const { mode, sandbox } = await inquirer.prompt([
340
+ {
341
+ type: 'select',
342
+ name: 'mode',
343
+ message: ' 消息接收模式 (mode):',
344
+ choices: [
345
+ { name: 'public — 公域消息', value: 'public' },
346
+ { name: 'private — 私域消息', value: 'private' },
347
+ ],
348
+ default: 'public',
349
+ },
350
+ {
351
+ type: 'confirm',
352
+ name: 'sandbox',
353
+ message: ' 沙箱环境 (sandbox)?',
354
+ default: false,
355
+ },
356
+ ]);
357
+ return {
358
+ context: 'qq',
359
+ name: credentials.name.trim(),
360
+ appID: '${QQ_APP_ID}',
361
+ token: '${QQ_TOKEN}',
362
+ secret: '${QQ_SECRET}',
363
+ mode,
364
+ platform: 'qq',
365
+ sandbox,
366
+ };
367
+ }
368
+ export async function configureDiscordBot(ctx) {
369
+ console.log(chalk.gray(' 文档: ' + adapterDocsUrl('discord')));
370
+ const { connection } = await inquirer.prompt([
371
+ {
372
+ type: 'select',
373
+ name: 'connection',
374
+ message: ' 连接方式:',
375
+ choices: [
376
+ { name: 'Gateway WebSocket(常规 Bot,推荐)', value: 'gateway' },
377
+ { name: 'Interactions HTTP(斜杠命令,需 host-router)', value: 'interactions' },
378
+ ],
379
+ default: 'gateway',
380
+ },
381
+ ]);
382
+ const { botName, token } = await inquirer.prompt([
383
+ {
384
+ type: 'input',
385
+ name: 'botName',
386
+ message: ' Bot 标识名称:',
387
+ default: 'discord-bot',
388
+ validate: (v) => (v.trim() ? true : '名称不能为空'),
389
+ },
390
+ {
391
+ type: 'password',
392
+ name: 'token',
393
+ message: ' Bot Token:',
394
+ validate: (v) => (v.trim() ? true : 'Token 不能为空'),
395
+ },
396
+ ]);
397
+ ctx.envVars.DISCORD_TOKEN = token;
398
+ const botConfig = {
399
+ context: 'discord',
400
+ connection,
401
+ name: botName.trim(),
402
+ token: '${DISCORD_TOKEN}',
403
+ };
404
+ if (connection === 'interactions') {
405
+ console.log(chalk.gray(' Interactions 模式需 @zhin.js/host-router 与 Developer Portal 中的公钥'));
406
+ const interactions = await inquirer.prompt([
407
+ {
408
+ type: 'input',
409
+ name: 'applicationId',
410
+ message: ' Application ID:',
411
+ validate: (v) => (v.trim() ? true : '不能为空'),
412
+ },
413
+ {
414
+ type: 'input',
415
+ name: 'publicKey',
416
+ message: ' Public Key:',
417
+ validate: (v) => (v.trim() ? true : '不能为空'),
418
+ },
419
+ {
420
+ type: 'input',
421
+ name: 'interactionsPath',
422
+ message: ' Interactions 路径:',
423
+ default: '/discord/interactions',
424
+ },
425
+ ]);
426
+ botConfig.applicationId = interactions.applicationId.trim();
427
+ botConfig.publicKey = interactions.publicKey.trim();
428
+ botConfig.interactionsPath = interactions.interactionsPath.trim();
429
+ }
430
+ return botConfig;
431
+ }
432
+ export async function configureSlackBot(ctx) {
433
+ console.log(chalk.gray(' 文档: ' + adapterDocsUrl('slack')));
434
+ const { socketMode } = await inquirer.prompt([
435
+ {
436
+ type: 'select',
437
+ name: 'socketMode',
438
+ message: ' 连接方式:',
439
+ choices: [
440
+ { name: 'Socket Mode(无需公网,需 App Token)', value: 'true' },
441
+ { name: 'HTTP Events API(需公网 URL + 端口)', value: 'false' },
442
+ ],
443
+ default: 'true',
444
+ },
445
+ ]);
446
+ const { botName, token, signingSecret } = await inquirer.prompt([
447
+ {
448
+ type: 'input',
449
+ name: 'botName',
450
+ message: ' Bot 标识名称:',
451
+ default: 'slack-bot',
452
+ validate: (v) => (v.trim() ? true : '名称不能为空'),
453
+ },
454
+ {
455
+ type: 'password',
456
+ name: 'token',
457
+ message: ' Bot Token (xoxb-...):',
458
+ validate: (v) => (v.trim() ? true : '不能为空'),
459
+ },
460
+ {
461
+ type: 'password',
462
+ name: 'signingSecret',
463
+ message: ' Signing Secret:',
464
+ validate: (v) => (v.trim() ? true : '不能为空'),
465
+ },
466
+ ]);
467
+ ctx.envVars.SLACK_BOT_TOKEN = token;
468
+ ctx.envVars.SLACK_SIGNING_SECRET = signingSecret;
469
+ const botConfig = {
470
+ context: 'slack',
471
+ name: botName.trim(),
472
+ token: '${SLACK_BOT_TOKEN}',
473
+ signingSecret: '${SLACK_SIGNING_SECRET}',
474
+ socketMode: socketMode === 'true',
475
+ };
476
+ if (socketMode === 'true') {
477
+ const { appToken } = await inquirer.prompt([
478
+ {
479
+ type: 'password',
480
+ name: 'appToken',
481
+ message: ' App Token (xapp-...,Socket Mode 必需):',
482
+ validate: (v) => (v.trim() ? true : 'App Token 不能为空'),
483
+ },
484
+ ]);
485
+ ctx.envVars.SLACK_APP_TOKEN = appToken;
486
+ botConfig.appToken = '${SLACK_APP_TOKEN}';
487
+ }
488
+ else {
489
+ console.log(chalk.yellow(' HTTP 模式需公网可达并配置 Slack Event Subscriptions URL'));
490
+ const { port } = await inquirer.prompt([
491
+ {
492
+ type: 'input',
493
+ name: 'port',
494
+ message: ' 监听端口:',
495
+ default: '3000',
496
+ },
497
+ ]);
498
+ botConfig.port = parseInt(port, 10);
499
+ }
500
+ return botConfig;
501
+ }
502
+ //# sourceMappingURL=adapter-configurers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-configurers.js","sourceRoot":"","sources":["../src/adapter-configurers.ts"],"names":[],"mappings":"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"}