botmux 3.4.0 → 3.4.1

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.
@@ -20,6 +20,18 @@ export interface BotInfoForResolve {
20
20
  larkAppId: string;
21
21
  botName: string | null;
22
22
  }
23
+ export interface BotInfoForKickoff {
24
+ larkAppId: string;
25
+ botOpenId: string | null;
26
+ }
27
+ export type ResolvedKickoff = {
28
+ ok: true;
29
+ targetLarkAppId?: string;
30
+ prompt?: string;
31
+ } | {
32
+ ok: false;
33
+ error: string;
34
+ };
23
35
  export interface ResolvedBots {
24
36
  /** Resolved larkAppIds in input order, deduped. First element is creator. */
25
37
  larkAppIds: string[];
@@ -29,4 +41,11 @@ export interface ResolvedBots {
29
41
  ambiguousWarnings: string[];
30
42
  }
31
43
  export declare function resolveBotRefs(refs: string[], botConfigs: BotConfigForResolve[], botInfo: BotInfoForResolve[]): ResolvedBots;
44
+ /**
45
+ * Validate the optional kickoff pair and resolve the user-facing bot open_id
46
+ * back to a selected larkAppId. The service later obtains the target bot's
47
+ * observer-scoped open_id from the creator app before sending the @mention;
48
+ * a bot's self-reported open_id is not valid across Lark apps.
49
+ */
50
+ export declare function resolveKickoff(botOpenIdRaw: string | undefined, promptRaw: string | undefined, selectedLarkAppIds: string[], botInfo: BotInfoForKickoff[]): ResolvedKickoff;
32
51
  //# sourceMappingURL=create-group-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-group-resolver.d.ts","sourceRoot":"","sources":["../../src/cli/create-group-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,iBAAiB,EAAE,GAC3B,YAAY,CA2Dd"}
1
+ {"version":3,"file":"create-group-resolver.d.ts","sourceRoot":"","sources":["../../src/cli/create-group-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,iBAAiB,EAAE,GAC3B,YAAY,CA2Dd;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,kBAAkB,EAAE,MAAM,EAAE,EAC5B,OAAO,EAAE,iBAAiB,EAAE,GAC3B,eAAe,CA0BjB"}
@@ -67,4 +67,34 @@ export function resolveBotRefs(refs, botConfigs, botInfo) {
67
67
  }
68
68
  return { larkAppIds: out, invalid, ambiguousWarnings };
69
69
  }
70
+ /**
71
+ * Validate the optional kickoff pair and resolve the user-facing bot open_id
72
+ * back to a selected larkAppId. The service later obtains the target bot's
73
+ * observer-scoped open_id from the creator app before sending the @mention;
74
+ * a bot's self-reported open_id is not valid across Lark apps.
75
+ */
76
+ export function resolveKickoff(botOpenIdRaw, promptRaw, selectedLarkAppIds, botInfo) {
77
+ const botOpenId = botOpenIdRaw?.trim() || undefined;
78
+ const prompt = promptRaw?.trim() || undefined;
79
+ if (!botOpenId && !prompt)
80
+ return { ok: true };
81
+ if (!botOpenId || !prompt) {
82
+ return { ok: false, error: '--kickoff-bot 与 --kickoff-prompt 必须同时提供且不能为空。' };
83
+ }
84
+ const matches = botInfo.filter(info => info.botOpenId?.trim() === botOpenId);
85
+ if (matches.length === 0) {
86
+ return { ok: false, error: `--kickoff-bot 未匹配到本机 bot: ${botOpenId}` };
87
+ }
88
+ if (matches.length > 1) {
89
+ return { ok: false, error: `--kickoff-bot 匹配到多个本机 bot,请检查 bots-info.json: ${botOpenId}` };
90
+ }
91
+ const targetLarkAppId = matches[0].larkAppId;
92
+ if (!selectedLarkAppIds.includes(targetLarkAppId)) {
93
+ return { ok: false, error: '--kickoff-bot 必须属于本次 --bot 列表。' };
94
+ }
95
+ if (targetLarkAppId === selectedLarkAppIds[0]) {
96
+ return { ok: false, error: '--kickoff-bot 不能是 creator(第一个 --bot)。' };
97
+ }
98
+ return { ok: true, targetLarkAppId, prompt };
99
+ }
70
100
  //# sourceMappingURL=create-group-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-group-resolver.js","sourceRoot":"","sources":["../../src/cli/create-group-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqBH,MAAM,UAAU,cAAc,CAC5B,IAAc,EACd,UAAiC,EACjC,OAA4B;IAE5B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,YAAgC,CAAC;QACrC,IAAI,cAAkC,CAAC;QAEvC,qBAAqB;QACrB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;QAC9D,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,0EAA0E;YAC1E,8DAA8D;YAC9D,oEAAoE;YACpE,kCAAkC;YAClC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAC9E,CAAC;YACF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACxE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,cAAc,GAAG,YAAY,OAAO,GAAG,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,oEAAoE;gBACpE,4DAA4D;gBAC5D,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;gBAC3E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;wBAAE,cAAc,GAAG,UAAU,OAAO,GAAG,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;YAAE,SAAS;QACrC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEvB,IAAI,cAAc,EAAE,CAAC;YACnB,iBAAiB,CAAC,IAAI,CACpB,GAAG,cAAc,uDAAuD,YAAY,IAAI,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"create-group-resolver.js","sourceRoot":"","sources":["../../src/cli/create-group-resolver.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAu+EA,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AA0lKrF;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8F7B"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAu+EA,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAonKrF;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8F7B"}
package/dist/cli.js CHANGED
@@ -7113,6 +7113,7 @@ botmux create-group — 用一组机器人新建飞书群
7113
7113
  用法:
7114
7114
  botmux create-group --bot <name|larkAppId> [--bot ...] [--name "群名"]
7115
7115
  [--working-dir <path>]
7116
+ [--kickoff-bot <open_id> --kickoff-prompt "文本"]
7116
7117
 
7117
7118
  参数:
7118
7119
  --bot <ref> 至少一个,可多次。ref 推荐用 bot 显示名(同 botmux send 的 @<name>)或完整 larkAppId;
@@ -7123,6 +7124,10 @@ botmux create-group — 用一组机器人新建飞书群
7123
7124
  --working-dir <path>
7124
7125
  可选;创建成功后,把新群为所有成功入群的 bot 绑定到该目录(等价于逐个 /oncall bind),
7125
7126
  下次在群里开新话题时直接使用该目录,跳过仓库选择卡片。也可写作 --cwd / --dir。
7127
+ --kickoff-bot <open_id> 可选;建群成功后由 creator @ 该 bot 并发送 --kickoff-prompt,
7128
+ 触发该 bot 自动开始工作(如 PR review)。需配合 --kickoff-prompt 使用。
7129
+ 该 bot 必须已在 --bot 列表中(即已是群成员)。
7130
+ --kickoff-prompt "文本" 可选;与 --kickoff-bot 配合使用,@ bot 后发送的 prompt 文本。
7126
7131
 
7127
7132
  行为:
7128
7133
  - 第一个解析到的 bot 作为 creator(决定建群身份 + 初始群主 + open_id app scope)。
@@ -7130,6 +7135,8 @@ botmux create-group — 用一组机器人新建飞书群
7130
7135
  转不出来或为空则跳过对应步骤,stderr warning)。
