@lih-x-x/kmr 1.0.40 → 1.0.42

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.
@@ -0,0 +1,60 @@
1
+ // src/lark/userResolver.ts
2
+ var UserResolver = class {
3
+ constructor(client) {
4
+ this.client = client;
5
+ }
6
+ client;
7
+ // name -> openId 映射(支持多个群的成员合并)
8
+ nameMap = /* @__PURE__ */ new Map();
9
+ loadedChats = /* @__PURE__ */ new Set();
10
+ /**
11
+ * 根据姓名解析 open_id
12
+ * 如果缓存中没有,返回 undefined
13
+ */
14
+ resolve(name) {
15
+ if (this.nameMap.has(name)) return this.nameMap.get(name);
16
+ for (const [key, value] of this.nameMap) {
17
+ if (key.includes(name) || name.includes(key)) return value;
18
+ }
19
+ return void 0;
20
+ }
21
+ /**
22
+ * 加载某个群的成员列表到缓存
23
+ */
24
+ async loadChatMembers(chatId) {
25
+ if (this.loadedChats.has(chatId)) return;
26
+ try {
27
+ let pageToken;
28
+ do {
29
+ const response = await this.client.im.chatMembers.get({
30
+ path: { chat_id: chatId },
31
+ params: {
32
+ member_id_type: "open_id",
33
+ page_size: 100,
34
+ ...pageToken ? { page_token: pageToken } : {}
35
+ }
36
+ });
37
+ const items = response.data?.items || [];
38
+ for (const item of items) {
39
+ if (item.name && item.member_id) {
40
+ this.nameMap.set(item.name, item.member_id);
41
+ }
42
+ }
43
+ pageToken = response.data?.has_more ? response.data?.page_token : void 0;
44
+ } while (pageToken);
45
+ this.loadedChats.add(chatId);
46
+ } catch (err) {
47
+ console.error(`[user-resolver] \u52A0\u8F7D\u7FA4\u6210\u5458\u5931\u8D25:`, err.message);
48
+ }
49
+ }
50
+ /**
51
+ * 获取当前所有已缓存的映射
52
+ */
53
+ getAll() {
54
+ return new Map(this.nameMap);
55
+ }
56
+ };
57
+
58
+ export {
59
+ UserResolver
60
+ };
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.40") {
9
+ if (data.version && data.version !== "1.0.42") {
10
10
  console.log(`
11
- \u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.40"} \u2192 ${data.version}`);
11
+ \u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.42"} \u2192 ${data.version}`);
12
12
  console.log(` \u8FD0\u884C npm install -g ${"@lih-x-x/kmr"} \u66F4\u65B0
13
13
  `);
14
14
  }
@@ -52,10 +52,11 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
52
52
  kmr task \u67E5\u770B\u6240\u6709\u4EFB\u52A1
53
53
  kmr del <id> \u5220\u9664\u8BB0\u5F55
54
54
  kmr find <q> \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55
55
+ kmr create-task <\u6807\u9898> [--due YYYY-MM-DD] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1
55
56
  kmr --help \u663E\u793A\u5E2E\u52A9
