larkcc 0.4.0 → 0.6.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 (56) hide show
  1. package/CHANGELOG.md +61 -12
  2. package/README.md +188 -27
  3. package/dist/agent.d.ts +2 -1
  4. package/dist/agent.js +189 -38
  5. package/dist/agent.js.map +1 -1
  6. package/dist/app.js +14 -5
  7. package/dist/app.js.map +1 -1
  8. package/dist/cardkit.d.ts +125 -0
  9. package/dist/cardkit.js +448 -0
  10. package/dist/cardkit.js.map +1 -0
  11. package/dist/config.d.ts +23 -3
  12. package/dist/config.js +43 -47
  13. package/dist/config.js.map +1 -1
  14. package/dist/feishu.d.ts +50 -4
  15. package/dist/feishu.js +287 -97
  16. package/dist/feishu.js.map +1 -1
  17. package/dist/format/builder.d.ts +126 -37
  18. package/dist/format/builder.js +276 -116
  19. package/dist/format/builder.js.map +1 -1
  20. package/dist/format/card-optimize.d.ts +42 -0
  21. package/dist/format/card-optimize.js +74 -0
  22. package/dist/format/card-optimize.js.map +1 -0
  23. package/dist/format/constants.d.ts +80 -9
  24. package/dist/format/constants.js +140 -53
  25. package/dist/format/constants.js.map +1 -1
  26. package/dist/format/document.d.ts +4 -2
  27. package/dist/format/document.js +57 -35
  28. package/dist/format/document.js.map +1 -1
  29. package/dist/format/duration.d.ts +24 -0
  30. package/dist/format/duration.js +72 -0
  31. package/dist/format/duration.js.map +1 -0
  32. package/dist/format/guide.d.ts +19 -0
  33. package/dist/format/guide.js +201 -0
  34. package/dist/format/guide.js.map +1 -0
  35. package/dist/format/image-resolver.d.ts +31 -0
  36. package/dist/format/image-resolver.js +202 -0
  37. package/dist/format/image-resolver.js.map +1 -0
  38. package/dist/format/index.d.ts +8 -3
  39. package/dist/format/index.js +8 -2
  40. package/dist/format/index.js.map +1 -1
  41. package/dist/format/parser.d.ts +16 -0
  42. package/dist/format/parser.js +26 -12
  43. package/dist/format/parser.js.map +1 -1
  44. package/dist/format/sanitize.d.ts +3 -0
  45. package/dist/format/sanitize.js +16 -7
  46. package/dist/format/sanitize.js.map +1 -1
  47. package/dist/format/thinking.d.ts +29 -0
  48. package/dist/format/thinking.js +50 -0
  49. package/dist/format/thinking.js.map +1 -0
  50. package/dist/resources/format-guide.md +109 -0
  51. package/dist/streaming.d.ts +83 -0
  52. package/dist/streaming.js +301 -0
  53. package/dist/streaming.js.map +1 -0
  54. package/dist/version.d.ts +1 -1
  55. package/dist/version.js +1 -1
  56. package/package.json +5 -4