7131
7136
  - 不依赖 botmux 会话,任何环境都能跑。
7132
7137
  - --working-dir 会先校验路径存在且是目录;绑定失败不会重复建群,会在 stderr 给出逐 bot 结果。
7138
+ - --kickoff-bot/--kickoff-prompt:creator 建群后 @ 指定 bot 并发 prompt;该 bot 收到 @ 会自动起会话。
7139
+ 注意:creator 不能 @ 自己(自消息被忽略),故 --kickoff-bot 应选 creator 之外的 bot。
7133
7140
 
7134
7141
  输出协议(skill 友好):
7135
7142
  - 成功(即使 transfer/notify 部分失败):stdout 单行 chatId,exit 0;stderr 打人类提示 + applink。
@@ -7141,6 +7148,8 @@ botmux create-group — 用一组机器人新建飞书群
7141
7148
  const botRefs = argValues(rest, '--bot');
7142
7149
  const name = argValue(rest, '--name');
7143
7150
  const workingDirArg = argValue(rest, '--working-dir', '--cwd', '--dir');
7151
+ const kickoffBot = argValue(rest, '--kickoff-bot');
7152
+ const kickoffPrompt = argValue(rest, '--kickoff-prompt');
7144
7153
  let bindWorkingDir;
7145
7154
  let bindWorkingDirResolved;