56
57
  `);
57
58
  } else if (command === "--version" || command === "-v") {
58
- console.log("1.0.40");
59
+ console.log("1.0.42");
59
60
  } else if (command === "list") {
60
61
  const { loadConfig } = await import("./config-L2SVVMAR.js");
61
62
  const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
@@ -133,6 +134,55 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
133
134
  const store = new JsonStore(loadConfig().storage.dataDir);
134
135
  const ok = await store.delete(id);
135
136
  console.log(ok ? `\u2705 \u5DF2\u5220\u9664: ${id}` : `\u274C \u672A\u627E\u5230: ${id}`);
137
+ } else if (command === "create-task") {
138
+ const args = argv.slice(3);
139
+ let summary = "";
140
+ let due;
141
+ let assignee;
142
+ let desc;
143
+ const positional = [];
144
+ for (let i = 0; i < args.length; i++) {
145
+ if (args[i] === "--due" && args[i + 1]) {
146
+ due = args[++i];
147
+ } else if (args[i] === "--assignee" && args[i + 1]) {
148
+ assignee = args[++i];
149
+ } else if (args[i] === "--desc" && args[i + 1]) {
150
+ desc = args[++i];
151
+ } else {
152
+ positional.push(args[i]);
153
+ }
154
+ }
155
+ summary = positional.join(" ");
156
+ if (!summary) {
157
+ console.error("\u7528\u6CD5: kmr create-task <\u4EFB\u52A1\u6807\u9898> [--due YYYY-MM-DD] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0]");
158
+ process.exit(1);
159
+ }
160
+ const { loadConfig } = await import("./config-L2SVVMAR.js");
161
+ const { createLarkClient } = await import("./client-DFBBDD77.js");
162
+ const { TaskCreator } = await import("./taskCreator-TCI3VB5D.js");
163
+ const { UserResolver } = await import("./userResolver-DTWOTVP6.js");
164
+ const config = loadConfig();
165
+ const client = createLarkClient(config);
166
+ const taskCreator = new TaskCreator(client);
167
+ let assigneeOpenId;
168
+ if (assignee) {
169
+ const userResolver = new UserResolver(client);
170
+ try {
171
+ const chatListRes = await client.im.chat.list({ params: { page_size: 50 } });
172
+ const chats = chatListRes.data?.items || [];
173
+ for (const chat of chats) {
174
+ await userResolver.loadChatMembers(chat.chat_id);
175
+ }
176
+ } catch {
177
+ }
178
+ assigneeOpenId = userResolver.resolve(assignee);
179
+ if (!assigneeOpenId) {
180
+ console.error(`\u26A0\uFE0F \u672A\u627E\u5230\u7528\u6237 "${assignee}"\uFF0C\u5C06\u521B\u5EFA\u65E0\u8D1F\u8D23\u4EBA\u7684\u4EFB\u52A1`);
181
+ }
182
+ }
183
+ const result = await taskCreator.createTask({ summary, due, description: desc, assigneeOpenId });
184
+ console.log(`\u2705 \u4EFB\u52A1\u5DF2\u521B\u5EFA: ${result.taskId}`);
185
+ if (result.url) console.log(` ${result.url}`);
136
186
  } else if (command === "find") {
137
187
  const query = argv.slice(3).join(" ");
138
188
  if (!query) {
@@ -170,6 +220,7 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
170
220
  kmr task \u67E5\u770B\u6240\u6709\u4EFB\u52A1
171
221
  kmr del <id> \u5220\u9664\u8BB0\u5F55
172
222
  kmr find <q> \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55
223
+ kmr create-task <\u6807\u9898> [--due DATE] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] \u521B\u5EFA\u4EFB\u52A1
173
224
  kmr --help \u663E\u793A\u5B8C\u6574\u5E2E\u52A9
174
225
  `);
175
226
  await import("./index.js");
package/dist/index.js CHANGED
@@ -1,6 +1,15 @@
1
+ import {
2
+ ClaudeCodeProvider,
3
+ getExecEnv
4
+ } from "./chunk-WMK5MYOU.js";
1
5
  import {
2
6
  QueryHandler
3
7
  } from "./chunk-SGTENG37.js";
8
+ import {
9
+ KMR_DIR,
10
+ getAgentProvider,
11
+ loadConfig
12
+ } from "./chunk-ZXGVA5QX.js";
4
13
  import {
5
14
  JsonStore
6
15
  } from "./chunk-TUCCS6QJ.js";
@@ -17,14 +26,8 @@ import {
17
26
  syncTaskStatuses
18
27
  } from "./chunk-XQVLJTP4.js";
19
28
  import {
20
- ClaudeCodeProvider,
21
- getExecEnv
22
- } from "./chunk-WMK5MYOU.js";
23
- import {
24
- KMR_DIR,
25
- getAgentProvider,
26
- loadConfig
27
- } from "./chunk-ZXGVA5QX.js";
29
+ UserResolver
30
+ } from "./chunk-2IG4NXRZ.js";
28
31
 
29
32
  // src/index.ts
30
33
  import fs3 from "fs";
@@ -570,28 +573,39 @@ import fs2 from "fs";
570
573
  import path2 from "path";
571
574
 
572
575
  // src/session/skill.ts
