@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.
- package/.env.example +2 -1
- package/dist/404/index.html +1 -1
- package/dist/404.html +1 -1
- package/dist/_next/static/chunks/19aa69c07b3642d5.js +1 -0
- package/dist/_next/static/chunks/24459c7365a2b28b.js +1 -0
- package/dist/_next/static/chunks/{d3e2070a86378cfb.js → 33eeef286c328da0.js} +1 -1
- package/dist/_next/static/chunks/3407244006d6a98a.js +1 -0
- package/dist/_next/static/chunks/566e152e480b267a.js +1 -0
- package/dist/_next/static/chunks/6ad4268160f361a6.js +1 -0
- package/dist/_next/static/chunks/{d9a278a2a26e8ee5.js → 6f9a48a7f83e669a.js} +1 -1
- package/dist/_next/static/chunks/7658b5b9c2865eb1.js +1 -0
- package/dist/_next/static/chunks/7a5fd448b280dd64.js +1 -0
- package/dist/_next/static/chunks/{fa677aa06f1c0539.js → 98f0c5604e839ba2.js} +1 -1
- package/dist/_next/static/chunks/a38eccf0bb5ca1e9.js +1 -0
- package/dist/_next/static/chunks/b29a354245bfc377.css +1 -0
- package/dist/_next/static/chunks/b76778c5811ef7a1.js +1 -0
- package/dist/_next/static/chunks/c2bed9d5fa7be4bd.js +1 -0
- package/dist/_next/static/chunks/c5a4977aae6a008c.js +1 -0
- package/dist/_next/static/chunks/e7bd145455a541af.css +4 -0
- package/dist/_next/static/chunks/f2bb685629307d4d.js +1 -0
- package/dist/_next/static/chunks/f7e71ce1c236f806.js +1 -0
- package/dist/_next/static/chunks/{67acc15b8a448e1a.js → fc4be3bcf72559a0.js} +1 -1
- package/dist/index.html +1 -1
- package/dist/index.txt +16 -16
- package/dist/manage/about/index.html +2 -2
- package/dist/manage/about/index.txt +19 -19
- package/dist/manage/add-account/basic/index.html +2 -2
- package/dist/manage/add-account/basic/index.txt +23 -22
- package/dist/manage/add-account/index.html +2 -2
- package/dist/manage/add-account/index.txt +22 -23
- package/dist/manage/agent-teams/index.html +2 -2
- package/dist/manage/agent-teams/index.txt +21 -21
- package/dist/manage/env/index.html +2 -2
- package/dist/manage/env/index.txt +21 -21
- package/dist/manage/general/index.html +2 -2
- package/dist/manage/general/index.txt +19 -19
- package/dist/manage/index.html +1 -1
- package/dist/manage/index.txt +16 -16
- package/dist/manage/mcp/index.html +2 -2
- package/dist/manage/mcp/index.txt +21 -21
- package/dist/manage/permissions/index.html +2 -2
- package/dist/manage/permissions/index.txt +19 -19
- package/dist/manage/skills/index.html +2 -2
- package/dist/manage/skills/index.txt +21 -21
- package/dist/manage/task/index.html +2 -2
- package/dist/manage/task/index.txt +19 -19
- package/dist/manage/teams/index.html +2 -2
- package/dist/manage/teams/index.txt +19 -19
- package/dist/manage/tools/index.html +2 -2
- package/dist/manage/tools/index.txt +21 -21
- package/dist/ws-test.html +129 -191
- package/mcps-runtime/claude-geelib-channel/.mcp.json +18 -0
- package/mcps-runtime/claude-geelib-channel/server/boot.mjs +32 -0
- package/mcps-runtime/claude-geelib-channel/server/geelib-api.mjs +192 -0
- package/mcps-runtime/claude-geelib-channel/server/geelib-auth.mjs +147 -0
- package/mcps-runtime/claude-geelib-channel/server/geelib-client.mjs +63 -0
- package/mcps-runtime/claude-geelib-channel/server/index.mjs +451 -0
- package/mcps-runtime/claude-geelib-channel/server/poll.mjs +457 -0
- package/mcps-runtime/claude-geelib-channel/server/state.mjs +216 -0
- package/package.json +6 -6
- package/tools-runtime/code-tool/index.cjs +1 -0
- package/tools-runtime/code-tool/src/index.ts +7 -1
- package/tools-runtime/git-tool/index.cjs +69 -5
- package/tools-runtime/git-tool/src/workspace.ts +101 -4
- package/tools-runtime/git-tool/src/wsInit.ts +26 -3
- package/dist/_next/static/chunks/249606605eed1993.js +0 -1
- package/dist/_next/static/chunks/424d3f3f176d43d7.js +0 -1
- package/dist/_next/static/chunks/4302af16b34bf750.js +0 -1
- package/dist/_next/static/chunks/4a073924e062c459.css +0 -1
- package/dist/_next/static/chunks/6209b42cbfcf288a.js +0 -1
- package/dist/_next/static/chunks/83bf6e4bc0aad48b.css +0 -4
- package/dist/_next/static/chunks/8b34d657c6bbb8df.js +0 -1
- package/dist/_next/static/chunks/904ad158fd721117.js +0 -1
- package/dist/_next/static/chunks/99063f8d79783308.js +0 -1
- package/dist/_next/static/chunks/9cd912a1967f10df.js +0 -1
- package/dist/_next/static/chunks/c52dcbe269bb02d0.js +0 -1
- package/dist/_next/static/chunks/d01957b1055b357a.js +0 -1
- package/dist/_next/static/chunks/dacc94cf10289334.js +0 -1
- package/dist/_next/static/chunks/fff9d250e482f00e.js +0 -1
- package/skills-runtime/geelib/SKILL.md +0 -229
- package/skills-runtime/geelib/geelib-poller-state.json +0 -17
- package/skills-runtime/geelib/geelib.mjs +0 -762
- /package/dist/_next/static/{fg4nA8liSSLEgWV4WTZDt → pVB1xZbEW09ksdJlV12Zn}/_buildManifest.js +0 -0
- /package/dist/_next/static/{fg4nA8liSSLEgWV4WTZDt → pVB1xZbEW09ksdJlV12Zn}/_clientMiddlewareManifest.json +0 -0
- /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
|
-
});
|