@@ -0,0 +1,109 @@
1
+ # 飞书格式规范
2
+
3
+ 你的回复会通过飞书展示。短内容显示为交互式卡片,长内容写入飞书云文档。
4
+ 两者对 Markdown 的支持不同,请严格遵守以下规范。
5
+
6
+ ## 一、通用规则(卡片和文档都适用)
7
+
8
+ ### 代码块
9
+ - 必须标注语言:```typescript、```python、```bash 等
10
+ - 不要使用无语言标记的代码块(```)
11
+ - 不要在代码块外使用 | 开头的文字(会被误识别为表格)
12
+
13
+ ### 图片
14
+ - 不要使用外部图片链接 ![alt](https://...)
15
+ - 飞书只支持 img_xxx 格式的内部图片 key
16
+
17
+ ### 段落
18
+ - 段落之间用空行分隔
19
+ - 不要用 <br> 或 HTML 标签控制换行
20
+
21
+ ### 列表
22
+ - 嵌套不要超过 2 级
23
+ - 嵌套缩进统一用 2 个空格
24
+
25
+ ### 不要使用
26
+ - HTML 标签(除了表格合并 <td colspan="2">,仅文档模式可用)
27
+ - 脚注 [^1]
28
+ - 折叠 <details>
29
+ - 任务列表外的复选框语法
30
+
31
+ ## 二、卡片规则(短内容,显示为交互式卡片)
32
+
33
+ 飞书卡片 Markdown 只支持有限的格式子集:
34
+
35
+ ### 标题
36
+ - 只用 #### (H4) 和 ##### (H5)
37
+ - 不要使用 # ## ###(不会渲染为标题)
38
+
39
+ ### 表格
40
+ - 列数不超过 5 列
41
+ - 不要使用 colspan/rowspan 合并(卡片不支持 HTML)
42
+ - 单元格内容尽量简短
43
+
44
+ ### 不支持(不要在卡片内容中使用)
45
+ - > [!TYPE] Callout 语法
46
+ - $$ 数学公式
47
+ - 嵌套列表
48
+ - 删除线 ~~text~~
49
+
50
+ ### 建议
51
+ - 代码块标注语言
52
+ - 使用 **粗体** 和 *斜体* 强调重点
53
+ - 使用 > 引用块
54
+ - 使用 --- 分割线
55
+
56
+ ## 三、文档规则(长内容,写入飞书云文档)
57
+
58
+ 飞书文档支持更丰富的格式:
59
+
60
+ ### Callout 高亮块
61
+ 使用 > [!TYPE] 语法,支持的类型和推荐 emoji:
62
+
63
+ | 类型 | 推荐 emoji | 用途 |
64
+ |------|-----------|------|
65
+ | > [!NOTE] | 💡 | 提示信息 |
66
+ | > [!TIP] | ✅ | 实用建议 |
67
+ | > [!WARNING] | ⚠️ | 注意事项 |
68
+ | > [!DANGER] | 🔴 | 危险操作 |
69
+ | > [!CAUTION] | 🟡 | 谨慎操作 |
70
+ | > [!INFO] | ℹ️ | 补充信息 |
71
+
72
+ 示例:
73
+ > [!TIP] ✅
74
+ > 使用 async/await 可以避免回调地狱。
75
+
76
+ 注意:
77
+ - Callout 中不要嵌套列表或表格(渲染会失败)
78
+ - 每条内容单独一行,用 > 开头
79
+
80
+ ### 表格
81
+ - 列数建议不超过 6 列
82
+ - 单元格内容不超过 200 个字符
83
+ - 可以使用 <td colspan="N"> 合并列
84
+ - 不要在同一表格中混用合并单元格和普通单元格
85
+ - 表头和分隔符是必需的
86
+
87
+ ### 数学公式
88
+ - 块级公式用 $$...$$
89
+ - 行内公式用 $...$
90
+ - 不要使用 \\ 多行对齐(飞书不支持)
91
+ - 不要使用 \begin{}...\end{} 环境
92
+
93
+ ### 代码块
94
+ - 必须标注语言(飞书会根据语言做语法高亮)
95
+ - 支持的语言:typescript, javascript, python, java, go, rust, bash, sql, json, yaml, xml, html, css, markdown, c, cpp, csharp, ruby, php, swift, kotlin, dart, r, matlab, scala, lua, perl, haskell, elixir, clojure, shell, powershell, dockerfile, makefile, toml, ini, diff, plaintext
96
+
97
+ ### 标题
98
+ - 使用 H1-H6 完整层级
99
+ - 文档会保留原始标题级别
100
+
101
+ ## 四、反面教材(这些会导致渲染失败或格式异常)
102
+
103
+ ❌ 代码块外使用 | 开头 → 被误识别为表格
104
+ ❌ Callout 中嵌套列表 → 渲染失败
105
+ ❌ 数学公式使用多行对齐 → 公式显示异常
106
+ ❌ 表格单元格内容超长 → 表格溢出文档宽度
107
+ ❌ 超过 3 级的列表嵌套 → 只显示为 2 级
108
+ ❌ 空的代码块(无语言标记且无内容)→ 创建失败
109
+ ❌ 在段落之间不空行 → 段落粘连显示为一坨文字
@@ -0,0 +1,83 @@
1
+ /**
2
+ * 流式卡片模块(Update 模式)
3
+ *
4
+ * 使用飞书消息 message.patch API 模拟流式输出。
5
+ * CardKit 模式已迁移至 cardkit.ts,采用单卡片架构。
6
+ *
7
+ * - update: message.patch 模拟流式(无需额外权限)
8
+ * - none: 禁用流式
9
+ */
10
+ import * as lark from "@larksuiteoapi/node-sdk";
11
+ import type { StreamingConfig } from "./config.js";
12
+ import type { ReplyContext } from "./feishu.js";
13
+ export interface FlushControllerOptions {
14
+ /** 最小刷新间隔(毫秒) */
15
+ minIntervalMs: number;
16
+ /** 刷新回调,接收完整 buffer 内容 */
17
+ onFlush: (content: string) => Promise<void>;
18
+ /** 刷新失败回调 */
19
+ onError?: (error: unknown) => void;
20
+ }
21
+ /**
22
+ * 刷新控制器
23
+ *
24
+ * 核心机制:
25
+ * - 互斥锁防止并发刷新
26
+ * - setTimeout 替代 setInterval(上次完成后才调度下次)
27
+ * - 自适应延迟:delay = max(0, minInterval - elapsed)
28
+ * - 长间隔检测:2s 无新内容 → 强制刷新剩余
29
+ *
30
+ * 生命周期:start() → [append() → doFlush()]* → stop()
31
+ */
32
+ export declare class FlushController {
33
+ private minIntervalMs;
34
+ private onFlush;
35
+ private onError?;
36
+ private buffer;
37
+ private sentLength;
38
+ private flushing;
39
+ private stopped;
40
+ private lastFlushTime;
41
+ private lastAppendTime;
42
+ private flushTimer;
43
+ private gapCheckTimer;
44
+ constructor(options: FlushControllerOptions);
45
+ /** 追加内容到 buffer */
46
+ append(text: string): void;
47
+ /** 启动长间隔检测 */
48
+ start(): void;
49
+ /** 停止所有定时器。调用后 append() 不再生效,调用方负责刷新剩余 buffer 内容 */
50
+ stop(): void;
51
+ /** 强制刷新(即使 buffer 为空,用于工具状态变更等场景) */
52
+ flush(): Promise<void>;
53
+ /** 获取当前 buffer 内容 */
54
+ getBuffer(): string;
55
+ private scheduleFlush;
56
+ private doFlush;
57
+ private checkLongGap;
58
+ }
59
+ export interface CompleteOptions {
60
+ /** 底部元数据(耗时、token 等) */
61
+ metadata?: string;
62
+ /** 思考内容,显示在可折叠区域 */
63
+ thinking?: string;
64
+ /** 思考耗时(毫秒) */
65
+ reasoningElapsedMs?: number;
66
+ /** 卡片标题 */
67
+ cardTitle?: string;
68
+ }
69
+ export interface IStreamingCard {
70
+ append(text: string): Promise<void>;
71
+ complete(finalContent: string, options?: CompleteOptions): Promise<void>;
72
+ abort(options?: {
73
+ content?: string;
74
+ thinking?: string;
75
+ reasoningElapsedMs?: number;
76
+ }): Promise<void>;
77
+ isDisabled(): boolean;
78
+ }
79
+ /**
80
+ * 创建 Update 模式流式卡片
81
+ * CardKit 模式请使用 cardkit.ts 中的 CardKitController
82
+ */
83
+ export declare function createStreamingCard(config: StreamingConfig | undefined, client: lark.Client, rootMsgId: string, context: ReplyContext, cardTitle?: string): IStreamingCard | null;
@@ -0,0 +1,301 @@
1
+ /**
2
+ * 流式卡片模块(Update 模式)
3
+ *
4
+ * 使用飞书消息 message.patch API 模拟流式输出。
5
+ * CardKit 模式已迁移至 cardkit.ts,采用单卡片架构。
6
+ *
7
+ * - update: message.patch 模拟流式(无需额外权限)
8
+ * - none: 禁用流式
9
+ */
10
+ import { optimizeForCard } from "./format/card-optimize.js";
11
+ import { parseThinking, stripThinking } from "./format/thinking.js";
12
+ import { replyFinalCard, buildMarkdownCard } from "./feishu.js";
13
+ // ── FlushController:互斥守卫 + 自适应节流 + 长间隔批处理 ───────────
14
+ const LONG_GAP_MS = 2000; // 2 秒无新内容,强制刷新
15
+ const GAP_CHECK_INTERVAL = 500; // 每 500ms 检查一次长间隔
16
+ const TRUNCATE_LIMIT = 4000;
17
+ /**
18
+ * 刷新控制器
19
+ *
20
+ * 核心机制:
21
+ * - 互斥锁防止并发刷新
22
+ * - setTimeout 替代 setInterval(上次完成后才调度下次)
23
+ * - 自适应延迟:delay = max(0, minInterval - elapsed)
24
+ * - 长间隔检测:2s 无新内容 → 强制刷新剩余
25
+ *
26
+ * 生命周期:start() → [append() → doFlush()]* → stop()
27
+ */
28
+ export class FlushController {
29
+ minIntervalMs;
30
+ onFlush;
31
+ onError;
32
+ buffer = "";
33
+ sentLength = 0;
34
+ flushing = false; // 互斥锁
35
+ stopped = false;
36
+ lastFlushTime = 0;
37
+ lastAppendTime = 0;
38
+ flushTimer = null;
39
+ gapCheckTimer = null;
40
+ constructor(options) {
41
+ this.minIntervalMs = options.minIntervalMs;
42
+ this.onFlush = options.onFlush;
43
+ this.onError = options.onError;
44
+ }
45
+ /** 追加内容到 buffer */
46
+ append(text) {
47
+ if (this.stopped)
48
+ return;
49
+ this.buffer += text;
50
+ this.lastAppendTime = Date.now();
51
+ this.scheduleFlush();
52
+ }
53
+ /** 启动长间隔检测 */
54
+ start() {
55
+ this.lastAppendTime = Date.now();
56
+ this.lastFlushTime = Date.now();
57
+ this.gapCheckTimer = setInterval(() => this.checkLongGap(), GAP_CHECK_INTERVAL);
58
+ }
59
+ /** 停止所有定时器。调用后 append() 不再生效,调用方负责刷新剩余 buffer 内容 */
60
+ stop() {
61
+ this.stopped = true;
62
+ if (this.flushTimer) {
63
+ clearTimeout(this.flushTimer);
64
+ this.flushTimer = null;
65
+ }
66
+ if (this.gapCheckTimer) {
67
+ clearInterval(this.gapCheckTimer);
68
+ this.gapCheckTimer = null;
69
+ }
70
+ }
71
+ /** 强制刷新(即使 buffer 为空,用于工具状态变更等场景) */
72
+ async flush() {
73
+ await this.doFlush(true);
74
+ }
75
+ /** 获取当前 buffer 内容 */
76
+ getBuffer() {
77
+ return this.buffer;
78
+ }
79
+ scheduleFlush() {
80
+ if (this.flushTimer || this.stopped)
81
+ return;
82
+ const elapsed = Date.now() - this.lastFlushTime;
83
+ const delay = Math.max(0, this.minIntervalMs - elapsed);
84
+ this.flushTimer = setTimeout(() => {
85
+ this.flushTimer = null;
86
+ void this.doFlush(false);
87
+ }, delay);
88
+ }
89
+ async doFlush(force) {
90
+ if (this.flushing || this.stopped)
91
+ return;
92
+ if (!force && this.buffer.length <= this.sentLength)
93
+ return;
94
+ this.flushing = true;
95
+ try {
96
+ await this.onFlush(this.buffer);
97
+ if (!force)
98
+ this.sentLength = this.buffer.length;
99
+ this.lastFlushTime = Date.now();
100
+ }
101
+ catch (error) {
102
+ if (this.onError) {
103
+ this.onError(error);
104
+ }
105
+ this.stop();
106
+ return;
107
+ }
108
+ finally {
109
+ this.flushing = false;
110
+ }
111
+ // 刷新期间可能有新内容到达,继续调度
112
+ if (!this.stopped && this.buffer.length > this.sentLength) {
113
+ this.scheduleFlush();
114
+ }
115
+ }
116
+ checkLongGap() {
117
+ if (this.stopped || this.flushing)
118
+ return;
119
+ if (Date.now() - this.lastAppendTime > LONG_GAP_MS) {
120
+ if (this.buffer.length > this.sentLength) {
121
+ void this.doFlush(false);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ // ── Update 模式(message.patch) ───────────────────────────────────
127
+ class UpdateStreamingCard {
128
+ client;
129
+ rootMsgId;
130
+ fallbackOnError;
131
+ thinkingEnabled;
132
+ context;
133
+ cardTitle;
134
+ msgId = null;
135
+ _disabled = false;
136
+ _started = false;
137
+ flushCtrl;
138
+ constructor(client, rootMsgId, intervalMs, fallbackOnError, thinkingEnabled, context, cardTitle) {
139
+ this.client = client;
140
+ this.rootMsgId = rootMsgId;
141
+ this.fallbackOnError = fallbackOnError;
142
+ this.thinkingEnabled = thinkingEnabled;
143
+ this.context = context;
144
+ this.cardTitle = cardTitle;
145
+ this.flushCtrl = new FlushController({
146
+ minIntervalMs: intervalMs,
147
+ onFlush: (content) => this.performFlush(content),
148
+ onError: (error) => {
149
+ console.error("[STREAM] Flush failed:", error);
150
+ if (this.fallbackOnError) {
151
+ console.error("[STREAM] Disabling streaming, will fallback to final send");
152
+ this._disabled = true;
153
+ }
154
+ },
155
+ });
156
+ }
157
+ async ensureStarted() {
158
+ if (this._disabled)
159
+ return;
160
+ if (this._started)
161
+ return;
162
+ try {
163
+ const card = {
164
+ schema: "2.0",
165
+ config: { wide_screen_mode: true },
166
+ body: { elements: [{ tag: "markdown", content: "⏳ 思考中..." }] },
167
+ };
168
+ if (this.cardTitle) {
169
+ card.header = {
170
+ title: { tag: "plain_text", content: this.cardTitle },
171
+ template: "blue",
172
+ };
173
+ }
174
+ const res = await this.client.im.message.reply({
175
+ path: { message_id: this.rootMsgId },
176
+ data: {
177
+ content: JSON.stringify(card),
178
+ msg_type: "interactive",
179
+ reply_in_thread: false,
180
+ },
181
+ });
182
+ this.msgId = res.data?.message_id ?? null;
183
+ if (this.msgId) {
184
+ this.flushCtrl.start();
185
+ this._started = true;
186
+ }
187
+ else {
188
+ console.error("[STREAM] Failed to get message_id from initial card");
189
+ this._disabled = true;
190
+ }
191
+ }
192
+ catch (error) {
193
+ console.error("[STREAM] Failed to start streaming card:", error);
194
+ this._disabled = true;
195
+ }
196
+ }
197
+ async append(text) {
198
+ await this.ensureStarted();
199
+ if (this._disabled)
200
+ return;
201
+ this.flushCtrl.append(text);
202
+ }
203
+ async performFlush(content) {
204
+ if (this._disabled || !this.msgId)
205
+ return;
206
+ let displayContent = content;
207
+ let cardOptions;
208
+ if (this.thinkingEnabled) {
209
+ const parsed = parseThinking(content);
210
+ displayContent = parsed.content;
211
+ if (parsed.isThinking && !parsed.content) {
212
+ cardOptions = { thinkingInProgress: true };
213
+ displayContent = "💭 思考中...";
214
+ }
215
+ else if (parsed.isThinking) {
216
+ cardOptions = { thinkingInProgress: true };
217
+ }
218
+ else if (parsed.thinking) {
219
+ cardOptions = { thinking: parsed.thinking };
220
+ }
221
+ }
222
+ else {
223
+ displayContent = stripThinking(content);
224
+ }
225
+ if (!displayContent.trim())
226
+ return;
227
+ const optimized = optimizeForCard(displayContent);
228
+ const truncated = optimized.length > TRUNCATE_LIMIT ? optimized.slice(0, TRUNCATE_LIMIT) + "\n\n..." : optimized;
229
+ const card = buildMarkdownCard(truncated, [], { ...cardOptions, cardTitle: this.cardTitle });
230
+ await this.client.im.message.patch({
231
+ path: { message_id: this.msgId },
232
+ data: { content: JSON.stringify(card) },
233
+ });
234
+ }
235
+ async complete(finalContent, options) {
236
+ this.flushCtrl.stop();
237
+ if (this._disabled || !this.msgId) {
238
+ await replyFinalCard(this.client, this.context.chatId, this.rootMsgId, finalContent, this.context, options);
239
+ return;
240
+ }
241
+ let content = finalContent;
242
+ if (options?.metadata) {
243
+ content += `\n\n---\n${options.metadata}`;
244
+ }
245
+ const optimized = optimizeForCard(content);
246
+ const cardOptions = {
247
+ thinking: options?.thinking,
248
+ cardTitle: this.cardTitle,
249
+ };
250
+ try {
251
+ const card = buildMarkdownCard(optimized, [], cardOptions);
252
+ await this.client.im.message.patch({
253
+ path: { message_id: this.msgId },
254
+ data: { content: JSON.stringify(card) },
255
+ });
256
+ }
257
+ catch (error) {
258
+ console.error("[STREAM] Final patch failed, sending as new message:", error);
259
+ await replyFinalCard(this.client, this.context.chatId, this.rootMsgId, finalContent, this.context, options);
260
+ }
261
+ }
262
+ async abort(options) {
263
+ this.flushCtrl.stop();
264
+ if (this._disabled || !this.msgId)
265
+ return;
266
+ const text = options?.content || "⏹ 任务已中断";
267
+ const optimized = optimizeForCard(text);
268
+ try {
269
+ const card = buildMarkdownCard(optimized, [], {
270
+ cardTitle: this.cardTitle,
271
+ thinking: options?.thinking,
272
+ reasoningElapsedMs: options?.reasoningElapsedMs,
273
+ });
274
+ await this.client.im.message.patch({
275
+ path: { message_id: this.msgId },
276
+ data: { content: JSON.stringify(card) },
277
+ });
278
+ }
279
+ catch (error) {
280
+ console.error("[STREAM] Abort patch failed:", error);
281
+ }
282
+ }
283
+ isDisabled() {
284
+ return this._disabled;
285
+ }
286
+ }
287
+ // ── 工厂函数 ─────────────────────────────────────────────────────
288
+ /**
289
+ * 创建 Update 模式流式卡片
290
+ * CardKit 模式请使用 cardkit.ts 中的 CardKitController
291
+ */
292
+ export function createStreamingCard(config, client, rootMsgId, context, cardTitle) {
293
+ if (!config?.enabled || config.mode === "none" || config.mode === "cardkit") {
294
+ return null;
295
+ }
296
+ const intervalMs = config.flush_interval_ms || 300;
297
+ const fallbackOnError = config.fallback_on_error !== false;
298
+ const thinkingEnabled = config.thinking_enabled === true;
299
+ return new UpdateStreamingCard(client, rootMsgId, intervalMs, fallbackOnError, thinkingEnabled, context, cardTitle ?? "");
300
+ }
301
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "0.4.0";
1
+ export declare const VERSION = "0.6.0";
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // 自动生成,请勿手动修改
2
2
  // 由 scripts/generate-version.js 从 package.json 生成
3
- export const VERSION = "0.4.0";
3
+ export const VERSION = "0.6.0";
4
4
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkcc",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Claude Code in Feishu/Lark - AI coding assistant bot",
5
5
  "author": "sujie <13156660820@163.com>",
6
6
  "license": "MIT",
@@ -40,12 +40,13 @@
40
40
  "scripts": {
41
41
  "prebuild": "node scripts/generate-version.js",
42
42
  "dev": "tsx watch src/index.ts",
43
- "build": "tsc && mkdir -p dist/commands && cp src/commands/default-prompts.yml dist/commands/",
44
- "start": "node dist/index.js"
43
+ "build": "tsc && mkdir -p dist/commands dist/resources && cp src/commands/default-prompts.yml dist/commands/ && cp resources/format-guide.md dist/resources/",
44
+ "start": "node dist/index.js",
45
+ "prepublishOnly": "pnpm build"
45
46
  },
46
47
  "dependencies": {
47
48
  "@anthropic-ai/claude-agent-sdk": "latest",
48
- "@larksuiteoapi/node-sdk": "^1",
49
+ "@larksuiteoapi/node-sdk": "^1.60",
49
50
  "chalk": "^5",
50
51
  "commander": "^12",
51
52
  "js-yaml": "^4",