@auto-ai/agent 2.1.120 → 2.1.122

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 (85) hide show
  1. package/.env.example +2 -1
  2. package/dist/404/index.html +1 -1
  3. package/dist/404.html +1 -1
  4. package/dist/_next/static/chunks/19aa69c07b3642d5.js +1 -0
  5. package/dist/_next/static/chunks/24459c7365a2b28b.js +1 -0
  6. package/dist/_next/static/chunks/{d3e2070a86378cfb.js → 33eeef286c328da0.js} +1 -1
  7. package/dist/_next/static/chunks/3407244006d6a98a.js +1 -0
  8. package/dist/_next/static/chunks/566e152e480b267a.js +1 -0
  9. package/dist/_next/static/chunks/6ad4268160f361a6.js +1 -0
  10. package/dist/_next/static/chunks/{d9a278a2a26e8ee5.js → 6f9a48a7f83e669a.js} +1 -1
  11. package/dist/_next/static/chunks/7658b5b9c2865eb1.js +1 -0
  12. package/dist/_next/static/chunks/7a5fd448b280dd64.js +1 -0
  13. package/dist/_next/static/chunks/{fa677aa06f1c0539.js → 98f0c5604e839ba2.js} +1 -1
  14. package/dist/_next/static/chunks/a38eccf0bb5ca1e9.js +1 -0
  15. package/dist/_next/static/chunks/b29a354245bfc377.css +1 -0
  16. package/dist/_next/static/chunks/b76778c5811ef7a1.js +1 -0
  17. package/dist/_next/static/chunks/c2bed9d5fa7be4bd.js +1 -0
  18. package/dist/_next/static/chunks/c5a4977aae6a008c.js +1 -0
  19. package/dist/_next/static/chunks/e7bd145455a541af.css +4 -0
  20. package/dist/_next/static/chunks/f2bb685629307d4d.js +1 -0
  21. package/dist/_next/static/chunks/f7e71ce1c236f806.js +1 -0
  22. package/dist/_next/static/chunks/{67acc15b8a448e1a.js → fc4be3bcf72559a0.js} +1 -1
  23. package/dist/index.html +1 -1
  24. package/dist/index.txt +16 -16
  25. package/dist/manage/about/index.html +2 -2
  26. package/dist/manage/about/index.txt +19 -19
  27. package/dist/manage/add-account/basic/index.html +2 -2
  28. package/dist/manage/add-account/basic/index.txt +23 -22
  29. package/dist/manage/add-account/index.html +2 -2
  30. package/dist/manage/add-account/index.txt +22 -23
  31. package/dist/manage/agent-teams/index.html +2 -2
  32. package/dist/manage/agent-teams/index.txt +21 -21
  33. package/dist/manage/env/index.html +2 -2
  34. package/dist/manage/env/index.txt +21 -21
  35. package/dist/manage/general/index.html +2 -2
  36. package/dist/manage/general/index.txt +19 -19
  37. package/dist/manage/index.html +1 -1
  38. package/dist/manage/index.txt +16 -16
  39. package/dist/manage/mcp/index.html +2 -2
  40. package/dist/manage/mcp/index.txt +21 -21
  41. package/dist/manage/permissions/index.html +2 -2
  42. package/dist/manage/permissions/index.txt +19 -19
  43. package/dist/manage/skills/index.html +2 -2
  44. package/dist/manage/skills/index.txt +21 -21
  45. package/dist/manage/task/index.html +2 -2
  46. package/dist/manage/task/index.txt +19 -19
  47. package/dist/manage/teams/index.html +2 -2
  48. package/dist/manage/teams/index.txt +19 -19
  49. package/dist/manage/tools/index.html +2 -2
  50. package/dist/manage/tools/index.txt +21 -21
  51. package/dist/ws-test.html +129 -191
  52. package/mcps-runtime/claude-geelib-channel/.mcp.json +18 -0
  53. package/mcps-runtime/claude-geelib-channel/server/boot.mjs +32 -0
  54. package/mcps-runtime/claude-geelib-channel/server/geelib-api.mjs +192 -0
  55. package/mcps-runtime/claude-geelib-channel/server/geelib-auth.mjs +147 -0
  56. package/mcps-runtime/claude-geelib-channel/server/geelib-client.mjs +63 -0
  57. package/mcps-runtime/claude-geelib-channel/server/index.mjs +451 -0
  58. package/mcps-runtime/claude-geelib-channel/server/poll.mjs +457 -0
  59. package/mcps-runtime/claude-geelib-channel/server/state.mjs +216 -0
  60. package/package.json +6 -6
  61. package/tools-runtime/code-tool/index.cjs +1 -0
  62. package/tools-runtime/code-tool/src/index.ts +7 -1
  63. package/tools-runtime/git-tool/index.cjs +69 -5
  64. package/tools-runtime/git-tool/src/workspace.ts +101 -4
  65. package/tools-runtime/git-tool/src/wsInit.ts +26 -3
  66. package/dist/_next/static/chunks/249606605eed1993.js +0 -1
  67. package/dist/_next/static/chunks/424d3f3f176d43d7.js +0 -1
  68. package/dist/_next/static/chunks/4302af16b34bf750.js +0 -1
  69. package/dist/_next/static/chunks/4a073924e062c459.css +0 -1
  70. package/dist/_next/static/chunks/6209b42cbfcf288a.js +0 -1
  71. package/dist/_next/static/chunks/83bf6e4bc0aad48b.css +0 -4
  72. package/dist/_next/static/chunks/8b34d657c6bbb8df.js +0 -1
  73. package/dist/_next/static/chunks/904ad158fd721117.js +0 -1
  74. package/dist/_next/static/chunks/99063f8d79783308.js +0 -1
  75. package/dist/_next/static/chunks/9cd912a1967f10df.js +0 -1
  76. package/dist/_next/static/chunks/c52dcbe269bb02d0.js +0 -1
  77. package/dist/_next/static/chunks/d01957b1055b357a.js +0 -1
  78. package/dist/_next/static/chunks/dacc94cf10289334.js +0 -1
  79. package/dist/_next/static/chunks/fff9d250e482f00e.js +0 -1
  80. package/skills-runtime/geelib/SKILL.md +0 -229
  81. package/skills-runtime/geelib/geelib-poller-state.json +0 -17
  82. package/skills-runtime/geelib/geelib.mjs +0 -762
  83. /package/dist/_next/static/{fg4nA8liSSLEgWV4WTZDt → pVB1xZbEW09ksdJlV12Zn}/_buildManifest.js +0 -0
  84. /package/dist/_next/static/{fg4nA8liSSLEgWV4WTZDt → pVB1xZbEW09ksdJlV12Zn}/_clientMiddlewareManifest.json +0 -0
  85. /package/dist/_next/static/{fg4nA8liSSLEgWV4WTZDt → pVB1xZbEW09ksdJlV12Zn}/_ssgManifest.js +0 -0
