@lih-x-x/kmr 1.0.70 → 1.0.71

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/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  - **会议纪要提取**:发送飞书云文档链接给机器人,自动提取会议摘要、待办事项、风险项、关键共识、可复用知识
8
8
  - **任务闭环**:提取待办后自动发送确认消息,回复 `/confirm` 创建飞书任务,`/reject` 取消,3 分钟超时自动取消。自动通过群成员列表解析负责人并指派任务,同步回写会议记录
9
+ - **飞书任务系统集成**:`kmr create-task` 直接创建任务(含截止日期、负责人、描述),`kmr update-task` 更新任务标题/截止日期/负责人,`kmr task` 查看所有任务状态,变更同步回写本地会议记录
10
+ - **每日任务摘要推送**:每天 9:30 向管理员推送未完成和已完成任务摘要,错过时下次启动补推;每小时自动同步飞书任务完成状态
9
11
  - **本地 AI · 零成本接入**:基于 [acpx](https://www.npmjs.com/package/acpx) 复用本地 Claude / Codex,接入飞书机器人实现私有化部署,数据不出本机,无额外 API 费用
10
12
  - **历史信息搜索**:会议记录和任务均可通过 AI 对话查询;`/find` 指令与自然语言双支持,返回最相关的 3 条结果
11
13
  - **指令 / 自然语言双支持**:`/list`、`/show`、`/del`、`/find`、`/task` 等精确指令,与自由对话文本均可使用,AI 理解意图自动路由到对应操作
@@ -13,7 +15,7 @@
13
15
  - **独立任务创建**:通过 `kmr create-task` 命令(或 AI 对话)直接创建飞书任务,支持关联到指定会议记录(`--meeting <id>`),无关联时存入独立任务记录
14
16
  - **首次启动自动引导**:无配置文件时自动初始化并打开 Web 设置页引导填写飞书凭证,配置完成后自动继续启动,无需手动 `kmr init`
15
17
  - **记录管理**:`/list` 列出所有记录,`/show <id>` 查看详情,`/del <id>` 删除记录,`/task` 查看所有任务
16
- - **CLI 命令**:`kmr list`、`kmr show`、`kmr task`、`kmr del`、`kmr find` 等子命令可在终端直接操作,无需启动服务
18
+ - **CLI 命令**:`kmr list`、`kmr show`、`kmr task`、`kmr del`、`kmr find`、`kmr create-task`、`kmr update-task` 等子命令可在终端直接操作,无需启动服务
17
19
  - **群聊智能识别**:群聊中非 @消息仅自动识别会议纪要文档链接(通过文档标题判断),其他操作需 @机器人
18
20
  - **管理员通知**:配置 `adminOpenId` 后,服务启动和停止时自动向管理员推送通知,每天 9:30 推送任务摘要(错过则启动时补推)
19
21
  - **版本更新检查**:启动时自动检测 npm 新版本并提示更新
@@ -162,8 +164,9 @@ kmr list # 列出所有会议记录
162
164
  kmr show <id> # 查看记录详情(JSON)
163
165
  kmr task # 查看所有任务状态
164
166
  kmr del <id> # 删除记录
165
- kmr find <query> # 搜索会议记录
167
+ kmr find <query> # AI 搜索会议记录
166
168
  kmr create-task <标题> [--due YYYY-MM-DD] [--assignee 姓名] [--desc 描述] [--meeting <id>] # 创建飞书任务
169
+ kmr update-task <taskId> [--summary 新标题] [--due YYYY-MM-DD] [--assignee 姓名] # 更新飞书任务
167
170
  ```
168
171
 
169
172
  ### 直接创建飞书任务
package/dist/cli.js CHANGED
@@ -6,9 +6,9 @@ async function checkUpdate() {
6
6
  try {
7
7
  const res = await fetch(`https://registry.npmjs.org/${"@lih-x-x/kmr"}/latest`, { signal: AbortSignal.timeout(3e3) });
8
8
  const data = await res.json();
9
- if (data.version && data.version !== "1.0.70") {
9
+ if (data.version && data.version !== "1.0.71") {
10
10
  console.log(`
11
- \u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.70"} \u2192 ${data.version}`);
11
+ \u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.71"} \u2192 ${data.version}`);
12
12
  console.log(` \u8FD0\u884C npm install -g ${"@lih-x-x/kmr"} \u66F4\u65B0
13
13
  `);
14
14
  }
@@ -56,7 +56,7 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
56
56
  kmr --help \u663E\u793A\u5E2E\u52A9
57
57
  `);
58
58
  } else if (command === "--version" || command === "-v") {
59
- console.log("1.0.70");
59
+ console.log("1.0.71");
60
60
  } else if (command === "list") {
61
61
  const { loadConfig } = await import("./config-WIQGW5OC.js");
62
62
  const { JsonStore } = await import("./jsonStore-I6ATOECA.js");
@@ -336,16 +336,24 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
336
336
  } else {
337
337
  checkUpdate();
338
338
  console.log(`
339
- KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
340
-
341
- \u53EF\u7528\u547D\u4EE4:
342
- kmr list \u5217\u51FA\u6240\u6709\u4F1A\u8BAE\u8BB0\u5F55
343
- kmr show <id> \u67E5\u770B\u8BB0\u5F55\u8BE6\u60C5
344
- kmr task \u67E5\u770B\u6240\u6709\u4EFB\u52A1
345
- kmr del <id> \u5220\u9664\u8BB0\u5F55
346
- kmr find <q> \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55
347
- kmr create-task <\u6807\u9898> [--due DATE] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] \u521B\u5EFA\u4EFB\u52A1
348
- kmr --help \u663E\u793A\u5B8C\u6574\u5E2E\u52A9
339
+ \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557
340
+ \u2588\u2588\u2551 \u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
341
+ \u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D
342
+ \u2588\u2588\u2554\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
343
+ \u2588\u2588\u2551 \u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551
344
+ \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D
349
345
  `);
346
+ console.log(" Key Meetings Record \u2014 \u4F1A\u8BAE\u6316\u6398\u673A\n");
347
+ console.log(" \u2726 \u81EA\u52A8\u63D0\u53D6\u4F1A\u8BAE\u7EAA\u8981\u5173\u952E\u4FE1\u606F");
348
+ console.log(" \u2726 \u98DE\u4E66\u4EFB\u52A1\u7CFB\u7EDF\u96C6\u6210\uFF08\u521B\u5EFA / \u8FFD\u8E2A / \u6BCF\u65E5\u6458\u8981\uFF09");
349
+ console.log(" \u2726 AI \u667A\u80FD\u641C\u7D22\u4E0E\u81EA\u7531\u5BF9\u8BDD");
350
+ console.log(" \u2726 Web \u7BA1\u7406\u754C\u9762 + \u591A Agent \u652F\u6301\n");
351
+ console.log(" kmr list \u5217\u51FA\u6240\u6709\u4F1A\u8BAE\u8BB0\u5F55");
352
+ console.log(" kmr show <id> \u67E5\u770B\u8BB0\u5F55\u8BE6\u60C5");
353
+ console.log(" kmr task \u67E5\u770B\u6240\u6709\u4EFB\u52A1");
354
+ console.log(" kmr find <q> AI \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55");
355
+ console.log(" kmr create-task <\u6807\u9898> [--due DATE] [--assignee \u59D3\u540D] \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1");
356
+ console.log(" kmr del <id> \u5220\u9664\u8BB0\u5F55");
357
+ console.log(" kmr --help \u663E\u793A\u5B8C\u6574\u5E2E\u52A9\n");
350
358
  await import("./index.js");
351
359
  }
package/dist/index.js CHANGED
@@ -854,6 +854,7 @@ async function main() {
854
854
  const tempStore = new JsonStore(path3.join(KMR_DIR, "data", "meetings"));
855
855
  const { port: webPort } = await startWebServer(tempStore, KMR_DIR, 3e3);
856
856
  existingWebPort = webPort;
857
+ console.log(` \u{1F310} Web \u7BA1\u7406\u754C\u9762: http://localhost:${webPort} (\u914D\u7F6E\u5F15\u5BFC\u4E2D...)`);
857
858
  openBrowser(`http://localhost:${webPort}/#settings`);
858
859
  await waitForConfig(webPort);
859
860
  }