573
- var SESSION_SKILL = `\u4F60\u662F KMR\uFF08Key Meetings Record\uFF09\u7684\u667A\u80FD\u52A9\u624B\u3002
576
+ var SESSION_SKILL = `\u4F60\u662F KMR\uFF08Key Meetings Record\uFF09\u7684\u667A\u80FD\u52A9\u624B\uFF0C\u8FD0\u884C\u5728\u98DE\u4E66\u673A\u5668\u4EBA\u4E2D\u3002
574
577
 
575
578
  \u4F60\u7684\u804C\u8D23\uFF1A
576
579
  1. \u5E2E\u52A9\u7528\u6237\u7406\u89E3\u548C\u7BA1\u7406\u4F1A\u8BAE\u8BB0\u5F55
577
580
  2. \u56DE\u7B54\u5173\u4E8E\u5386\u53F2\u4F1A\u8BAE\u5185\u5BB9\u7684\u95EE\u9898
578
581
  3. \u5E2E\u52A9\u7528\u6237\u6574\u7406\u3001\u603B\u7ED3\u5DE5\u4F5C\u4E2D\u7684\u4FE1\u606F
579
- 4. \u63D0\u4F9B\u5DE5\u4F5C\u5EFA\u8BAE\u548C\u77E5\u8BC6\u68C0\u7D22
582
+ 4. \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1\u3001\u53D1\u9001\u98DE\u4E66\u6D88\u606F\u7B49\u64CD\u4F5C
580
583
 
581
584
  \u80CC\u666F\u4FE1\u606F\uFF1A
582
585
  - KMR \u662F\u4E00\u4E2A\u4ECE\u98DE\u4E66\u4F1A\u8BAE\u7EAA\u8981\u4E2D\u63D0\u53D6\u5173\u952E\u4FE1\u606F\u5E76\u6316\u6398\u51FA\u5171\u8BC6\u3001\u627F\u8BFA\u3001\u98CE\u9669\u3001\u5F85\u529E\u3001\u77E5\u8BC6\u7684\u670D\u52A1
583
586
  - \u6838\u5FC3\u63D0\u53D6\u7EF4\u5EA6\uFF1A\u5173\u952E\u5171\u8BC6\u4E0E\u627F\u8BFA\uFF08\u6EAF\u6E90\u8FFD\u8D23\uFF09\u3001\u53EF\u590D\u7528\u77E5\u8BC6\uFF08\u5DE5\u5177/\u65B9\u6CD5/\u7ECF\u9A8C\uFF09\u3001\u98CE\u9669\u4E0E\u5F85\u529E\uFF08\u98CE\u9669\u9884\u8B66/\u4EFB\u52A1\u8DDF\u8E2A\uFF09
584
587
 