7146
7155
  if (workingDirArg !== undefined) {
@@ -7182,7 +7191,7 @@ botmux create-group — 用一组机器人新建飞书群
7182
7191
  botInfoEntries = JSON.parse(readFileSync(botInfoPath, 'utf-8'));
7183
7192
  }
7184
7193
  catch { /* */ }
7185
- const { resolveBotRefs } = await import('./cli/create-group-resolver.js');
7194
+ const { resolveBotRefs, resolveKickoff } = await import('./cli/create-group-resolver.js');
7186
7195
  const resolved = resolveBotRefs(botRefs, botConfigs, botInfoEntries.map(b => ({ larkAppId: b.larkAppId, botName: b.botName })));
7187
7196
  for (const w of resolved.ambiguousWarnings)
7188
7197
  console.error(`⚠️ ${w}`);
@@ -7200,6 +7209,11 @@ botmux create-group — 用一组机器人新建飞书群
7200
7209
  process.exit(1);
7201
7210
  }
7202
7211
  const creatorLarkAppId = resolved.larkAppIds[0];
7212
+ const kickoff = resolveKickoff(kickoffBot, kickoffPrompt, resolved.larkAppIds, botInfoEntries.map(b => ({ larkAppId: b.larkAppId, botOpenId: b.botOpenId })));
7213
+ if (!kickoff.ok) {
7214
+ console.error(kickoff.error);
7215
+ process.exit(1);
7216
+ }
7203
7217
  // Register bots so getBotClient works inside service
7204
7218
  const fullConfigs = loadBotConfigs();
7205
7219
  const needed = new Set(resolved.larkAppIds);
@@ -7239,6 +7253,8 @@ botmux create-group — 用一组机器人新建飞书群
7239
7253
  transferOwnerTo: targetOpenId,
7240
7254
  notifyOwnerOpenId: targetOpenId,
7241
7255
  bindWorkingDir,
7256
+ kickoffBotLarkAppId: kickoff.targetLarkAppId,
7257
+ kickoffPrompt: kickoff.prompt,
7242
7258
  });
7243
7259
  }
7244
7260
  catch (err) {
@@ -7269,6 +7285,12 @@ botmux create-group — 用一组机器人新建飞书群
7269
7285
  else if (result.notifyMessageId) {
7270
7286
  console.error(`✅ @通知已发送 (msg ${result.notifyMessageId})`);
7271
7287
  }
7288
+ if (result.kickoffError) {
7289
+ console.error(`⚠️ kickoff 消息发送失败: ${result.kickoffError}`);
7290
+ }
7291
+ else if (result.kickoffMessageId) {
7292
+ console.error(`✅ kickoff 消息已发送 (msg ${result.kickoffMessageId})`);
7293
+ }
7272
7294
  if (bindWorkingDir) {
7273
7295
  const ok = result.oncallBindings.filter(b => b.ok).length;
7274
7296
  const failed = result.oncallBindings.filter(b => !b.ok);