@@ -1,762 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
-
4
- // cli/args.ts
5
- function parseArgs(argv) {
6
- const positional = [];
7
- const flags = {};
8
- for (let i = 0; i < argv.length; i++) {
9
- const arg = argv[i];
10
- if (!arg.startsWith("--")) {
11
- positional.push(arg);
12
- continue;
13
- }
14
- const eq = arg.indexOf("=");
15
- if (eq > 0) {
16
- flags[arg.slice(2, eq)] = arg.slice(eq + 1);
17
- continue;
18
- }
19
- const key = arg.slice(2);
20
- const next = argv[i + 1];
21
- if (next !== void 0 && !next.startsWith("--")) {
22
- flags[key] = next;
23
- i++;
24
- } else {
25
- flags[key] = "true";
26
- }
27
- }
28
- return { positional, flags };
29
- }
30
- function requireFlag(flags, name) {
31
- const v = flags[name];
32
- if (v === void 0 || v === "") {
33
- throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 --${name}`);
34
- }
35
- return v;
36
- }
37
- function flagNumber(flags, name) {
38
- const raw = requireFlag(flags, name);
39
- const n = Number(raw);
40
- if (!Number.isFinite(n)) {
41
- throw new Error(`--${name} \u5FC5\u987B\u662F\u6570\u5B57`);
42
- }
43
- return n;
44
- }
45
- function flagOptionalNumber(flags, name) {
46
- const raw = flags[name];
47
- if (raw === void 0 || raw === "") {
48
- return void 0;
49
- }
50
- const n = Number(raw);
51
- if (!Number.isFinite(n)) {
52
- throw new Error(`--${name} \u5FC5\u987B\u662F\u6570\u5B57`);
53
- }
54
- return n;
55
- }
56
-
57
- // cli/auth.ts
58
- var SSO_LOGIN_URL = "https://login.ops.qihoo.net:4436/sec/login";
59
- var GEELIB_DO_LOGIN_URL = "https://geelib.qihoo.net/ones/Login/doLogin";
60
- var GEELIB_VERIFY_URL = "https://geelib.qihoo.net/ones/user/userInfo?need_share=0";
61
- var BOUNDARY = "----WebKitFormBoundaryGeelibCli";
62
- var sessionCookie = "";
63
- function getCookie() {
64
- return sessionCookie;
65
- }
66
- function buildFormData(fields) {
67
- let body = "";
68
- for (const [name, value] of Object.entries(fields)) {
69
- body += `--${BOUNDARY}\r
70
- `;
71
- body += `Content-Disposition: form-data; name="${name}"\r
72
- \r
73
- `;
74
- body += `${value}\r
75
- `;
76
- }
77
- body += `--${BOUNDARY}--\r
78
- `;
79
- return body;
80
- }
81
- function parseCookies(headers) {
82
- const setCookies = headers.getSetCookie?.() ?? [];
83
- const cookies = {};
84
- for (const c of setCookies) {
85
- const [pair] = c.split(";");
86
- const [name, ...rest] = pair.trim().split("=");
87
- cookies[name.trim()] = rest.join("=").trim();
88
- }
89
- return cookies;
90
- }
91
- async function ssoLogin(user, passwd) {
92
- const body = buildFormData({
93
- user,
94
- passwd,
95
- src: "qihoo",
96
- syzm: "",
97
- ref: "https://geelib.qihoo.net/geelib/"
98
- });
99
- const resp = await fetch(SSO_LOGIN_URL, {
100
- method: "POST",
101
- headers: {
102
- "Content-Type": `multipart/form-data; boundary=${BOUNDARY}`,
103
- Accept: "application/json, text/plain, */*",
104
- Cookie: "SSO_PREFERED_DOMAIN=qihoo",
105
- Referer: "https://login.ops.qihoo.net:4436/sec/login",
106
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
107
- },
108
- body
109
- });
110
- if (!resp.ok) {
111
- throw new Error(`SSO login failed: ${resp.status} ${resp.statusText}`);
112
- }
113
- const data = await resp.json();
114
- if (data.status !== 0) {
115
- throw new Error(`SSO login error: ${JSON.stringify(data)}`);
116
- }
117
- return data.sid;
118
- }
119
- async function doLogin(sid) {
120
- const resp = await fetch(GEELIB_DO_LOGIN_URL, {
121
- method: "POST",
122
- headers: {
123
- "Content-Type": "application/json",
124
- Accept: "application/json, text/plain, */*",
125
- Referer: "https://geelib.qihoo.net/geelib/",
126
- Origin: "https://geelib.qihoo.net",
127
- "X-Requested-With": "XMLHttpRequest",
128
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
129
- },
130
- body: JSON.stringify({ sid, ref: "https://geelib.qihoo.net/geelib/" })
131
- });
132
- if (!resp.ok) {
133
- throw new Error(`doLogin failed: ${resp.status}`);
134
- }
135
- const cookies = parseCookies(resp.headers);
136
- const data = await resp.json();
137
- if (data.errno !== 2e3) {
138
- throw new Error(`doLogin error: errno=${data.errno} errmsg=${data.errmsg}`);
139
- }
140
- const cookieStr = Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join("; ");
141
- return {
142
- cookieStr,
143
- userName: data.data?.real_name ?? data.data?.name ?? ""
144
- };
145
- }
146
- async function verifyCookie(cookieStr) {
147
- try {
148
- const resp = await fetch(GEELIB_VERIFY_URL, {
149
- headers: {
150
- Cookie: cookieStr,
151
- Referer: "https://geelib.qihoo.net/geelib/",
152
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
153
- Accept: "application/json, text/plain, */*",
154
- "X-Requested-With": "XMLHttpRequest"
155
- }
156
- });
157
- const data = await resp.json();
158
- return data.errno === 2e3;
159
- } catch {
160
- return false;
161
- }
162
- }
163
- async function login() {
164
- const user = process.env.GEELIB_USER;
165
- const passwd = process.env.GEELIB_PASSWD;
166
- if (!user || !passwd) {
167
- throw new Error("\u8BF7\u914D\u7F6E GEELIB_USER \u548C GEELIB_PASSWD \u73AF\u5883\u53D8\u91CF");
168
- }
169
- const sid = await ssoLogin(user, passwd);
170
- const { cookieStr } = await doLogin(sid);
171
- sessionCookie = cookieStr;
172
- return cookieStr;
173
- }
174
- async function ensureAuth() {
175
- if (sessionCookie && await verifyCookie(sessionCookie)) {
176
- return;
177
- }
178
- await login();
179
- }
180
-
181
- // cli/client.ts
182
- var BASE_URL = process.env.GEELIB_BASE_URL ?? "https://geelib.qihoo.net";
183
- function buildHeaders() {
184
- return {
185
- Cookie: getCookie(),
186
- "Content-Type": "application/json",
187
- Accept: "application/json, text/plain, */*",
188
- "X-Requested-With": "XMLHttpRequest",
189
- Referer: `${BASE_URL}/geelib/`,
190
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
191
- };
192
- }
193
- async function request(fn) {
194
- await ensureAuth();
195
- let resp = await fn();
196
- if (resp.status === 401 || resp.status === 403) {
197
- await ensureAuth();
198
- resp = await fn();
199
- }
200
- if (!resp.ok) {
201
- throw new Error(`HTTP ${resp.status} ${resp.statusText} \u2014 ${resp.url}`);
202
- }
203
- return resp.json();
204
- }
205
- async function geelibGet(path, params) {
206
- const url = new URL(path, BASE_URL);
207
- if (params) {
208
- for (const [k, v] of Object.entries(params)) {
209
- if (v !== void 0) {
210
- url.searchParams.set(k, String(v));
211
- }
212
- }
213
- }
214
- return request(
215
- () => fetch(url.toString(), { method: "GET", headers: buildHeaders() })
216
- );
217
- }
218
- async function geelibPost(path, body) {
219
- const url = new URL(path, BASE_URL);
220
- return request(
221
- () => fetch(url.toString(), {
222
- method: "POST",
223
- headers: buildHeaders(),
224
- body: body !== void 0 ? JSON.stringify(body) : void 0
225
- })
226
- );
227
- }
228
-
229
- // cli/commands/user.ts
230
- async function cmdGetUserInfo() {
231
- return geelibGet("/ones/user/userInfo", { need_share: 0 });
232
- }
233
-
234
- // cli/commands/project.ts
235
- async function cmdListProjects(query = "") {
236
- return geelibGet("/projects/subBusMgr/getCanAccessSubList", {
237
- query,
238
- simple: 2
239
- });
240
- }
241
- async function cmdListActiveProjectsText() {
242
- const resp = await cmdListProjects("");
243
- if (resp.errno !== 2e3) {
244
- return `[geelib] \u9879\u76EE\u5217\u8868\u83B7\u53D6\u5931\u8D25: errno=${resp.errno} ${resp.errmsg ?? ""}`;
245
- }
246
- const rawList = Array.isArray(resp.data) ? resp.data : resp.data?.list;
247
- if (!rawList?.length) {
248
- return "\uFF08\u65E0\u8FDB\u884C\u4E2D\u9879\u76EE\uFF09";
249
- }
250
- const active = rawList.filter((p) => p.is_archive === 0);
251
- if (active.length === 0) {
252
- return "\uFF08\u65E0\u8FDB\u884C\u4E2D\u9879\u76EE\uFF09";
253
- }
254
- const lines = [
255
- `\u5171 ${active.length} \u4E2A\u8FDB\u884C\u4E2D\u9879\u76EE\uFF08is_archive=0\uFF09\uFF1A`,
256
- "",
257
- "| sub_id | \u9879\u76EE\u540D\u79F0 | sub_status_id | \u66F4\u65B0\u65F6\u95F4 |",
258
- "| --- | --- | --- | --- |"
259
- ];
260
- for (const p of active) {
261
- const subId = p.id ?? p.sub_id;
262
- if (subId === void 0) {
263
- continue;
264
- }
265
- const name = (p.name ?? "").replace(/\|/g, "\\|");
266
- lines.push(
267
- `| ${subId} | ${name} | ${p.sub_status_id ?? "-"} | ${p.update_time ?? "-"} |`
268
- );
269
- }
270
- return lines.join("\n");
271
- }
272
- async function cmdGetProjectDetail(subId) {
273
- return geelibGet("/projects/subBusMgr/getSubDetail", { sub_id: subId });
274
- }
275
- async function cmdListProjectMembers(subId) {
276
- return geelibGet("/projects/subBusMgr/getSubUserListSortByInitial", {
277
- sub_id: subId
278
- });
279
- }
280
- async function cmdListMatterTypes(subId) {
281
- return geelibGet("/matter/Matter/getMatterType", {
282
- sub_id: subId,
283
- page: 0,
284
- pageSize: 9999
285
- });
286
- }
287
- async function cmdListMatterStatuses(subId, typeId) {
288
- return geelibGet("/matter/matterType/getMatterTypeStatusList", {
289
- sub_id: subId,
290
- type_id: typeId
291
- });
292
- }
293
-
294
- // cli/commands/matter.ts
295
- var PRIORITY_MAP = {
296
- low: 1,
297
- medium: 2,
298
- high: 3,
299
- urgent: 4
300
- };
301
- async function cmdListMatters(opts) {
302
- const customContent = {};
303
- if (opts.statusId !== void 0) {
304
- customContent.status = [opts.statusId];
305
- }
306
- if (opts.assigneeId !== void 0) {
307
- customContent.executor = [opts.assigneeId];
308
- }
309
- const body = {
310
- sub_id: opts.subId,
311
- type_id: [opts.typeId],
312
- page: opts.page ?? 1,
313
- pageSize: opts.pageSize ?? 20,
314
- title: opts.keyword ?? "",
315
- order_by: [],
316
- customContent,
317
- is_favor: 0,
318
- simple: 0,
319
- from_v3: 1,
320
- tree: 0,
321
- need_user_name: 1
322
- };
323
- return geelibPost("/matter/Matter/getMatterList", body);
324
- }
325
- async function cmdGetMatter(subId, matterId) {
326
- return geelibGet("/matter/Matter/getMatterDetail", {
327
- sub_id: subId,
328
- id: matterId,
329
- need_options: 1
330
- });
331
- }
332
- async function cmdUpdateMatter(opts) {
333
- const results = [];
334
- const hasOtherFields = opts.title !== void 0 || opts.description !== void 0 || opts.assigneeId !== void 0 || opts.priority !== void 0 || opts.progress !== void 0 || opts.sprintId !== void 0;
335
- if (hasOtherFields) {
336
- const body = {
337
- sub_id: opts.subId,
338
- id: opts.matterId
339
- };
340
- if (opts.title !== void 0) body.title = opts.title;
341
- if (opts.description !== void 0) body.content = opts.description;
342
- if (opts.assigneeId !== void 0) body.executor = opts.assigneeId;
343
- if (opts.priority !== void 0) {
344
- body.priority = PRIORITY_MAP[opts.priority] ?? opts.priority;
345
- }
346
- if (opts.progress !== void 0) body.progress = opts.progress;
347
- if (opts.sprintId !== void 0) body.sprint_id = opts.sprintId;
348
- const r = await geelibPost(
349
- "/matter/Matter/editMatter",
350
- body
351
- );
352
- results.push({ fields: "other", ...r });
353
- }
354
- if (opts.statusId !== void 0) {
355
- const statusBody = {
356
- sub_id: String(opts.subId),
357
- id: opts.matterId,
358
- data: { cf_id: "1", cf_value: String(opts.statusId) },
359
- additional_attribute: [],
360
- remark: "",
361
- toUsers: []
362
- };
363
- const sr = await geelibPost(
364
- "/matter/Matter/editMatter",
365
- statusBody
366
- );
367
- if (sr.errno === 2e3) {
368
- const detail = await geelibGet("/matter/Matter/getMatterDetail", {
369
- sub_id: opts.subId,
370
- id: opts.matterId,
371
- need_options: 1
372
- });
373
- const actualStatus = detail.data?.matter_status;
374
- if (actualStatus !== opts.statusId) {
375
- const missingFields = (detail.data?.matterCustomAttributes ?? []).filter((a) => a.is_required && a.matterCustomAttributeValue === null).map((a) => `\u300C${a.cf_name}\u300D(${a.cf_key})`);
376
- const hint = missingFields.length > 0 ? `\u539F\u56E0\uFF1A\u5DE5\u4F5C\u9879\u5B58\u5728\u672A\u586B\u7684\u5FC5\u586B\u5B57\u6BB5\uFF1A${missingFields.join("\u3001")}\u3002\u8BF7\u5148\u5728 Geelib \u7F51\u9875\u7AEF\u8865\u5168\u540E\u91CD\u8BD5\u3002` : "\u72B6\u6001\u672A\u53D8\u66F4\uFF0C\u53EF\u80FD\u5B58\u5728\u672A\u77E5\u7684\u72B6\u6001\u6D41\u8F6C\u9650\u5236\u3002";
377
- results.push({
378
- fields: "status",
379
- errno: sr.errno,
380
- errmsg: `API \u8FD4\u56DE\u6210\u529F\u4F46\u72B6\u6001\u5B9E\u9645\u672A\u53D8\u66F4\uFF08\u5F53\u524D\u72B6\u6001\uFF1A${detail.data?.status_name ?? actualStatus}\uFF09\u3002${hint}`
381
- });
382
- } else {
383
- results.push({
384
- fields: "status",
385
- errno: 2e3,
386
- errmsg: "\u72B6\u6001\u53D8\u66F4\u6210\u529F",
387
- actual_status: detail.data?.status_name
388
- });
389
- }
390
- } else {
391
- results.push({ fields: "status", ...sr });
392
- }
393
- }
394
- if (results.length === 0) {
395
- return { errno: 2e3, errmsg: "\u65E0\u9700\u66F4\u65B0\uFF08\u672A\u63D0\u4F9B\u4EFB\u4F55\u4FEE\u6539\u5B57\u6BB5\uFF09" };
396
- }
397
- if (results.length === 1) {
398
- return results[0];
399
- }
400
- return results;
401
- }
402
-
403
- // cli/commands/comment.ts
404
- async function cmdGetComments(subId, matterId) {
405
- return geelibGet("/bservice/Comment/getList", {
406
- sub_id: subId,
407
- type: "matter",
408
- id: matterId
409
- });
410
- }
411
- async function cmdAddComment(subId, matterId, content) {
412
- return geelibPost("/bservice/Comment/add", {
413
- sub_id: subId,
414
- type: "matter",
415
- id: matterId,
416
- content
417
- });
418
- }
419
-
420
- // cli/commands/poll.ts
421
- import { readFile, writeFile } from "node:fs/promises";
422
- import { join } from "node:path";
423
- var STATE_FILENAME = "geelib-poller-state.json";
424
- function stateFilePath(cwd) {
425
- return join(cwd, STATE_FILENAME);
426
- }
427
- async function readPollerState(cwd) {
428
- try {
429
- const raw = await readFile(stateFilePath(cwd), "utf8");
430
- const parsed = JSON.parse(raw);
431
- return {
432
- lastPollAt: parsed.lastPollAt ?? 0,
433
- processedMatterIds: Array.isArray(parsed.processedMatterIds) ? parsed.processedMatterIds.map(Number) : [],
434
- discovered: {
435
- sub_id: parsed.discovered?.sub_id ?? null,
436
- type_id: parsed.discovered?.type_id ?? null,
437
- pending_status_ids: Array.isArray(
438
- parsed.discovered?.pending_status_ids
439
- ) ? parsed.discovered.pending_status_ids.map(Number) : [],
440
- done_status_id: parsed.discovered?.done_status_id ?? null
441
- }
442
- };
443
- } catch {
444
- return {
445
- lastPollAt: 0,
446
- processedMatterIds: [],
447
- discovered: {
448
- sub_id: null,
449
- type_id: null,
450
- pending_status_ids: [],
451
- done_status_id: null
452
- }
453
- };
454
- }
455
- }
456
- async function writePollerState(cwd, state) {
457
- await writeFile(stateFilePath(cwd), `${JSON.stringify(state, null, 2)}
458
- `);
459
- }
460
- function extractMatterId(row) {
461
- const id = row.id ?? row.matter_id;
462
- if (typeof id === "number" && Number.isFinite(id)) {
463
- return id;
464
- }
465
- return null;
466
- }
467
- function isDoneStatusName(name, statusStage) {
468
- const stage = (statusStage ?? "").trim();
469
- if (stage.includes("\u5DF2\u5B8C\u6210") || stage.includes("\u5B8C\u6210")) {
470
- return true;
471
- }
472
- const n = name.toLowerCase();
473
- return n.includes("\u5B8C\u6210") || n.includes("\u5173\u95ED") || n.includes("done") || n.includes("closed");
474
- }
475
- function isPendingStatusName(name) {
476
- const n = name.toLowerCase();
477
- if (isDoneStatusName(n)) {
478
- return false;
479
- }
480
- return n.includes("\u5F85") || n.includes("\u8FDB\u884C") || n.includes("\u5904\u7406") || n.includes("open") || n.includes("progress") || n.includes("todo");
481
- }
482
- async function discoverConfig(state, subIdOverride, typeIdOverride) {
483
- if (subIdOverride !== void 0 && typeIdOverride !== void 0 && state.discovered.pending_status_ids.length > 0) {
484
- return {
485
- sub_id: subIdOverride,
486
- type_id: typeIdOverride,
487
- pending_status_ids: state.discovered.pending_status_ids,
488
- done_status_id: state.discovered.done_status_id
489
- };
490
- }
491
- let subId = subIdOverride ?? state.discovered.sub_id;
492
- if (subId === null) {
493
- const projects = await cmdListProjects();
494
- const projectList = Array.isArray(projects.data) ? projects.data : projects.data?.list;
495
- if (projects.errno !== 2e3 || !projectList?.length) {
496
- throw new Error("list-projects \u672A\u8FD4\u56DE\u53EF\u7528\u9879\u76EE");
497
- }
498
- const first = projectList[0];
499
- subId = first.id ?? first.sub_id ?? null;
500
- if (subId === null) {
501
- throw new Error("\u65E0\u6CD5\u4ECE\u9879\u76EE\u5217\u8868\u89E3\u6790 sub_id");
502
- }
503
- }
504
- let typeId = typeIdOverride ?? state.discovered.type_id;
505
- if (typeId === null) {
506
- const types = await cmdListMatterTypes(subId);
507
- if (types.errno !== 2e3 || !types.data?.length) {
508
- throw new Error(`list-matter-types(sub_id=${subId}) \u65E0\u6570\u636E`);
509
- }
510
- const taskType = types.data.find((t) => (t.type_name ?? t.name ?? "").includes("\u4EFB\u52A1")) ?? types.data[0];
511
- typeId = taskType.id ?? taskType.type_id ?? null;
512
- if (typeId === null) {
513
- throw new Error("\u65E0\u6CD5\u4ECE\u7C7B\u578B\u5217\u8868\u89E3\u6790 type_id");
514
- }
515
- }
516
- let pendingIds = state.discovered.pending_status_ids;
517
- let doneId = state.discovered.done_status_id;
518
- if (pendingIds.length === 0 || doneId === null) {
519
- const statuses = await cmdListMatterStatuses(subId, typeId);
520
- if (statuses.errno !== 2e3 || !statuses.data?.length) {
521
- throw new Error("list-matter-statuses \u65E0\u6570\u636E");
522
- }
523
- pendingIds = [];
524
- for (const s of statuses.data) {
525
- const sid = s.status_id ?? s.matterStatus?.id ?? s.id;
526
- const name = s.matterStatus?.status_name ?? s.name ?? "";
527
- const stage = s.matterStatus?.status_stage ?? "";
528
- if (sid === void 0) continue;
529
- if (isDoneStatusName(name, stage)) {
530
- if (doneId === null) {
531
- doneId = sid;
532
- }
533
- } else if (isPendingStatusName(name)) {
534
- pendingIds.push(sid);
535
- }
536
- }
537
- if (pendingIds.length === 0) {
538
- pendingIds = statuses.data.filter((s) => {
539
- const name = s.matterStatus?.status_name ?? s.name ?? "";
540
- const stage = s.matterStatus?.status_stage ?? "";
541
- return !isDoneStatusName(name, stage);
542
- }).map((s) => s.status_id ?? s.matterStatus?.id ?? s.id).filter((x) => x !== void 0 && x !== doneId);
543
- }
544
- }
545
- return {
546
- sub_id: subId,
547
- type_id: typeId,
548
- pending_status_ids: pendingIds,
549
- done_status_id: doneId
550
- };
551
- }
552
- async function cmdPoll(opts) {
553
- const state = await readPollerState(opts.cwd);
554
- const discovered = await discoverConfig(state, opts.subId, opts.typeId);
555
- state.discovered = discovered;
556
- const userInfo = await cmdGetUserInfo();
557
- if (userInfo.errno !== 2e3) {
558
- throw new Error(`get-user-info \u5931\u8D25: ${JSON.stringify(userInfo)}`);
559
- }
560
- const assigneeId = userInfo.data?.id ?? userInfo.data?.user_id;
561
- if (assigneeId === void 0) {
562
- throw new Error("\u65E0\u6CD5\u4ECE get-user-info \u89E3\u6790\u5F53\u524D\u7528\u6237 ID");
563
- }
564
- const subId = discovered.sub_id;
565
- const typeId = discovered.type_id;
566
- const listResp = await cmdListMatters({
567
- subId,
568
- typeId,
569
- page: 1,
570
- pageSize: 50,
571
- assigneeId
572
- });
573
- const allMatters = listResp.errno === 2e3 ? listResp.data?.list ?? listResp.data?.data ?? [] : [];
574
- const processedSet = new Set(state.processedMatterIds);
575
- const seen = /* @__PURE__ */ new Set();
576
- const candidates = [];
577
- for (const row of allMatters) {
578
- const mid = extractMatterId(row);
579
- if (mid === null || seen.has(mid) || processedSet.has(mid)) {
580
- continue;
581
- }
582
- seen.add(mid);
583
- candidates.push(row);
584
- }
585
- candidates.sort((a, b) => {
586
- const ta = a.create_time ?? a.updated_at ?? "";
587
- const tb = b.create_time ?? b.updated_at ?? "";
588
- return tb.localeCompare(ta);
589
- });
590
- const now = Date.now();
591
- state.lastPollAt = now;
592
- await writePollerState(opts.cwd, state);
593
- const matter = candidates.length > 0 ? candidates[0] : null;
594
- return {
595
- hasNew: matter !== null,
596
- matter,
597
- mattersTotal: candidates.length,
598
- lastPollAt: now,
599
- discovered
600
- };
601
- }
602
- async function cmdMarkProcessed(cwd, matterId) {
603
- const state = await readPollerState(cwd);
604
- if (!state.processedMatterIds.includes(matterId)) {
605
- state.processedMatterIds.push(matterId);
606
- }
607
- await writePollerState(cwd, state);
608
- return state;
609
- }
610
-
611
- // cli/index.ts
612
- var USAGE = `geelib CLI \u2014 GeeLib \u5DE5\u4F5C\u9879 API
613
-
614
- \u7528\u6CD5: geelib.mjs <command> [options]
615
-
616
- \u547D\u4EE4:
617
- get-user-info
618
- list-projects [--query=]
619
- list-active-projects
620
- get-project-detail --sub-id=
621
- list-project-members --sub-id=
622
- list-matter-types --sub-id=
623
- list-matter-statuses --sub-id= --type-id=
624
- list-matters --sub-id= --type-id= [--page=] [--page-size=] [--keyword=] [--status-id=] [--assignee-id=]
625
- get-matter --sub-id= --matter-id=
626
- update-matter --sub-id= --matter-id= [--title=] [--description=] [--status-id=] [--assignee-id=] [--priority=low|medium|high|urgent] [--progress=] [--sprint-id=]
627
- get-comments --sub-id= --matter-id=
628
- add-comment --sub-id= --matter-id= --content=
629
- poll [--sub-id=] [--type-id=] [--cwd=]
630
- mark-processed --matter-id= [--cwd=]
631
-
632
- \u73AF\u5883\u53D8\u91CF: GEELIB_USER, GEELIB_PASSWD\uFF08\u5FC5\u586B\uFF09
633
- `;
634
- function output(data) {
635
- process.stdout.write(`${JSON.stringify(data, null, 2)}
636
- `);
637
- }
638
- function resolveCwd(flags) {
639
- return flags.cwd ?? process.cwd();
640
- }
641
- async function main() {
642
- const { positional, flags } = parseArgs(process.argv.slice(2));
643
- const command = positional[0];
644
- if (!command || command === "help" || command === "--help") {
645
- process.stdout.write(USAGE);
646
- process.exit(command ? 0 : 1);
647
- }
648
- await login();
649
- switch (command) {
650
- case "get-user-info":
651
- output(await cmdGetUserInfo());
652
- break;
653
- case "list-projects":
654
- output(await cmdListProjects(flags.query ?? ""));
655
- break;
656
- case "list-active-projects":
657
- process.stdout.write(`${await cmdListActiveProjectsText()}
658
- `);
659
- break;
660
- case "get-project-detail":
661
- output(await cmdGetProjectDetail(flagNumber(flags, "sub-id")));
662
- break;
663
- case "list-project-members":
664
- output(await cmdListProjectMembers(flagNumber(flags, "sub-id")));
665
- break;
666
- case "list-matter-types":
667
- output(await cmdListMatterTypes(flagNumber(flags, "sub-id")));
668
- break;
669
- case "list-matter-statuses":
670
- output(
671
- await cmdListMatterStatuses(
672
- flagNumber(flags, "sub-id"),
673
- flagNumber(flags, "type-id")
674
- )
675
- );
676
- break;
677
- case "list-matters":
678
- output(
679
- await cmdListMatters({
680
- subId: flagNumber(flags, "sub-id"),
681
- typeId: flagNumber(flags, "type-id"),
682
- page: flagOptionalNumber(flags, "page"),
683
- pageSize: flagOptionalNumber(flags, "page-size"),
684
- keyword: flags.keyword,
685
- statusId: flagOptionalNumber(flags, "status-id"),
686
- assigneeId: flagOptionalNumber(flags, "assignee-id")
687
- })
688
- );
689
- break;
690
- case "get-matter":
691
- output(
692
- await cmdGetMatter(
693
- flagNumber(flags, "sub-id"),
694
- flagNumber(flags, "matter-id")
695
- )
696
- );
697
- break;
698
- case "update-matter":
699
- output(
700
- await cmdUpdateMatter({
701
- subId: flagNumber(flags, "sub-id"),
702
- matterId: flagNumber(flags, "matter-id"),
703
- title: flags.title,
704
- description: flags.description,
705
- statusId: flagOptionalNumber(flags, "status-id"),
706
- assigneeId: flagOptionalNumber(flags, "assignee-id"),
707
- priority: flags.priority,
708
- progress: flagOptionalNumber(flags, "progress"),
709
- sprintId: flagOptionalNumber(flags, "sprint-id")
710
- })
711
- );
712
- break;
713
- case "get-comments":
714
- output(
715
- await cmdGetComments(
716
- flagNumber(flags, "sub-id"),
717
- flagNumber(flags, "matter-id")
718
- )
719
- );
720
- break;
721
- case "add-comment": {
722
- const content = requireFlag(flags, "content");
723
- output(
724
- await cmdAddComment(
725
- flagNumber(flags, "sub-id"),
726
- flagNumber(flags, "matter-id"),
727
- content
728
- )
729
- );
730
- break;
731
- }
732
- case "poll":
733
- output(
734
- await cmdPoll({
735
- cwd: resolveCwd(flags),
736
- subId: flagOptionalNumber(flags, "sub-id"),
737
- typeId: flagOptionalNumber(flags, "type-id")
738
- })
739
- );
740
- break;
741
- case "mark-processed":
742
- output(
743
- await cmdMarkProcessed(
744
- resolveCwd(flags),
745
- flagNumber(flags, "matter-id")
746
- )
747
- );
748
- break;
749
- default:
750
- process.stderr.write(`\u672A\u77E5\u547D\u4EE4: ${command}
751
-
752
- ${USAGE}`);
753
- process.exit(1);
754
- }
755
- }
756
- main().catch((err) => {
757
- process.stderr.write(
758
- `[geelib-cli] ${err instanceof Error ? err.message : String(err)}
759
- `
760
- );
761
- process.exit(1);
762
- });