585
- \u6570\u636E\u8BBF\u95EE\uFF1A
586
- - \u4F1A\u8BAE\u8BB0\u5F55\u5B58\u50A8\u5728 ~/.kmr/data/meetings/ \u76EE\u5F55\u4E0B\uFF0C\u6BCF\u4E2A\u4F1A\u8BAE\u662F\u4E00\u4E2A JSON \u6587\u4EF6
587
- - \u6BCF\u4E2A JSON \u6587\u4EF6\u5305\u542B\uFF1Asummary\uFF08\u6807\u9898/\u65E5\u671F/\u53C2\u4E0E\u4EBA/\u8981\u70B9\uFF09\u3001todos\u3001risks\u3001commitments\u3001reusableInsights\u3001rawContent
588
- - \u4F60\u53EF\u4EE5\u901A\u8FC7\u4EE5\u4E0B\u547D\u4EE4\u67E5\u8BE2\u4F1A\u8BAE\u6570\u636E\uFF1Akmr list\uFF08\u5217\u51FA\u5168\u90E8\uFF09\u3001kmr show <id>\uFF08\u67E5\u770B\u8BE6\u60C5\uFF09\u3001kmr find <query>\uFF08\u641C\u7D22\uFF09
589
- - \u5F53\u7528\u6237\u95EE\u5230\u4F1A\u8BAE/\u4EFB\u52A1\u76F8\u5173\u7684\u95EE\u9898\u65F6\uFF0C\u76F4\u63A5\u6267\u884C kmr \u547D\u4EE4\u83B7\u53D6\u6570\u636E\u5E76\u56DE\u7B54
590
- - \u63D0\u793A\u7528\u6237\u5728\u98DE\u4E66\u5BF9\u8BDD\u4E2D\u53EF\u4EE5\u4F7F\u7528\uFF1A/find \u641C\u7D22\u3001/list \u5217\u51FA\u5168\u90E8\u3001/show <id> \u67E5\u770B\u8BE6\u60C5\u3001/del <id> \u5220\u9664; \u6216\u8005\u5728\u7EC8\u7AEF\u4F7F\u7528\u4E0A\u8FF0kmr\u547D\u4EE4\u8FDB\u884C\u64CD\u4F5C
588
+ \u8FD0\u884C\u73AF\u5883\uFF1A
589
+ - \u4F60\u8FD0\u884C\u5728\u98DE\u4E66\u673A\u5668\u4EBA\u4E2D\uFF0C\u4F60\u7684\u56DE\u590D\u4F1A\u76F4\u63A5\u4F5C\u4E3A\u98DE\u4E66\u6D88\u606F\u53D1\u9001\u5230\u7528\u6237\u6240\u5728\u7684\u5BF9\u8BDD\u4E2D
590
+ - \u4E0D\u8981\u8BF4"\u6211\u6CA1\u6709\u53D1\u6D88\u606F/\u521B\u5EFA\u4EFB\u52A1\u7684\u80FD\u529B"\u2014\u2014\u4F60\u53EF\u4EE5\u901A\u8FC7 kmr \u547D\u4EE4\u6765\u5B8C\u6210\u8FD9\u4E9B\u64CD\u4F5C
591
+ - \u4F60\u6709\u80FD\u529B\u901A\u8FC7 kmr \u547D\u4EE4\u67E5\u8BE2\u6570\u636E\u3001\u521B\u5EFA\u4EFB\u52A1\u3001\u53D1\u9001\u6D88\u606F
592
+
593
+ \u53EF\u7528\u7684 kmr \u547D\u4EE4\uFF08\u901A\u8FC7 bash \u6267\u884C\uFF09\uFF1A
594
+ - kmr list \u2014 \u5217\u51FA\u6240\u6709\u4F1A\u8BAE\u8BB0\u5F55
595
+ - kmr show <id> \u2014 \u67E5\u770B\u4F1A\u8BAE\u8BB0\u5F55\u8BE6\u60C5
596
+ - kmr find <query> \u2014 \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55
597
+ - kmr task \u2014 \u67E5\u770B\u6240\u6709\u4EFB\u52A1
598
+ - kmr del <id> \u2014 \u5220\u9664\u8BB0\u5F55
599
+ - kmr create-task <\u4EFB\u52A1\u6807\u9898> [--due YYYY-MM-DD] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] \u2014 \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1
600
+
601
+ \u64CD\u4F5C\u6307\u5357\uFF1A
602
+ - \u5F53\u7528\u6237\u8981\u6C42\u521B\u5EFA\u4EFB\u52A1\u65F6\uFF0C\u76F4\u63A5\u6267\u884C kmr create-task \u547D\u4EE4\uFF0C\u4F8B\u5982\uFF1Akmr create-task "\u5B8C\u6210\u65B9\u6848\u8BBE\u8BA1" --due 2026-05-15 --assignee \u5F20\u4E09
603
+ - \u5F53\u7528\u6237\u95EE\u5230\u4F1A\u8BAE/\u4EFB\u52A1\u76F8\u5173\u7684\u95EE\u9898\u65F6\uFF0C\u5148\u6267\u884C kmr \u547D\u4EE4\u83B7\u53D6\u6570\u636E\u518D\u56DE\u7B54
604
+ - \u63D0\u793A\u7528\u6237\u5728\u98DE\u4E66\u5BF9\u8BDD\u4E2D\u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\uFF1A/find \u641C\u7D22\u3001/list \u5217\u51FA\u5168\u90E8\u3001/show <id> \u67E5\u770B\u8BE6\u60C5\u3001/del <id> \u5220\u9664\u3001/task \u67E5\u770B\u4EFB\u52A1
591
605
 
592
606
  \u5BF9\u8BDD\u8981\u6C42\uFF1A