@@ -1075,14 +1076,16 @@ async function main() {
1075
1076
  let port;
1076
1077
  if (existingWebPort) {
1077
1078
  port = existingWebPort;
1078
- console.log(`KMR Web \u754C\u9762: http://localhost:${port}`);
1079
+ console.log(` \u{1F310} Web \u7BA1\u7406\u754C\u9762: http://localhost:${port}`);
1079
1080
  } else {
1080
1081
  const webResult = await startWebServer(store, KMR_DIR, 3e3);
1081
1082
  port = webResult.port;
1082
1083
  openBrowser(`http://localhost:${port}`);
1083
- console.log(`KMR Web \u754C\u9762\u5DF2\u542F\u52A8: http://localhost:${port}`);
1084
+ console.log(` \u{1F310} Web \u7BA1\u7406\u754C\u9762: http://localhost:${port}`);
1084
1085
  }
1085
- console.log("KMR \u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u7B49\u5F85\u98DE\u4E66\u6D88\u606F...");
1086
+ console.log(" \u{1F4E1} \u98DE\u4E66\u957F\u8FDE\u63A5\u5DF2\u5C31\u7EEA\uFF0C\u7B49\u5F85\u6D88\u606F...");
1087
+ console.log(" \u{1F4CB} \u4EFB\u52A1\u7CFB\u7EDF: \u5DF2\u542F\u7528\uFF08\u81EA\u52A8\u540C\u6B65\uFF0C9:30 \u6BCF\u65E5\u6458\u8981\uFF09");
1088
+ console.log(" \u2705 KMR \u670D\u52A1\u8FD0\u884C\u4E2D\n");
1086
1089
  if (config.lark.adminOpenId) {
1087
1090
  messenger.sendToUser(config.lark.adminOpenId, "\u2705 KMR \u670D\u52A1\u5DF2\u542F\u52A8").catch((err) => {
1088
1091
  console.error("[notify] \u5411\u7BA1\u7406\u5458\u63A8\u9001\u542F\u52A8\u901A\u77E5\u5931\u8D25:", err.message);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lih-x-x/kmr",
3
- "version": "1.0.70",
3
+ "version": "1.0.71",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {