@done-coding/cli-utils 0.8.2-alpha.0 → 0.8.2-alpha.1
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/es/index.mjs +607 -345
- package/package.json +2 -4
- package/types/index.d.ts +153 -7
package/es/index.mjs
CHANGED
|
@@ -1,55 +1,227 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
2
|
+
import { randomUUID as Ct } from "node:crypto";
|
|
3
|
+
import { homedir as W, tmpdir as z } from "node:os";
|
|
4
|
+
import l from "node:path";
|
|
5
|
+
import g, { existsSync as A, mkdirSync as yt, writeFileSync as G, readFileSync as v } from "node:fs";
|
|
6
|
+
import M from "crypto";
|
|
7
|
+
import X from "chalk";
|
|
8
|
+
import Ot from "prompts";
|
|
9
|
+
import Rt from "yargs";
|
|
10
|
+
import { hideBin as vt } from "yargs/helpers";
|
|
11
|
+
import { execSync as Y } from "node:child_process";
|
|
12
|
+
import Z from "json5";
|
|
11
13
|
export * from "json5";
|
|
12
|
-
import { default as
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
14
|
+
import { default as Cr } from "json5";
|
|
15
|
+
import Mt from "lodash.merge";
|
|
16
|
+
import It from "semver";
|
|
17
|
+
import { default as Or } from "lodash.get";
|
|
18
|
+
import { default as vr } from "lodash.set";
|
|
19
|
+
import { default as Ir } from "lodash.curry";
|
|
20
|
+
import R from "pinyin";
|
|
21
|
+
const q = "__DONE_CODING_ENV_CONFIG__", Q = Symbol.for(
|
|
22
|
+
q
|
|
23
|
+
), F = ".done-coding", $t = `${F}/cli/assets-config`, At = "assets", Pt = "index.json", Nt = `${F}/config.json`, Lt = "output/log", Dt = "default", Tt = "https://gitee.com/justsosu/done-coding-cli-assets-config.git", Gt = /[^a-zA-Z0-9._\-]/, wt = /[^a-zA-Z0-9._\-]/g, xe = (t) => t ? !Gt.test(t) : !1, bt = (t) => (t || "_").replace(wt, "_"), tt = () => {
|
|
24
|
+
const t = /* @__PURE__ */ new Date();
|
|
25
|
+
return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, "0")}-${String(t.getDate()).padStart(2, "0")} ${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}:${String(t.getSeconds()).padStart(2, "0")}`;
|
|
26
|
+
}, et = () => Ct();
|
|
27
|
+
var Ft = /* @__PURE__ */ ((t) => (t.DEFAULT = "DEFAULT", t.MCP = "MCP", t))(Ft || {}), Bt = /* @__PURE__ */ ((t) => (t.GLOBAL_CONFIG_IMAGE = "GLOBAL_CONFIG_IMAGE", t))(Bt || {});
|
|
28
|
+
const rt = (t) => `${q}_${t}`, st = (t, e) => {
|
|
29
|
+
const r = process.env[rt(t)];
|
|
30
|
+
if (r !== void 0)
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(r).value;
|
|
33
|
+
} catch {
|
|
34
|
+
return e;
|
|
35
|
+
}
|
|
36
|
+
else
|
|
37
|
+
return e;
|
|
38
|
+
}, Ut = (t, e) => {
|
|
39
|
+
if (st(t) !== void 0)
|
|
40
|
+
return !1;
|
|
41
|
+
const s = rt(t), n = { value: e };
|
|
42
|
+
return process.env[s] = JSON.stringify(n), !0;
|
|
43
|
+
}, B = () => globalThis[Q], U = (t) => {
|
|
44
|
+
const e = B();
|
|
45
|
+
if (e)
|
|
46
|
+
return e;
|
|
47
|
+
const r = Object.freeze({
|
|
48
|
+
...t
|
|
37
49
|
});
|
|
38
|
-
|
|
50
|
+
return Object.defineProperty(globalThis, Q, {
|
|
51
|
+
value: r,
|
|
52
|
+
writable: !1,
|
|
53
|
+
enumerable: !1,
|
|
54
|
+
configurable: !1
|
|
55
|
+
}), Ut("GLOBAL_CONFIG_IMAGE", r), r;
|
|
56
|
+
}, nt = () => st(
|
|
57
|
+
"GLOBAL_CONFIG_IMAGE"
|
|
58
|
+
/* GLOBAL_CONFIG_IMAGE */
|
|
59
|
+
), jt = typeof process.send == "function", ot = (t = Dt) => {
|
|
60
|
+
const e = bt(t);
|
|
61
|
+
return {
|
|
62
|
+
callMode: "DEFAULT",
|
|
63
|
+
series: e,
|
|
64
|
+
consoleLog: !0,
|
|
65
|
+
logOutputDir: `${F}/${e}/${Lt}`,
|
|
66
|
+
processLogFileNameList: []
|
|
67
|
+
};
|
|
68
|
+
}, j = `${tt()}-${et()}`, it = (t) => {
|
|
69
|
+
const e = {
|
|
70
|
+
...t,
|
|
71
|
+
processLogFileNameList: [
|
|
72
|
+
j,
|
|
73
|
+
...t.processLogFileNameList
|
|
74
|
+
].slice(0, 10)
|
|
75
|
+
};
|
|
76
|
+
return U(e);
|
|
77
|
+
}, C = () => {
|
|
78
|
+
const t = B();
|
|
79
|
+
if (t)
|
|
80
|
+
return t;
|
|
81
|
+
const e = nt();
|
|
82
|
+
if (e)
|
|
83
|
+
return it(e);
|
|
84
|
+
{
|
|
85
|
+
const s = {
|
|
86
|
+
...ot(),
|
|
87
|
+
processLogFileNameList: [j]
|
|
88
|
+
};
|
|
89
|
+
return U(s);
|
|
90
|
+
}
|
|
91
|
+
}, ke = ({
|
|
92
|
+
series: t,
|
|
93
|
+
...e
|
|
94
|
+
}) => {
|
|
95
|
+
if (jt)
|
|
96
|
+
throw new Error("非顶级进程不允许调用该方法");
|
|
97
|
+
if (B())
|
|
98
|
+
throw new Error(`内存全局配置存在,说明是以下某个原因:
|
|
99
|
+
1. 顶级进程重复调用initEnvConfig
|
|
100
|
+
2. 顶级进程在调用该方法之前调用了getApplyConfig, 即获取配置应用的同时会冻结配置 不会后续变化
|
|
101
|
+
------
|
|
102
|
+
如果是顶级进程 请第一时间调用,请给对应调用包专门顶级进程才会调用的入口 并调用此方法
|
|
103
|
+
如 mcp模式入口 需要第一时间调用此方法
|
|
104
|
+
`);
|
|
105
|
+
{
|
|
106
|
+
const s = nt();
|
|
107
|
+
if (s)
|
|
108
|
+
return it(s);
|
|
109
|
+
{
|
|
110
|
+
const o = {
|
|
111
|
+
...ot(t),
|
|
112
|
+
...e,
|
|
113
|
+
processLogFileNameList: [j]
|
|
114
|
+
};
|
|
115
|
+
return U(o);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}, ct = () => C().callMode, xt = () => ct() === "MCP", at = () => xt() ? !1 : C().consoleLog, kt = (t = !1) => l.resolve(
|
|
119
|
+
t ? W() : z(),
|
|
120
|
+
C().logOutputDir
|
|
121
|
+
), Ht = () => C().processLogFileNameList[0], Jt = () => C().processLogFileNameList[1];
|
|
122
|
+
var m = /* @__PURE__ */ ((t) => (t.SYSTEM = "magenta", t.SUCCESS = "greenBright", t.STAGE = "blue", t.INFO = "white", t.WARN = "yellow", t.ERROR = "redBright", t.SKIP = "dim", t.TABLE = "table", t))(m || {});
|
|
123
|
+
const Yt = Object.entries(m).reduce(
|
|
124
|
+
(t, [e, r]) => (t[r] = e, t),
|
|
125
|
+
{}
|
|
126
|
+
), Vt = (t) => Yt[t] ?? t, E = /* @__PURE__ */ new Map(), Kt = (t) => {
|
|
127
|
+
const e = l.resolve(t), r = l.dirname(e), s = E.get(e);
|
|
128
|
+
if (s) {
|
|
129
|
+
if (!s.destroyed && s.writable)
|
|
130
|
+
return s;
|
|
131
|
+
E.delete(e);
|
|
132
|
+
}
|
|
133
|
+
g.existsSync(r) || g.mkdirSync(r, { recursive: !0 });
|
|
134
|
+
const n = g.openSync(e, "a"), o = g.createWriteStream(e, {
|
|
135
|
+
fd: n,
|
|
136
|
+
autoClose: !0,
|
|
137
|
+
// 关键:stream 销毁时自动关 fd
|
|
138
|
+
encoding: "utf8",
|
|
139
|
+
highWaterMark: 64 * 1024
|
|
140
|
+
});
|
|
141
|
+
if (o.on("error", () => {
|
|
142
|
+
E.delete(e), o.destroy();
|
|
143
|
+
}), o.on("close", () => {
|
|
144
|
+
E.delete(e);
|
|
145
|
+
}), E.set(e, o), typeof o.fd != "number")
|
|
146
|
+
throw new Error(
|
|
147
|
+
`Failed to get file descriptor from stream for ${o.path}`
|
|
148
|
+
);
|
|
149
|
+
return o;
|
|
150
|
+
};
|
|
151
|
+
process.once("exit", () => {
|
|
152
|
+
for (const t of E.values())
|
|
153
|
+
try {
|
|
154
|
+
t.destroyed || t.end();
|
|
155
|
+
} catch {
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
const d = ({
|
|
159
|
+
stream: t,
|
|
160
|
+
type: e,
|
|
161
|
+
content: r
|
|
162
|
+
}) => t.write(
|
|
163
|
+
`[${tt()}] [${Vt(e)}] ${r}
|
|
164
|
+
`
|
|
165
|
+
);
|
|
166
|
+
let V = !1;
|
|
167
|
+
const ft = () => {
|
|
168
|
+
const t = kt(), e = l.resolve(t, Ht()), r = Kt(e);
|
|
169
|
+
if (!V) {
|
|
170
|
+
const s = Jt();
|
|
171
|
+
s && d({
|
|
172
|
+
stream: r,
|
|
173
|
+
type: m.SYSTEM,
|
|
174
|
+
content: `父进程日志文件: ${s}`
|
|
175
|
+
});
|
|
176
|
+
const n = ct();
|
|
177
|
+
d({
|
|
178
|
+
stream: r,
|
|
179
|
+
type: m.SYSTEM,
|
|
180
|
+
content: `当前调用模式: ${n}`
|
|
181
|
+
}), V = !0;
|
|
182
|
+
}
|
|
183
|
+
return r;
|
|
184
|
+
}, Wt = (t, e) => {
|
|
185
|
+
const r = ft(), s = t.map((n) => n instanceof Error ? n.stack || n.message : typeof n == "object" && n !== null ? JSON.stringify(n) : String(n)).join(" ");
|
|
186
|
+
d({
|
|
187
|
+
stream: r,
|
|
188
|
+
type: e,
|
|
189
|
+
content: s
|
|
190
|
+
});
|
|
191
|
+
}, zt = (...[t, ...e]) => at() ? t === m.TABLE ? console.table(...e) : console.log(X[t](...e)) : Wt(e, t), lt = (t) => Object.assign(t, {
|
|
192
|
+
/** 系统 */
|
|
193
|
+
system: (...e) => t(m.SYSTEM, ...e),
|
|
194
|
+
/** 成功 */
|
|
195
|
+
success: (...e) => t(m.SUCCESS, ...e),
|
|
196
|
+
/** /步骤 */
|
|
197
|
+
stage: (...e) => t(m.STAGE, ...e),
|
|
198
|
+
/** 提示信息 */
|
|
199
|
+
info: (...e) => t(m.INFO, ...e),
|
|
200
|
+
/** 警告 */
|
|
201
|
+
warn: (...e) => t(m.WARN, ...e),
|
|
202
|
+
/** 错误 */
|
|
203
|
+
error: (...e) => t(m.ERROR, ...e),
|
|
204
|
+
/** 跳过 */
|
|
205
|
+
skip: (...e) => t(m.SKIP, ...e),
|
|
206
|
+
/** 表格 */
|
|
207
|
+
table: (...e) => t(m.TABLE, ...e)
|
|
208
|
+
}), a = lt(zt), He = lt(
|
|
209
|
+
(t, ...e) => t === m.TABLE ? JSON.stringify(e) : X[t](...e)
|
|
210
|
+
), Je = (t, {
|
|
39
211
|
/** 当前目录 */
|
|
40
212
|
currentDir: e = process.cwd(),
|
|
41
213
|
/** 优先找最远的父目录 */
|
|
42
214
|
isFindFarthest: r = !0
|
|
43
215
|
} = {}) => {
|
|
44
|
-
const
|
|
45
|
-
for (;
|
|
46
|
-
const
|
|
47
|
-
if (
|
|
48
|
-
return
|
|
216
|
+
const s = l.resolve(e).split(l.sep).map((n, o, c) => c.slice(0, o).concat(n).join(l.sep) || l.sep);
|
|
217
|
+
for (; s.length; ) {
|
|
218
|
+
const n = r ? s.shift() : s.pop(), o = l.join(n, t);
|
|
219
|
+
if (g.existsSync(o))
|
|
220
|
+
return n;
|
|
49
221
|
}
|
|
50
|
-
},
|
|
51
|
-
function
|
|
52
|
-
return
|
|
222
|
+
}, ut = "aes-256-cbc", gt = 16, I = "hex", w = ":";
|
|
223
|
+
function pt(t) {
|
|
224
|
+
return M.pbkdf2Sync(
|
|
53
225
|
t,
|
|
54
226
|
"done-coding-cli-salt",
|
|
55
227
|
// 使用固定的盐值
|
|
@@ -60,67 +232,67 @@ function U(t) {
|
|
|
60
232
|
"sha256"
|
|
61
233
|
);
|
|
62
234
|
}
|
|
63
|
-
function
|
|
235
|
+
function Ye({
|
|
64
236
|
text: t,
|
|
65
237
|
secretKey: e
|
|
66
238
|
}) {
|
|
67
239
|
try {
|
|
68
|
-
const r =
|
|
69
|
-
let o =
|
|
70
|
-
o = Buffer.concat([o,
|
|
71
|
-
const c =
|
|
72
|
-
return `${c}${
|
|
240
|
+
const r = pt(e), s = M.randomBytes(gt), n = M.createCipheriv(ut, r, s);
|
|
241
|
+
let o = n.update(t);
|
|
242
|
+
o = Buffer.concat([o, n.final()]);
|
|
243
|
+
const c = s.toString(I), i = o.toString(I);
|
|
244
|
+
return `${c}${w}${i}`;
|
|
73
245
|
} catch (r) {
|
|
74
246
|
return a.error(
|
|
75
247
|
`加密失败: ${r instanceof Error ? r.message : String(r)}`
|
|
76
248
|
), "";
|
|
77
249
|
}
|
|
78
250
|
}
|
|
79
|
-
function
|
|
251
|
+
function Ve({
|
|
80
252
|
encryptedText: t,
|
|
81
253
|
secretKey: e
|
|
82
254
|
}) {
|
|
83
255
|
try {
|
|
84
|
-
if (!t.includes(
|
|
256
|
+
if (!t.includes(w))
|
|
85
257
|
return "";
|
|
86
|
-
const r =
|
|
87
|
-
if (
|
|
258
|
+
const r = pt(e), [s, n] = t.split(w);
|
|
259
|
+
if (s.length !== gt * 2)
|
|
88
260
|
return "";
|
|
89
|
-
const o = Buffer.from(
|
|
90
|
-
let
|
|
91
|
-
return
|
|
261
|
+
const o = Buffer.from(s, I), c = Buffer.from(n, I), i = M.createDecipheriv(ut, r, o);
|
|
262
|
+
let f = i.update(c);
|
|
263
|
+
return f = Buffer.concat([f, i.final()]), f.toString();
|
|
92
264
|
} catch (r) {
|
|
93
265
|
return a.error(
|
|
94
266
|
`解密失败: ${r instanceof Error ? r.message : String(r)}`
|
|
95
267
|
), "";
|
|
96
268
|
}
|
|
97
269
|
}
|
|
98
|
-
const
|
|
270
|
+
const P = (...t) => {
|
|
99
271
|
const [e, r = {}] = t;
|
|
100
|
-
return
|
|
101
|
-
onCancel(
|
|
102
|
-
return a.error(`退出${
|
|
272
|
+
return Ot(e, {
|
|
273
|
+
onCancel(s) {
|
|
274
|
+
return a.error(`退出${s == null ? void 0 : s.name}输入`), process.exit(1);
|
|
103
275
|
},
|
|
104
276
|
...r
|
|
105
277
|
});
|
|
106
|
-
},
|
|
278
|
+
}, Ke = async ({
|
|
107
279
|
isMCP: t,
|
|
108
280
|
key: e,
|
|
109
281
|
presetAnswer: r,
|
|
110
|
-
defaultValue:
|
|
111
|
-
questionConfig:
|
|
282
|
+
defaultValue: s,
|
|
283
|
+
questionConfig: n
|
|
112
284
|
}) => {
|
|
113
285
|
if (t) {
|
|
114
286
|
const o = r == null ? void 0 : r[e];
|
|
115
287
|
return o === void 0 ? (a.error("MCP场景的约束值不能为空"), process.exit(1)) : o;
|
|
116
288
|
} else
|
|
117
|
-
return (r == null ? void 0 : r[e]) ??
|
|
118
|
-
},
|
|
289
|
+
return (r == null ? void 0 : r[e]) ?? s ?? (await P(n))[e];
|
|
290
|
+
}, We = async (t, e) => (await P(e))[t], Xt = (t, e) => {
|
|
119
291
|
t ? a.error(t) : a.error(e.message), e != null && e.stack && a.error(e.stack), process.exit(1);
|
|
120
|
-
},
|
|
121
|
-
const t =
|
|
122
|
-
return
|
|
123
|
-
},
|
|
292
|
+
}, Zt = () => {
|
|
293
|
+
const t = vt(process.argv);
|
|
294
|
+
return Rt(t);
|
|
295
|
+
}, ze = ({
|
|
124
296
|
rootScriptName: t,
|
|
125
297
|
packageJson: e
|
|
126
298
|
}) => {
|
|
@@ -128,51 +300,109 @@ const I = (...t) => {
|
|
|
128
300
|
return t;
|
|
129
301
|
if (!e)
|
|
130
302
|
return;
|
|
131
|
-
const { bin: r, name:
|
|
303
|
+
const { bin: r, name: s } = e;
|
|
132
304
|
if (r) {
|
|
133
305
|
if (typeof r == "string")
|
|
134
|
-
return
|
|
306
|
+
return s.includes("/") ? void 0 : s;
|
|
135
307
|
if (typeof r == "object") {
|
|
136
|
-
const
|
|
308
|
+
const n = Object.entries(r), o = process.argv[1], c = n.filter(([, f]) => o == null ? void 0 : o.endsWith(f));
|
|
137
309
|
if (c.length !== 1)
|
|
138
310
|
return;
|
|
139
311
|
const [i] = c[0];
|
|
140
312
|
return process.platform === "win32" ? i.toLowerCase() : i;
|
|
141
313
|
}
|
|
142
314
|
}
|
|
143
|
-
},
|
|
315
|
+
}, mt = (t, {
|
|
144
316
|
usage: e,
|
|
145
317
|
version: r,
|
|
146
|
-
demandCommandCount:
|
|
147
|
-
options:
|
|
318
|
+
demandCommandCount: s,
|
|
319
|
+
options: n,
|
|
148
320
|
positionals: o,
|
|
149
321
|
subcommands: c,
|
|
150
322
|
rootScriptName: i
|
|
151
|
-
},
|
|
152
|
-
let
|
|
153
|
-
e && (
|
|
154
|
-
const
|
|
155
|
-
return
|
|
156
|
-
},
|
|
157
|
-
const r = await
|
|
158
|
-
|
|
323
|
+
}, f) => {
|
|
324
|
+
let u = t.strict();
|
|
325
|
+
e && (u = u.usage(`Usage: ${e}`)), s && (u = u.demandCommand(s));
|
|
326
|
+
const S = "help";
|
|
327
|
+
return u = u.help(S), r ? u = u.version(r).alias("h", S).alias("v", "version") : u = u.alias("h", S), n && (u = u.options(n)), o && (u = Object.entries(o).reduce((y, [L, h]) => y.positional(L, h), u)), c && (u = u.command(c)), f && i && (u = u.scriptName(i)), u;
|
|
328
|
+
}, Xe = async ({ handler: t, ...e }) => {
|
|
329
|
+
const r = await mt(Zt(), e, !0).fail(
|
|
330
|
+
Xt
|
|
159
331
|
).argv;
|
|
160
332
|
return t ? t(r) : r;
|
|
161
|
-
},
|
|
162
|
-
const { command: e, describe: r, handler:
|
|
163
|
-
}, ...
|
|
333
|
+
}, Ze = (t) => {
|
|
334
|
+
const { command: e, describe: r, handler: s = () => {
|
|
335
|
+
}, ...n } = t;
|
|
164
336
|
return {
|
|
165
337
|
command: e,
|
|
166
338
|
describe: r,
|
|
167
339
|
builder(o) {
|
|
168
|
-
return
|
|
340
|
+
return mt(o, n, !1);
|
|
169
341
|
},
|
|
170
|
-
handler:
|
|
342
|
+
handler: s
|
|
171
343
|
};
|
|
344
|
+
}, qt = (t) => {
|
|
345
|
+
if (!t)
|
|
346
|
+
return ["pipe", "pipe", "pipe"];
|
|
347
|
+
if (typeof t == "string")
|
|
348
|
+
switch (t) {
|
|
349
|
+
case "ignore":
|
|
350
|
+
return ["ignore", "ignore", "ignore"];
|
|
351
|
+
case "inherit":
|
|
352
|
+
return ["inherit", "inherit", "inherit"];
|
|
353
|
+
case "overlapped":
|
|
354
|
+
return ["overlapped", "overlapped", "overlapped"];
|
|
355
|
+
default:
|
|
356
|
+
return ["pipe", "pipe", "pipe"];
|
|
357
|
+
}
|
|
358
|
+
if (Array.isArray(t)) {
|
|
359
|
+
const e = [...t];
|
|
360
|
+
for (let r = 0; r < 3; r++)
|
|
361
|
+
e[r] === void 0 && (e[r] = "pipe");
|
|
362
|
+
return e;
|
|
363
|
+
}
|
|
364
|
+
return ["pipe", "pipe", "pipe"];
|
|
365
|
+
}, p = (t, e) => {
|
|
366
|
+
if (at() || (e == null ? void 0 : e.stdio) === "ignore")
|
|
367
|
+
return Y(t, e);
|
|
368
|
+
const s = ft(), n = s.fd, o = qt(e == null ? void 0 : e.stdio), c = o.map((i, f) => f === 0 ? "ignore" : (f === 1 || f === 2) && (i === "inherit" || i === "overlapped") ? n : i);
|
|
369
|
+
try {
|
|
370
|
+
d({
|
|
371
|
+
stream: s,
|
|
372
|
+
type: m.SYSTEM,
|
|
373
|
+
content: `[子进程任务开始执行] ${t}`
|
|
374
|
+
});
|
|
375
|
+
const i = Y(t, {
|
|
376
|
+
maxBuffer: 1024 * 1024 * 100,
|
|
377
|
+
// 增加到 100MB,防止 pipe 模式下大数据溢出
|
|
378
|
+
...e,
|
|
379
|
+
stdio: c,
|
|
380
|
+
encoding: (e == null ? void 0 : e.encoding) || "utf-8"
|
|
381
|
+
});
|
|
382
|
+
return i && o[1] === "pipe" ? d({
|
|
383
|
+
stream: s,
|
|
384
|
+
type: m.SYSTEM,
|
|
385
|
+
content: `[任务执行成功返回]: ${i.toString().trim()}`
|
|
386
|
+
}) : d({
|
|
387
|
+
stream: s,
|
|
388
|
+
type: m.SYSTEM,
|
|
389
|
+
content: "[任务执行成功]"
|
|
390
|
+
}), i;
|
|
391
|
+
} catch (i) {
|
|
392
|
+
const f = i.stderr ? `
|
|
393
|
+
STDERR: ${i.stderr}` : "";
|
|
394
|
+
throw d({
|
|
395
|
+
stream: s,
|
|
396
|
+
type: m.ERROR,
|
|
397
|
+
content: `[任务执行失败]: ${t}
|
|
398
|
+
STATUS: ${i.status}
|
|
399
|
+
MSG: ${i.message}${f}`
|
|
400
|
+
}), i;
|
|
401
|
+
}
|
|
172
402
|
};
|
|
173
|
-
var
|
|
174
|
-
const
|
|
175
|
-
const { editorType: t } = await
|
|
403
|
+
var Qt = /* @__PURE__ */ ((t) => (t.VSCODE = "VsCode", t.CURSOR = "Cursor", t.OTHER = "其他", t))(Qt || {});
|
|
404
|
+
const te = async () => {
|
|
405
|
+
const { editorType: t } = await P([
|
|
176
406
|
{
|
|
177
407
|
name: "editorType",
|
|
178
408
|
type: "select",
|
|
@@ -189,32 +419,32 @@ const ft = async () => {
|
|
|
189
419
|
}
|
|
190
420
|
]);
|
|
191
421
|
return t;
|
|
192
|
-
},
|
|
422
|
+
}, ee = {
|
|
193
423
|
Cursor: "cursor",
|
|
194
424
|
VsCode: "code"
|
|
195
|
-
},
|
|
425
|
+
}, re = (t, e, r) => {
|
|
196
426
|
try {
|
|
197
|
-
|
|
427
|
+
p(`${t} -v`, { stdio: "ignore" }), p(`${t} ${e}`);
|
|
198
428
|
} catch {
|
|
199
429
|
r();
|
|
200
430
|
}
|
|
201
|
-
},
|
|
202
|
-
const r = (
|
|
203
|
-
${
|
|
431
|
+
}, se = (t, e) => {
|
|
432
|
+
const r = (s) => a.info(`
|
|
433
|
+
${s}, 请用编辑器打开 ${t} 进行编辑
|
|
204
434
|
`);
|
|
205
435
|
switch (e) {
|
|
206
436
|
case "Cursor":
|
|
207
437
|
case "VsCode": {
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
r(`${
|
|
438
|
+
const s = ee[e];
|
|
439
|
+
re(s, t, () => {
|
|
440
|
+
r(`${s}命令未安装`);
|
|
211
441
|
});
|
|
212
442
|
break;
|
|
213
443
|
}
|
|
214
444
|
default:
|
|
215
445
|
r("其他编辑器");
|
|
216
446
|
}
|
|
217
|
-
},
|
|
447
|
+
}, ne = (t = process.cwd()) => ({
|
|
218
448
|
/** 必须保留 */
|
|
219
449
|
rootDir: {
|
|
220
450
|
type: "string",
|
|
@@ -223,12 +453,12 @@ const ft = async () => {
|
|
|
223
453
|
/** 必须设置默认值 */
|
|
224
454
|
default: t
|
|
225
455
|
}
|
|
226
|
-
}),
|
|
456
|
+
}), qe = ({
|
|
227
457
|
configPathDefault: t,
|
|
228
458
|
rootDirDefault: e
|
|
229
459
|
}) => ({
|
|
230
460
|
/** 必须保留 */
|
|
231
|
-
...
|
|
461
|
+
...ne(e),
|
|
232
462
|
/** 必须保留 */
|
|
233
463
|
configPath: {
|
|
234
464
|
type: "string",
|
|
@@ -237,233 +467,243 @@ const ft = async () => {
|
|
|
237
467
|
/** 必须设置默认值 */
|
|
238
468
|
default: t
|
|
239
469
|
}
|
|
240
|
-
}),
|
|
241
|
-
const { configPath: r, rootDir:
|
|
242
|
-
return
|
|
470
|
+
}), oe = async (t, e) => {
|
|
471
|
+
const { configPath: r, rootDir: s } = e, n = l.resolve(s, r), o = l.dirname(n);
|
|
472
|
+
return A(o) || yt(o, {
|
|
243
473
|
recursive: !0
|
|
244
|
-
}),
|
|
245
|
-
},
|
|
474
|
+
}), n.endsWith(".json5") ? (a.info(`json5模式写入 ${n}`), G(n, Z.stringify(t, null, 2)), n) : (a.info(`json模式写入 ${n}`), G(n, JSON.stringify(t, null, 2)), n);
|
|
475
|
+
}, Qe = async (t, e, {
|
|
246
476
|
onFileGenerated: r,
|
|
247
|
-
edit:
|
|
477
|
+
edit: s = !1
|
|
248
478
|
} = {}) => {
|
|
249
|
-
const
|
|
250
|
-
if (r == null || r(
|
|
251
|
-
const o = await
|
|
252
|
-
|
|
479
|
+
const n = await oe(t, e);
|
|
480
|
+
if (r == null || r(n), s) {
|
|
481
|
+
const o = await te();
|
|
482
|
+
se(e.configPath, o);
|
|
253
483
|
}
|
|
254
|
-
},
|
|
255
|
-
const { configPath: r, rootDir:
|
|
256
|
-
if (!
|
|
484
|
+
}, tr = async (t, e) => {
|
|
485
|
+
const { configPath: r, rootDir: s } = t, n = l.resolve(s, r);
|
|
486
|
+
if (!A(n)) {
|
|
257
487
|
if (e)
|
|
258
488
|
return a.info("配置文件不存在,使用onNotExists返回值"), e();
|
|
259
|
-
const o = `配置文件不存在 ${
|
|
489
|
+
const o = `配置文件不存在 ${n}`;
|
|
260
490
|
throw new Error(o);
|
|
261
491
|
}
|
|
262
|
-
return
|
|
263
|
-
},
|
|
264
|
-
const { useDefaultConfig: t } = await
|
|
492
|
+
return n.endsWith(".json5") ? (a.info(`json5模式解析 ${n}`), Z.parse(v(n, "utf8"))) : (a.info(`json模式解析 ${n}`), JSON.parse(v(n, "utf8")));
|
|
493
|
+
}, er = async () => {
|
|
494
|
+
const { useDefaultConfig: t } = await P({
|
|
265
495
|
name: "useDefaultConfig",
|
|
266
496
|
type: "confirm",
|
|
267
497
|
message: "使用默认模板配置",
|
|
268
498
|
initial: !0
|
|
269
499
|
});
|
|
270
500
|
return t;
|
|
271
|
-
},
|
|
501
|
+
}, St = "package.json", x = ({
|
|
272
502
|
rootDir: t
|
|
273
503
|
}) => {
|
|
274
|
-
const e =
|
|
275
|
-
if (!
|
|
504
|
+
const e = l.resolve(t, St);
|
|
505
|
+
if (!A(e))
|
|
276
506
|
throw new Error(`${t}未找到package.json文件`);
|
|
277
|
-
const r =
|
|
507
|
+
const r = v(e, "utf-8");
|
|
278
508
|
return JSON.parse(r);
|
|
279
|
-
},
|
|
509
|
+
}, ie = ({
|
|
280
510
|
rootDir: t,
|
|
281
511
|
pkgJson: e,
|
|
282
512
|
pkgName: r,
|
|
283
|
-
isDevPkg:
|
|
513
|
+
isDevPkg: s
|
|
284
514
|
}) => {
|
|
285
|
-
const
|
|
515
|
+
const n = e || x({ rootDir: t }), o = s ? n.devDependencies : n.dependencies;
|
|
286
516
|
let c = o == null ? void 0 : o[r];
|
|
287
517
|
if (!c) {
|
|
288
|
-
const i =
|
|
518
|
+
const i = s ? n.dependencies : n.devDependencies;
|
|
289
519
|
c = i == null ? void 0 : i[r], c && a.warn(
|
|
290
|
-
`${
|
|
520
|
+
`${s ? "开发" : "生产"}依赖包${r}可能错误的安装在${s ? "dependencies" : "devDependencies"}`
|
|
291
521
|
);
|
|
292
522
|
return;
|
|
293
523
|
}
|
|
294
524
|
return c || a.info(`依赖包${r}未安装`), c;
|
|
295
|
-
},
|
|
525
|
+
}, rr = ({
|
|
296
526
|
patchConfig: t,
|
|
297
527
|
rootDir: e
|
|
298
528
|
}) => {
|
|
299
529
|
if (!t)
|
|
300
530
|
return;
|
|
301
|
-
const r =
|
|
302
|
-
|
|
303
|
-
},
|
|
304
|
-
const r =
|
|
531
|
+
const r = x({ rootDir: e }), s = Mt(r, t), n = l.resolve(e, St);
|
|
532
|
+
G(n, JSON.stringify(s, null, 2), "utf-8");
|
|
533
|
+
}, N = (t) => {
|
|
534
|
+
const r = p("git rev-parse --show-toplevel", {
|
|
305
535
|
cwd: t
|
|
306
536
|
}).toString();
|
|
307
537
|
if (!r)
|
|
308
538
|
throw new Error("获取git根目录失败");
|
|
309
539
|
return r.trim();
|
|
310
|
-
},
|
|
540
|
+
}, sr = () => {
|
|
311
541
|
var t;
|
|
312
542
|
try {
|
|
313
|
-
const e =
|
|
543
|
+
const e = p("git symbolic-ref --short HEAD", {
|
|
314
544
|
stdio: "ignore"
|
|
315
545
|
});
|
|
316
546
|
return (t = e == null ? void 0 : e.toString()) == null ? void 0 : t.trim();
|
|
317
547
|
} catch {
|
|
318
548
|
try {
|
|
319
|
-
const r =
|
|
549
|
+
const r = p("git rev-parse --short HEAD").toString().trim();
|
|
320
550
|
a.skip(`当前未指向具体某个分支, 当前commit hash: ${r}`);
|
|
321
551
|
} finally {
|
|
322
552
|
return;
|
|
323
553
|
}
|
|
324
554
|
}
|
|
325
|
-
},
|
|
555
|
+
}, ce = (t) => {
|
|
326
556
|
const e = t.match(/moving\s+from\s+(.*)\s+to\s+(.*)/);
|
|
327
557
|
if (e) {
|
|
328
|
-
const [, r,
|
|
558
|
+
const [, r, s] = e;
|
|
329
559
|
return {
|
|
330
560
|
fromBranch: r.trim(),
|
|
331
|
-
toBranch:
|
|
561
|
+
toBranch: s.trim()
|
|
332
562
|
};
|
|
333
563
|
}
|
|
334
|
-
},
|
|
335
|
-
const r =
|
|
336
|
-
if ((r &
|
|
564
|
+
}, T = 73, ae = (t) => {
|
|
565
|
+
const r = g.statSync(t).mode;
|
|
566
|
+
if ((r & T) === T)
|
|
337
567
|
return;
|
|
338
568
|
a.stage(`${t} 没有执行权限 添加... `);
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
},
|
|
569
|
+
const s = r | T;
|
|
570
|
+
g.chmodSync(t, s), a.success(`${t} 添加执行权限成功`);
|
|
571
|
+
}, ht = (t) => g.existsSync(t), k = async (t) => {
|
|
342
572
|
try {
|
|
343
|
-
return await
|
|
573
|
+
return await g.promises.lstat(t), !0;
|
|
344
574
|
} catch (e) {
|
|
345
575
|
return e.code !== "ENOENT";
|
|
346
576
|
}
|
|
347
|
-
},
|
|
348
|
-
|
|
349
|
-
},
|
|
350
|
-
await
|
|
351
|
-
},
|
|
352
|
-
var
|
|
353
|
-
const
|
|
354
|
-
const e =
|
|
577
|
+
}, fe = (t, e = !1) => {
|
|
578
|
+
ht(t) && g.rmSync(t, { recursive: !0, force: e });
|
|
579
|
+
}, le = async (t, e = !1) => {
|
|
580
|
+
await k(t) && await g.promises.rm(t, { recursive: !0, force: e });
|
|
581
|
+
}, ue = (t) => g.readFileSync(t, "utf-8"), ge = (t) => g.promises.readFile(t, "utf-8"), nr = (t, e) => JSON.parse(ue(t)) || e, dt = async (t, e) => JSON.parse(await ge(t)) || e;
|
|
582
|
+
var _ = /* @__PURE__ */ ((t) => (t.PRE_COMMIT = "pre-commit", t.PRE_MERGE_COMMIT = "pre-merge-commit", t.PREPARE_COMMIT_MSG = "prepare-commit-msg", t.COMMIT_MSG = "commit-msg", t.PRE_REBASE = "pre-rebase", t.POST_COMMIT = "post-commit", t.POST_MERGE = "post-merge", t.PRE_PUSH = "pre-push", t))(_ || {});
|
|
583
|
+
const pe = "husky", me = ".husky", Se = ({ rootDir: t }) => {
|
|
584
|
+
const e = N(t), r = ie({
|
|
355
585
|
rootDir: e,
|
|
356
|
-
pkgJson:
|
|
357
|
-
pkgName:
|
|
586
|
+
pkgJson: x({ rootDir: e }),
|
|
587
|
+
pkgName: pe,
|
|
358
588
|
isDevPkg: !0
|
|
359
589
|
});
|
|
360
590
|
if (!r)
|
|
361
591
|
throw new Error("husky版本获取失败, 可能husky未安装");
|
|
362
|
-
const
|
|
363
|
-
return
|
|
364
|
-
. "$(dirname -- "$0")/_/husky.sh"`) : (a.info(`${
|
|
365
|
-
},
|
|
366
|
-
const e =
|
|
367
|
-
return
|
|
368
|
-
},
|
|
592
|
+
const s = r.replace(/^(\^|~)/, ""), n = "<9.0.0";
|
|
593
|
+
return It.satisfies(s, n) ? (a.info(`${s}符合${n}`), `#!/usr/bin/env sh
|
|
594
|
+
. "$(dirname -- "$0")/_/husky.sh"`) : (a.info(`${s}不符合${n}`), "");
|
|
595
|
+
}, he = ({ rootDir: t }) => {
|
|
596
|
+
const e = N(t);
|
|
597
|
+
return l.resolve(e, me);
|
|
598
|
+
}, or = ({
|
|
369
599
|
hookNames: t,
|
|
370
600
|
rootDir: e,
|
|
371
601
|
getCode: r
|
|
372
602
|
}) => {
|
|
373
|
-
const
|
|
374
|
-
|
|
375
|
-
const o =
|
|
376
|
-
let i = r(
|
|
603
|
+
const s = he({ rootDir: e });
|
|
604
|
+
g.existsSync(s) || g.mkdirSync(s, { recursive: !0 }), t.forEach((n) => {
|
|
605
|
+
const o = l.resolve(s, n), c = g.existsSync(o);
|
|
606
|
+
let i = r(n);
|
|
377
607
|
if (c)
|
|
378
|
-
|
|
608
|
+
g.readFileSync(o, "utf-8").includes(i) ? a.skip(`${o} ${n}相关调用 ${i} 已存在 跳过`) : (g.appendFileSync(
|
|
379
609
|
o,
|
|
380
610
|
`
|
|
381
611
|
${i}
|
|
382
612
|
`
|
|
383
|
-
), a.success(`${o} 添加 ${
|
|
613
|
+
), a.success(`${o} 添加 ${n}相关调用成功`));
|
|
384
614
|
else {
|
|
385
|
-
const
|
|
615
|
+
const f = Se({
|
|
386
616
|
rootDir: e
|
|
387
617
|
});
|
|
388
|
-
|
|
618
|
+
g.writeFileSync(
|
|
389
619
|
o,
|
|
390
|
-
`${
|
|
620
|
+
`${f}
|
|
391
621
|
|
|
392
622
|
${i}
|
|
393
623
|
`,
|
|
394
624
|
"utf-8"
|
|
395
|
-
), a.success(`${o} 添加 ${
|
|
625
|
+
), a.success(`${o} 添加 ${n}相关调用成功`);
|
|
396
626
|
}
|
|
397
|
-
|
|
627
|
+
ae(o);
|
|
398
628
|
});
|
|
399
|
-
},
|
|
629
|
+
}, ir = [
|
|
400
630
|
// HooksNameEnum.PRE_MERGE_COMMIT,
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
],
|
|
631
|
+
_.PREPARE_COMMIT_MSG,
|
|
632
|
+
_.COMMIT_MSG
|
|
633
|
+
], cr = ({
|
|
404
634
|
hookName: t,
|
|
405
635
|
rootDir: e
|
|
406
636
|
}) => {
|
|
407
|
-
const r =
|
|
637
|
+
const r = N(e), s = l.resolve(r, ".git");
|
|
408
638
|
switch (t) {
|
|
409
|
-
case
|
|
410
|
-
case
|
|
411
|
-
const
|
|
412
|
-
if (
|
|
413
|
-
return
|
|
639
|
+
case _.PREPARE_COMMIT_MSG:
|
|
640
|
+
case _.COMMIT_MSG: {
|
|
641
|
+
const n = l.resolve(s, "MERGE_MSG");
|
|
642
|
+
if (A(n))
|
|
643
|
+
return v(n, "utf-8");
|
|
414
644
|
}
|
|
415
645
|
}
|
|
416
646
|
return "";
|
|
417
|
-
},
|
|
647
|
+
}, ar = ({
|
|
418
648
|
remoteAlias: t = "origin"
|
|
419
649
|
} = {}) => {
|
|
420
650
|
try {
|
|
421
|
-
const e =
|
|
422
|
-
|
|
651
|
+
const e = p("git rev-parse HEAD").toString().trim(), r = p(
|
|
652
|
+
'git log -1 --pretty=format:"%an"'
|
|
653
|
+
).toString().trim(), s = p(
|
|
654
|
+
'git log -1 --pretty=format:"%ae"'
|
|
655
|
+
).toString().trim(), n = p(
|
|
656
|
+
'git log -1 --pretty=format:"%s"'
|
|
657
|
+
).toString().trim(), o = p("git config user.name").toString().trim(), c = p("git config user.email").toString().trim(), i = p(
|
|
658
|
+
"git rev-parse --abbrev-ref HEAD"
|
|
659
|
+
).toString().trim();
|
|
660
|
+
let f = "";
|
|
423
661
|
try {
|
|
424
|
-
|
|
662
|
+
f = p(
|
|
663
|
+
`git config --get remote.${t}.url`
|
|
664
|
+
).toString().trim();
|
|
425
665
|
} catch {
|
|
426
666
|
a.warn("git远程仓库地址获取失败或者不存在");
|
|
427
667
|
}
|
|
428
668
|
return {
|
|
429
669
|
lastHash: e,
|
|
430
670
|
lastCommitter: r,
|
|
431
|
-
lastCommitterPinYin:
|
|
432
|
-
style:
|
|
671
|
+
lastCommitterPinYin: R(r, {
|
|
672
|
+
style: R.STYLE_NORMAL,
|
|
433
673
|
heteronym: !1
|
|
434
674
|
}).join(""),
|
|
435
|
-
lastCommitEmail:
|
|
436
|
-
lastCommitMsg:
|
|
675
|
+
lastCommitEmail: s,
|
|
676
|
+
lastCommitMsg: n,
|
|
437
677
|
userName: o,
|
|
438
|
-
userNamePinYin:
|
|
439
|
-
style:
|
|
678
|
+
userNamePinYin: R(o, {
|
|
679
|
+
style: R.STYLE_NORMAL,
|
|
440
680
|
heteronym: !1
|
|
441
681
|
}).join(""),
|
|
442
682
|
userEmail: c,
|
|
443
683
|
branchName: i,
|
|
444
|
-
remoteInfo:
|
|
684
|
+
remoteInfo: f ? {
|
|
445
685
|
alias: t,
|
|
446
|
-
url:
|
|
686
|
+
url: f
|
|
447
687
|
} : void 0
|
|
448
688
|
};
|
|
449
689
|
} catch (e) {
|
|
450
690
|
throw a.error("获取git最后提交信息失败"), e;
|
|
451
691
|
}
|
|
452
|
-
},
|
|
692
|
+
}, Et = (t = "") => {
|
|
453
693
|
const e = /\s*Merge\s+branch\s+['|"](.+)['|"]\s+into\s+['|"](.+)['|"]\s*/i, r = t.match(e);
|
|
454
694
|
if (r) {
|
|
455
|
-
const [, i,
|
|
695
|
+
const [, i, f] = r;
|
|
456
696
|
return {
|
|
457
697
|
fromBranch: i,
|
|
458
|
-
toBranch:
|
|
698
|
+
toBranch: f
|
|
459
699
|
};
|
|
460
700
|
}
|
|
461
|
-
const
|
|
462
|
-
if (
|
|
463
|
-
const [, i,
|
|
701
|
+
const s = /\s*Merge\s+branch\s+['|"](.+)['|"]\s+of\s+.+\s+into\s+['|"](.+)['|"]\s*/i, n = t.match(s);
|
|
702
|
+
if (n) {
|
|
703
|
+
const [, i, f] = n;
|
|
464
704
|
return {
|
|
465
705
|
fromBranch: i,
|
|
466
|
-
toBranch:
|
|
706
|
+
toBranch: f
|
|
467
707
|
};
|
|
468
708
|
}
|
|
469
709
|
const o = /\s*Merge\s+branch\s+['|"](.+)['|"](\s+of)?\s*/i, c = t.match(o);
|
|
@@ -473,12 +713,12 @@ ${i}
|
|
|
473
713
|
fromBranch: i
|
|
474
714
|
};
|
|
475
715
|
}
|
|
476
|
-
},
|
|
477
|
-
if (t.startsWith(
|
|
716
|
+
}, de = (t) => {
|
|
717
|
+
if (t.startsWith(b.MERGE))
|
|
478
718
|
return {
|
|
479
|
-
fromBranch: t.replace(
|
|
719
|
+
fromBranch: t.replace(b.MERGE, "").trim()
|
|
480
720
|
};
|
|
481
|
-
},
|
|
721
|
+
}, fr = () => {
|
|
482
722
|
const t = process.env.GIT_REFLOG_ACTION || "";
|
|
483
723
|
if (!t)
|
|
484
724
|
return;
|
|
@@ -489,23 +729,23 @@ ${i}
|
|
|
489
729
|
fromBranch: o
|
|
490
730
|
};
|
|
491
731
|
}
|
|
492
|
-
const
|
|
493
|
-
if (
|
|
494
|
-
const [, , o] =
|
|
732
|
+
const s = /pull\s+([^\s]+)\s+([^\s]+)/, n = t.match(s);
|
|
733
|
+
if (n) {
|
|
734
|
+
const [, , o] = n;
|
|
495
735
|
return {
|
|
496
736
|
fromBranch: o
|
|
497
737
|
};
|
|
498
738
|
}
|
|
499
739
|
};
|
|
500
|
-
var
|
|
501
|
-
const
|
|
740
|
+
var b = /* @__PURE__ */ ((t) => (t.CHECKOUT = "checkout", t.MERGE = "merge", t.COMMIT = "commit", t.COMMIT_MERGE = "commit (merge)", t.PULL = "pull", t.RESET = "reset", t.REBASE_START = "rebase (start)", t.REBASE_FINISH = "rebase (finish)", t.REBASE_ABORT = "rebase (abort)", t.REBASE_CONTINUE = "rebase (continue)", t))(b || {});
|
|
741
|
+
const K = "__GIT_REPLACE_MARK__", $ = {
|
|
502
742
|
stringify(t) {
|
|
503
|
-
return JSON.stringify(t).replace(/"/g,
|
|
743
|
+
return JSON.stringify(t).replace(/"/g, K);
|
|
504
744
|
},
|
|
505
745
|
parse(t) {
|
|
506
|
-
return JSON.parse(t.replace(new RegExp(
|
|
746
|
+
return JSON.parse(t.replace(new RegExp(K, "g"), '"'));
|
|
507
747
|
}
|
|
508
|
-
},
|
|
748
|
+
}, lr = ({
|
|
509
749
|
count: t = 100
|
|
510
750
|
} = {}) => {
|
|
511
751
|
if (t <= 0)
|
|
@@ -527,19 +767,19 @@ const B = "__GIT_REPLACE_MARK__", O = {
|
|
|
527
767
|
/** 提交日期 */
|
|
528
768
|
commitTime: "%ci"
|
|
529
769
|
};
|
|
530
|
-
return
|
|
531
|
-
`git --no-pager log --oneline -n ${t} --pretty=format:"${
|
|
770
|
+
return p(
|
|
771
|
+
`git --no-pager log --oneline -n ${t} --pretty=format:"${$.stringify(
|
|
532
772
|
e
|
|
533
773
|
)}"`
|
|
534
774
|
).toString().split(`
|
|
535
775
|
`).map((o) => {
|
|
536
|
-
const c =
|
|
776
|
+
const c = $.parse(o);
|
|
537
777
|
return {
|
|
538
778
|
...c,
|
|
539
|
-
mergeInfo:
|
|
779
|
+
mergeInfo: Et(c.message)
|
|
540
780
|
};
|
|
541
781
|
});
|
|
542
|
-
},
|
|
782
|
+
}, ur = ({
|
|
543
783
|
count: t = 100,
|
|
544
784
|
filterItem: e = () => !0
|
|
545
785
|
} = {}) => {
|
|
@@ -552,201 +792,223 @@ const B = "__GIT_REPLACE_MARK__", O = {
|
|
|
552
792
|
committerEmail: "%ce",
|
|
553
793
|
commitTime: "%ci"
|
|
554
794
|
};
|
|
555
|
-
return
|
|
556
|
-
`git --no-pager reflog -n ${t} --pretty=format:"${
|
|
795
|
+
return p(
|
|
796
|
+
`git --no-pager reflog -n ${t} --pretty=format:"${$.stringify(
|
|
557
797
|
r
|
|
558
798
|
)}"`
|
|
559
799
|
).toString().split(`
|
|
560
|
-
`).map((i) =>
|
|
561
|
-
const { fullMessage:
|
|
562
|
-
let
|
|
800
|
+
`).map((i) => $.parse(i)).filter(e).map((i) => {
|
|
801
|
+
const { fullMessage: f, ...u } = i, S = ":", [y] = f.split(S, 1), L = f.slice(`${y}${S}`.length), h = y.trim(), O = L.trim();
|
|
802
|
+
let D, H, _t;
|
|
563
803
|
if (h.startsWith(
|
|
564
804
|
"checkout"
|
|
565
805
|
/* CHECKOUT */
|
|
566
806
|
))
|
|
567
|
-
|
|
807
|
+
H = ce(O);
|
|
568
808
|
else if (h.startsWith(
|
|
569
809
|
"merge"
|
|
570
810
|
/* MERGE */
|
|
571
811
|
))
|
|
572
|
-
|
|
812
|
+
D = de(h);
|
|
573
813
|
else if (h.startsWith(
|
|
574
814
|
"commit (merge)"
|
|
575
815
|
/* COMMIT_MERGE */
|
|
576
816
|
)) {
|
|
577
|
-
const
|
|
578
|
-
|
|
579
|
-
`${i.hash} 是合并提交 但是未从提交信息(${
|
|
580
|
-
),
|
|
817
|
+
const J = Et(O);
|
|
818
|
+
J || a.warn(
|
|
819
|
+
`${i.hash} 是合并提交 但是未从提交信息(${O})中检测到合并分支信息,推测手动更改了提交内容`
|
|
820
|
+
), D = J;
|
|
581
821
|
}
|
|
582
822
|
return {
|
|
583
|
-
...
|
|
823
|
+
...u,
|
|
584
824
|
type: h,
|
|
585
|
-
message:
|
|
586
|
-
mergeInfo:
|
|
587
|
-
checkoutInfo:
|
|
588
|
-
rebaseInfo:
|
|
825
|
+
message: O,
|
|
826
|
+
mergeInfo: D,
|
|
827
|
+
checkoutInfo: H,
|
|
828
|
+
rebaseInfo: _t
|
|
589
829
|
};
|
|
590
830
|
});
|
|
591
|
-
},
|
|
592
|
-
const e =
|
|
593
|
-
if (
|
|
831
|
+
}, gr = (t) => {
|
|
832
|
+
const e = N(t), r = l.resolve(e, ".git"), s = l.resolve(r, "rebase-merge");
|
|
833
|
+
if (g.existsSync(s))
|
|
594
834
|
return !0;
|
|
595
|
-
const
|
|
596
|
-
if (
|
|
835
|
+
const n = l.resolve(r, "rebase-apply");
|
|
836
|
+
if (g.existsSync(n))
|
|
597
837
|
return !0;
|
|
598
|
-
const o =
|
|
599
|
-
return !!
|
|
600
|
-
},
|
|
838
|
+
const o = l.resolve(r, "REBASE_HEAD");
|
|
839
|
+
return !!g.existsSync(o);
|
|
840
|
+
}, pr = ({
|
|
601
841
|
branchName: t,
|
|
602
842
|
version: e,
|
|
603
843
|
remoteInfo: r
|
|
604
844
|
}) => {
|
|
605
|
-
r && (
|
|
845
|
+
r && (p(`git push ${r.alias} v${e}`, {
|
|
606
846
|
stdio: "inherit"
|
|
607
|
-
}),
|
|
847
|
+
}), p(`git push ${r.alias} ${t}`, {
|
|
608
848
|
stdio: "inherit"
|
|
609
849
|
}));
|
|
610
|
-
},
|
|
850
|
+
}, Ee = (t) => /^https?:\/\//.test(t), _e = (t) => /^git@/.test(t), mr = (t) => {
|
|
611
851
|
const { hostname: e, pathname: r } = new URL(t);
|
|
612
852
|
return `git@${e}:${r.replace("/", "")}`;
|
|
613
|
-
},
|
|
853
|
+
}, Ce = (t) => l.resolve(t, ".git"), Sr = (t) => le(Ce(t)), ye = ({
|
|
614
854
|
dir: t,
|
|
615
855
|
fn: e,
|
|
616
856
|
endClear: r = !0,
|
|
617
|
-
exitClear:
|
|
857
|
+
exitClear: s = !0
|
|
618
858
|
}) => {
|
|
619
|
-
if (
|
|
859
|
+
if (ht(t))
|
|
620
860
|
return a.error(`${t} 已存在,请手动删除该目录再试`), process.exit(1);
|
|
621
|
-
const
|
|
622
|
-
a.stage("正在清理临时目录...", t),
|
|
861
|
+
const n = () => {
|
|
862
|
+
a.stage("正在清理临时目录...", t), fe(t);
|
|
623
863
|
};
|
|
624
|
-
|
|
625
|
-
a.stage("发现进程退出,正在清理临时目录...", t),
|
|
864
|
+
s && process.once("exit", () => {
|
|
865
|
+
a.stage("发现进程退出,正在清理临时目录...", t), n();
|
|
626
866
|
});
|
|
627
867
|
let o;
|
|
628
868
|
try {
|
|
629
869
|
o = e(t);
|
|
630
870
|
} catch (c) {
|
|
631
|
-
throw r &&
|
|
871
|
+
throw r && n(), c;
|
|
632
872
|
}
|
|
633
|
-
return r && (o instanceof Promise ? o.finally(
|
|
873
|
+
return r && (o instanceof Promise ? o.finally(n) : n()), o;
|
|
634
874
|
};
|
|
635
|
-
var
|
|
636
|
-
const
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
`${t}-${
|
|
640
|
-
),
|
|
641
|
-
const t =
|
|
642
|
-
ASSETS_CONFIG_REPO_URL:
|
|
875
|
+
var Oe = /* @__PURE__ */ ((t) => (t.ASSETS_CONFIG_REPO_URL = "ASSETS_CONFIG_REPO_URL", t))(Oe || {});
|
|
876
|
+
const Re = (t) => l.resolve(
|
|
877
|
+
z(),
|
|
878
|
+
$t,
|
|
879
|
+
`${t}-${et()}`
|
|
880
|
+
), ve = () => l.resolve(W(), Nt), Me = async () => {
|
|
881
|
+
const t = ve(), e = {
|
|
882
|
+
ASSETS_CONFIG_REPO_URL: Tt
|
|
643
883
|
};
|
|
644
884
|
try {
|
|
645
|
-
if (await
|
|
646
|
-
const r = await
|
|
647
|
-
Object.entries(r).forEach(([
|
|
648
|
-
e[
|
|
885
|
+
if (await k(t)) {
|
|
886
|
+
const r = await dt(t, {});
|
|
887
|
+
Object.entries(r).forEach(([s, n]) => {
|
|
888
|
+
e[s] = n;
|
|
649
889
|
});
|
|
650
890
|
}
|
|
651
891
|
} catch {
|
|
652
892
|
}
|
|
653
893
|
return e;
|
|
654
|
-
},
|
|
655
|
-
if (await
|
|
894
|
+
}, Ie = async (t) => {
|
|
895
|
+
if (await k(t))
|
|
656
896
|
return a.error(`${t} 已存在,请手动删除该目录再试`), process.exit(1);
|
|
657
897
|
const {
|
|
658
898
|
[
|
|
659
899
|
"ASSETS_CONFIG_REPO_URL"
|
|
660
900
|
/* ASSETS_CONFIG_REPO_URL */
|
|
661
901
|
]: e
|
|
662
|
-
} = await
|
|
663
|
-
return
|
|
902
|
+
} = await Me();
|
|
903
|
+
return _e(e) || Ee(e) ? p(
|
|
904
|
+
`git clone ${e} ${t} --depth=1`
|
|
905
|
+
) : (g.mkdirSync(t, { recursive: !0 }), p(
|
|
906
|
+
`cp -r ${e}/ ${t}/`
|
|
907
|
+
)), {
|
|
664
908
|
assetConfigRepoUrl: e
|
|
665
909
|
};
|
|
666
|
-
},
|
|
910
|
+
}, hr = async ({
|
|
667
911
|
moduleName: t,
|
|
668
912
|
onSuccess: e
|
|
669
|
-
}) => (a.stage(`拉取${t}配置,请稍等...`),
|
|
913
|
+
}) => (a.stage(`拉取${t}配置,请稍等...`), ye({
|
|
670
914
|
// 资源配置仓库临时文件夹
|
|
671
|
-
dir:
|
|
915
|
+
dir: Re(t),
|
|
672
916
|
fn: async (r) => {
|
|
673
|
-
const { assetConfigRepoUrl:
|
|
674
|
-
|
|
917
|
+
const { assetConfigRepoUrl: s } = await Ie(r), n = l.join(
|
|
918
|
+
At,
|
|
675
919
|
t
|
|
676
|
-
), o =
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
), c =
|
|
920
|
+
), o = l.join(
|
|
921
|
+
n,
|
|
922
|
+
Pt
|
|
923
|
+
), c = l.resolve(r, o), i = await dt(c);
|
|
680
924
|
return await e({
|
|
681
|
-
repoUrl:
|
|
925
|
+
repoUrl: s,
|
|
682
926
|
config: i,
|
|
683
|
-
moduleDirFileRelativePath:
|
|
927
|
+
moduleDirFileRelativePath: n,
|
|
684
928
|
moduleEntryFileRelativePath: o,
|
|
685
929
|
assetsConfigRepoTempDir: r
|
|
686
930
|
}), i;
|
|
687
931
|
}
|
|
688
932
|
}));
|
|
689
933
|
export {
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
934
|
+
Oe as DoneCodingCliGlobalConfigKeyEnum,
|
|
935
|
+
Qt as EditorTypeEnum,
|
|
936
|
+
Ft as EnvConfigCallModeEnum,
|
|
937
|
+
Bt as EnvConfigProcessKeyEnum,
|
|
938
|
+
b as GitRefLogTypeEnum,
|
|
939
|
+
_ as HooksNameEnum,
|
|
940
|
+
m as LogTypeEnum,
|
|
941
|
+
ir as SUPPORT_GET_COMMIT_BY_HOOKS_NAMES,
|
|
942
|
+
Ir as _curry,
|
|
943
|
+
Or as _get,
|
|
944
|
+
vr as _set,
|
|
945
|
+
or as addHuskyHooks,
|
|
946
|
+
rr as addPackageConfig,
|
|
947
|
+
at as allowConsoleLog,
|
|
948
|
+
ye as applyUseTempDir,
|
|
949
|
+
ht as assetIsExits,
|
|
950
|
+
k as assetIsExitsAsync,
|
|
951
|
+
gr as checkCurrentIsRebasing,
|
|
952
|
+
Xe as createMainCommand,
|
|
953
|
+
Ze as createSubcommand,
|
|
954
|
+
Ve as decryptAES,
|
|
955
|
+
Ye as encryptAES,
|
|
956
|
+
p as execSyncWithLogDispatch,
|
|
957
|
+
ae as fileAddX,
|
|
958
|
+
d as formatLogSteamWrite,
|
|
959
|
+
We as getAnswerSwift,
|
|
960
|
+
Ke as getAnswerWithMCP,
|
|
961
|
+
ct as getCallMode,
|
|
962
|
+
Re as getCliModuleTempDir,
|
|
963
|
+
cr as getCommitByHookName,
|
|
964
|
+
qe as getConfigFileCommonOptions,
|
|
965
|
+
lr as getCurrentBranchLastCommitList,
|
|
966
|
+
sr as getCurrentBranchName,
|
|
967
|
+
Ht as getCurrentProcessLogFileName,
|
|
968
|
+
te as getEditorType,
|
|
969
|
+
ar as getGitLastCommitInfo,
|
|
970
|
+
Ce as getGitPath,
|
|
971
|
+
N as getGitProjectDir,
|
|
972
|
+
ur as getLastReflogList,
|
|
973
|
+
kt as getLogOutputDir,
|
|
974
|
+
He as getLogText,
|
|
975
|
+
tt as getLogTime,
|
|
976
|
+
Vt as getLogTypeByValue,
|
|
977
|
+
x as getPackageJson,
|
|
978
|
+
Jt as getParentProcessLogFileName,
|
|
979
|
+
st as getProcessEnv,
|
|
980
|
+
ft as getProcessLogStream,
|
|
981
|
+
ie as getRelyPkgVersion,
|
|
982
|
+
ne as getRootDirOptions,
|
|
983
|
+
ze as getRootScriptName,
|
|
984
|
+
bt as getSafePath,
|
|
985
|
+
er as getUseDefaultConfig,
|
|
986
|
+
mr as http2sshGitUrl,
|
|
987
|
+
oe as initConfigFile,
|
|
988
|
+
ke as initEnvConfig,
|
|
989
|
+
Qe as initHandlerCommon,
|
|
990
|
+
Ee as isHttpGitUrl,
|
|
991
|
+
xt as isMcpMode,
|
|
992
|
+
_e as isSshGitUrl,
|
|
993
|
+
Cr as json5,
|
|
733
994
|
a as log,
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
995
|
+
Je as lookForParentTarget,
|
|
996
|
+
se as openFileInEditor,
|
|
997
|
+
xe as pathIsSafe,
|
|
998
|
+
pr as pushGitPublishInfoToRemote,
|
|
999
|
+
hr as readCliModuleAssetsConfig,
|
|
1000
|
+
tr as readConfigFile,
|
|
1001
|
+
ue as readFile,
|
|
1002
|
+
ge as readFileAsync,
|
|
1003
|
+
nr as readJsonFile,
|
|
1004
|
+
dt as readJsonFileAsync,
|
|
1005
|
+
fe as removeAsset,
|
|
1006
|
+
le as removeAssetAsync,
|
|
1007
|
+
ce as resolveCheckoutInfoByRefInfo,
|
|
1008
|
+
Et as resolveMergeInfoByCommitMsg,
|
|
1009
|
+
fr as resolveMergeInfoByGitReflogAction,
|
|
1010
|
+
de as resolveMergeInfoByRefType,
|
|
1011
|
+
Sr as rmGitCtrlAsync,
|
|
1012
|
+
et as uuidv4,
|
|
1013
|
+
P as xPrompts
|
|
752
1014
|
};
|