593
607
  - \u7B80\u6D01\u3001\u4E13\u4E1A\u3001\u6709\u5E2E\u52A9
594
- - \u4F18\u5148\u901A\u8FC7 kmr \u547D\u4EE4\u83B7\u53D6\u6570\u636E\u56DE\u7B54\u95EE\u9898\uFF1B\u5982\u679C\u7528\u6237\u660E\u786E\u60F3\u81EA\u5DF1\u64CD\u4F5C\uFF0C\u4E5F\u53EF\u4EE5\u544A\u77E5\u5BF9\u5E94\u547D\u4EE4
608
+ - \u4F18\u5148\u901A\u8FC7 kmr \u547D\u4EE4\u83B7\u53D6\u6570\u636E\u548C\u6267\u884C\u64CD\u4F5C\uFF1B\u5982\u679C\u7528\u6237\u660E\u786E\u60F3\u81EA\u5DF1\u64CD\u4F5C\uFF0C\u4E5F\u53EF\u4EE5\u544A\u77E5\u5BF9\u5E94\u547D\u4EE4
595
609
  - \u6BCF\u6B21\u56DE\u590D\u63A7\u5236\u5728\u5408\u7406\u957F\u5EA6\uFF0C\u9002\u5408\u98DE\u4E66\u6D88\u606F\u9605\u8BFB
596
610
 
597
611
  \u3010\u91CD\u8981\u3011\u76F4\u63A5\u8F93\u51FA\u7EAF\u6587\u672C\u56DE\u590D\uFF0C\u4E0D\u8981\u8F93\u51FA JSON\u3001markdown \u4EE3\u7801\u5757\u7B49\u683C\u5F0F\u3002`;
@@ -727,63 +741,6 @@ var SessionManager = class {
727
741
  }
728
742
  };
729
743
 
730
- // src/lark/userResolver.ts
731
- var UserResolver = class {
732
- constructor(client) {
733
- this.client = client;
734
- }
735
- client;
736
- // name -> openId 映射(支持多个群的成员合并)
737
- nameMap = /* @__PURE__ */ new Map();
738
- loadedChats = /* @__PURE__ */ new Set();
739
- /**
740
- * 根据姓名解析 open_id
741
- * 如果缓存中没有,返回 undefined
742
- */
743
- resolve(name) {
744
- if (this.nameMap.has(name)) return this.nameMap.get(name);
745
- for (const [key, value] of this.nameMap) {
746
- if (key.includes(name) || name.includes(key)) return value;
747
- }
748
- return void 0;
749
- }
750
- /**
751
- * 加载某个群的成员列表到缓存
752
- */
753
- async loadChatMembers(chatId) {
754
- if (this.loadedChats.has(chatId)) return;
755
- try {
756
- let pageToken;
757
- do {
758
- const response = await this.client.im.chatMembers.get({
759
- path: { chat_id: chatId },
760
- params: {
761
- member_id_type: "open_id",
762
- page_size: 100,
763
- ...pageToken ? { page_token: pageToken } : {}
764
- }
765
- });
766
- const items = response.data?.items || [];
767
- for (const item of items) {
768
- if (item.name && item.member_id) {
769
- this.nameMap.set(item.name, item.member_id);
770
- }
771
- }
772
- pageToken = response.data?.has_more ? response.data?.page_token : void 0;
773
- } while (pageToken);
774
- this.loadedChats.add(chatId);
775
- } catch (err) {
776
- console.error(`[user-resolver] \u52A0\u8F7D\u7FA4\u6210\u5458\u5931\u8D25:`, err.message);
777
- }
778
- }
779
- /**
780
- * 获取当前所有已缓存的映射
781
- */
782
- getAll() {
783
- return new Map(this.nameMap);
784
- }
785
- };
786
-
787
744
  // src/index.ts
788
745
  async function main() {
789
746
  const config = loadConfig();
@@ -0,0 +1,6 @@
1
+ import {
2
+ UserResolver
3
+ } from "./chunk-2IG4NXRZ.js";
4
+ export {
5
+ UserResolver
6
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lih-x-x/kmr",
3
- "version": "1.0.40",
3
+ "version": "1.0.42",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {