mine-auto-cli 2.8.1 → 2.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { program as e } from "commander";
|
|
2
2
|
import t from "chalk";
|
|
3
3
|
import { cpSync as n, existsSync as r, readFileSync as i, readdirSync as a, rmSync as o, writeFileSync as s } from "fs";
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import { execSync as
|
|
8
|
-
import * as
|
|
4
|
+
import { dirname as c, join as l, resolve as u } from "path";
|
|
5
|
+
import d from "log-symbols";
|
|
6
|
+
import f from "ora";
|
|
7
|
+
import { execSync as p } from "child_process";
|
|
8
|
+
import * as m from "js-yaml";
|
|
9
9
|
import ee from "strip-json-comments";
|
|
10
|
-
import
|
|
11
|
-
import { parseRange as
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
10
|
+
import h from "pacote";
|
|
11
|
+
import { parseRange as g } from "semver-utils";
|
|
12
|
+
import _ from "download-git-repo";
|
|
13
|
+
import v from "inquirer";
|
|
14
|
+
import y from "os";
|
|
15
|
+
import { openBinary as te } from "@avmc/bun-extractor";
|
|
16
|
+
import ne from "update-notifier";
|
|
16
17
|
//#region package.json
|
|
17
|
-
var
|
|
18
|
-
name:
|
|
18
|
+
var re = "mine-auto-cli", ie = "2.8.2", b = {
|
|
19
|
+
name: re,
|
|
19
20
|
private: !1,
|
|
20
|
-
version:
|
|
21
|
+
version: ie,
|
|
21
22
|
exports: "./dist/index.js",
|
|
22
23
|
main: "./dist/index.js",
|
|
23
24
|
type: "module",
|
|
@@ -59,6 +60,7 @@ var ie = "mine-auto-cli", ae = "2.8.1", _ = {
|
|
|
59
60
|
email: "biaov@qq.com"
|
|
60
61
|
}],
|
|
61
62
|
dependencies: {
|
|
63
|
+
"@avmc/bun-extractor": "^0.5.1",
|
|
62
64
|
chalk: "^5.6.2",
|
|
63
65
|
commander: "^15.0.0",
|
|
64
66
|
"download-git-repo": "^3.0.2",
|
|
@@ -81,35 +83,35 @@ var ie = "mine-auto-cli", ae = "2.8.1", _ = {
|
|
|
81
83
|
typescript: "^6.0.3",
|
|
82
84
|
vite: "^8.1.0"
|
|
83
85
|
}
|
|
84
|
-
},
|
|
85
|
-
console.log(`${
|
|
86
|
-
},
|
|
87
|
-
console.log(`${
|
|
88
|
-
},
|
|
86
|
+
}, x = (e) => {
|
|
87
|
+
console.log(`${d.success} ${t.green("SUCCESS")} ${e}`);
|
|
88
|
+
}, S = (e) => {
|
|
89
|
+
console.log(`${re} ${d.error} ${t.red("ERROR")} ${e}`);
|
|
90
|
+
}, C = (e) => {
|
|
89
91
|
console.log(e ?? "");
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
let n =
|
|
92
|
+
}, w = (e) => {
|
|
93
|
+
C(`开始执行 ${t.cyanBright(e)} 命令`);
|
|
94
|
+
let n = f({
|
|
93
95
|
text: "正在执行命令中...",
|
|
94
96
|
color: "yellow"
|
|
95
97
|
});
|
|
96
|
-
n.start(),
|
|
97
|
-
},
|
|
98
|
+
n.start(), C(p(e, { cwd: process.cwd() }).toString()), n.succeed(`${t.green(e)} 命令执行成功`), C();
|
|
99
|
+
}, ae = (e) => [
|
|
98
100
|
"git add -A",
|
|
99
101
|
`git commit -m ${e}`,
|
|
100
102
|
"git push"
|
|
101
|
-
],
|
|
103
|
+
], oe = (e, t) => [
|
|
102
104
|
`npm run ${e}`,
|
|
103
105
|
"git add -A",
|
|
104
106
|
`git commit -m ${t}`,
|
|
105
107
|
"git push"
|
|
106
|
-
],
|
|
107
|
-
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
},
|
|
108
|
+
], se = async (e, n = "打包") => {
|
|
109
|
+
C(), C(`${t.yellow(">>")} 开始依次执行命令...`), C(), oe(e, n).map(w), x("全部命令执行完成"), C();
|
|
110
|
+
}, ce = (t) => {
|
|
111
|
+
C(), S(`\`${t}\` 命令错误,请检查你的命令`), C(), e.help();
|
|
112
|
+
}, le = (e) => {
|
|
111
113
|
let [t, n] = ["package.json", "README.md"].map((e) => {
|
|
112
|
-
let t =
|
|
114
|
+
let t = l(process.cwd(), e);
|
|
113
115
|
return {
|
|
114
116
|
path: t,
|
|
115
117
|
content: i(t).toString()
|
|
@@ -118,30 +120,30 @@ var ie = "mine-auto-cli", ae = "2.8.1", _ = {
|
|
|
118
120
|
e ? r.version = e : r.version = r.version.split(".").reduce((e, t, n, r) => e + (n === r.length - 1 ? +t + 1 : `${t}.`), ""), s(t.path, JSON.stringify(r, null, 2)), n.content = n.content.replace(/version\-v.+\-blue/, () => `version-v${r.version}-blue`), s(n.path, n.content);
|
|
119
121
|
}, ue = async (e) => {
|
|
120
122
|
let t = e.split("version")[1];
|
|
121
|
-
if (!t) return
|
|
122
|
-
let n = JSON.parse(i(
|
|
123
|
+
if (!t) return ce(e);
|
|
124
|
+
let n = JSON.parse(i(l(process.cwd(), "package.json")).toString());
|
|
123
125
|
if (t === "++") {
|
|
124
|
-
|
|
126
|
+
le(n.version.split(".").reduce((e, t, n, r) => e + (n === r.length - 1 ? +t + 1 : `${t}.`), "")), C(), x("命令执行完成");
|
|
125
127
|
return;
|
|
126
128
|
}
|
|
127
129
|
let r = t.split("@")[1];
|
|
128
|
-
r ? (
|
|
130
|
+
r ? (le(r), C(), x("命令执行完成")) : ce(e);
|
|
129
131
|
}, de = (n, r) => {
|
|
130
|
-
if (n.includes("build")) return
|
|
132
|
+
if (n.includes("build")) return se(n, r);
|
|
131
133
|
if (n.includes("version")) return ue(n);
|
|
132
|
-
|
|
133
|
-
},
|
|
134
|
+
S(t.hex("#f56c6c")(`\`auto ${n}${r ? ` ${r}` : ""}\` 命令不存在`)), e.help();
|
|
135
|
+
}, T = "https://gitee.com/biaovorg/project-template.git";
|
|
134
136
|
Object.keys({
|
|
135
|
-
vue:
|
|
136
|
-
react:
|
|
137
|
-
"uni-app":
|
|
138
|
-
electron:
|
|
139
|
-
node:
|
|
140
|
-
"node-simple":
|
|
137
|
+
vue: T,
|
|
138
|
+
react: T,
|
|
139
|
+
"uni-app": T,
|
|
140
|
+
electron: T,
|
|
141
|
+
node: T,
|
|
142
|
+
"node-simple": T
|
|
141
143
|
}).reduce((e, t, n) => e + (n ? ", " : "") + t, "");
|
|
142
|
-
var
|
|
143
|
-
|
|
144
|
-
var
|
|
144
|
+
var E = (e = "jsonc") => `auto-cli.${e}`;
|
|
145
|
+
u(import.meta.dirname, "./presetData.json");
|
|
146
|
+
var D = (e, t = !1) => {
|
|
145
147
|
if (!r(e)) return t ? {} : "";
|
|
146
148
|
let n = i(e).toString();
|
|
147
149
|
return t ? JSON.parse(ee(n)) : n;
|
|
@@ -149,81 +151,81 @@ var T = (e, t = !1) => {
|
|
|
149
151
|
if (!r(e)) return {};
|
|
150
152
|
let t = i(e).toString();
|
|
151
153
|
try {
|
|
152
|
-
return
|
|
154
|
+
return m.load(t);
|
|
153
155
|
} catch {
|
|
154
156
|
return {};
|
|
155
157
|
}
|
|
156
|
-
},
|
|
157
|
-
let [e, t] = [
|
|
158
|
+
}, O = (e = !1) => D(u(import.meta.dirname, E()), e), k = () => {
|
|
159
|
+
let [e, t] = [E(), E("yml")].map((e) => u(process.cwd(), e)), n = O(!0);
|
|
158
160
|
try {
|
|
159
|
-
Object.assign(n, fe(t),
|
|
161
|
+
Object.assign(n, fe(t), D(e, !0));
|
|
160
162
|
} catch {}
|
|
161
163
|
return n;
|
|
162
164
|
}, pe = (e, t = !1) => {
|
|
163
|
-
let n =
|
|
165
|
+
let n = O(t);
|
|
164
166
|
return t && (n = JSON.stringify(n, null, 2)), e.includes(".yml") ? n.trim().split("\n").slice(1, -1).reduce((e, t) => e + t.trim().replace(/[",]/g, "").replace("// ", "# ") + "\n", "") : n;
|
|
165
|
-
},
|
|
166
|
-
e.command("init").option("-f, --force", `强制替换 ${
|
|
167
|
-
|
|
168
|
-
let a =
|
|
167
|
+
}, A = (e, t, n = " ") => Array.from({ length: t - e }, () => n).join(""), me = () => `${+/* @__PURE__ */ new Date()}${Math.random().toString(36).substring(2, 6)}`;
|
|
168
|
+
e.command("init").option("-f, --force", `强制替换 ${E()} 文件内容`, !1).option("--unc, --uncomment", `取消生成 ${E()} 带注释`, !1).option("-y, --yml", `生成 ${E("yml")} 文件`, !1).description("初始化配置文件").action(({ yml: e, uncomment: n, force: i }) => {
|
|
169
|
+
C();
|
|
170
|
+
let a = E(e ? "yml" : "jsonc"), o = u(process.cwd(), a);
|
|
169
171
|
if (r(o) && !i) {
|
|
170
|
-
|
|
172
|
+
C(t.yellow(`${a} 文件已存在`)), C(), C(t.yellow(`文件目录 ${o}`));
|
|
171
173
|
return;
|
|
172
174
|
}
|
|
173
|
-
s(o, pe(a, n)),
|
|
175
|
+
s(o, pe(a, n)), x(`${a} 文件创建成功`), C(), C(t.green(`文件目录 ${o}`));
|
|
174
176
|
}), e.command("git [描述]").description("简化 Git 提交命令").action(async (e = "更新代码") => {
|
|
175
|
-
|
|
177
|
+
C(), C(`${t.yellow(">>")} 开始依次执行命令...`), C(), ae(e).forEach(w), x("全部命令执行完成"), C();
|
|
176
178
|
});
|
|
177
179
|
//#endregion
|
|
178
180
|
//#region src/commander/commands/mkdir.ts
|
|
179
|
-
var
|
|
181
|
+
var j = [
|
|
180
182
|
"dist",
|
|
181
183
|
"node_modules",
|
|
182
184
|
".git",
|
|
183
185
|
"miniprogram_npm"
|
|
184
|
-
],
|
|
185
|
-
let a = Array.from({ length: t }).reduce((e) => e + `${t === 1 && n === r.length - 1 ? "└ " : "│ "} `, ""), o = e + a, s = (a + i).length, c = Array.from({ length:
|
|
186
|
-
return !
|
|
187
|
-
},
|
|
186
|
+
], M = 0, N = !1, P = !1, F = 20, I = ({ prev: e, i: t, index: n, arr: r, curText: i }) => {
|
|
187
|
+
let a = Array.from({ length: t }).reduce((e) => e + `${t === 1 && n === r.length - 1 ? "└ " : "│ "} `, ""), o = e + a, s = (a + i).length, c = Array.from({ length: F + M - s }).reduce((e) => `${e}-`, " ");
|
|
188
|
+
return !N && (M = Math.max(M, s)), `${o}${i}${P ? c : ""}\n`;
|
|
189
|
+
}, L = (e, t = 0) => e.reduce((e, n, r, i) => {
|
|
188
190
|
let a;
|
|
189
|
-
return n.children ? (a = `├── ${n.name}`,
|
|
191
|
+
return n.children ? (a = `├── ${n.name}`, I({
|
|
190
192
|
prev: e,
|
|
191
193
|
i: t,
|
|
192
194
|
index: r,
|
|
193
195
|
arr: i,
|
|
194
196
|
curText: a
|
|
195
|
-
}) +
|
|
197
|
+
}) + L(n.children, t + 1)) : (a = `${r === i.length - 1 ? "└── " : "├── "}${n.name}`, I({
|
|
196
198
|
prev: e,
|
|
197
199
|
i: t,
|
|
198
200
|
index: r,
|
|
199
201
|
arr: i,
|
|
200
202
|
curText: a
|
|
201
203
|
}));
|
|
202
|
-
}, ""),
|
|
204
|
+
}, ""), R = (e) => a(e, { withFileTypes: !0 }).sort((e, t) => t.isDirectory() - +e.isDirectory());
|
|
203
205
|
e.command("mkdir").option("-l, --line [数量]", "数量", !1).option("-n, --name [文件名称]", "文件名称", !1).option("-d, --depth [深度值]", "深度值", "3").description("生成目录结构文件").action(({ line: e, name: t }) => {
|
|
204
|
-
|
|
205
|
-
let n = process.cwd(), a =
|
|
206
|
+
P = !!e, typeof e == "string" && (F = +e);
|
|
207
|
+
let n = process.cwd(), a = l(n, ".gitignore");
|
|
206
208
|
if (r(a)) {
|
|
207
209
|
let e = i(a).toString().split("\r\n");
|
|
208
|
-
|
|
210
|
+
j.push(...e);
|
|
209
211
|
}
|
|
210
212
|
let o = [{
|
|
211
213
|
name: n.split("\\").at(-1),
|
|
212
|
-
children:
|
|
214
|
+
children: R(n).map((e) => {
|
|
213
215
|
let { name: t } = e, n = { name: t };
|
|
214
|
-
return !
|
|
216
|
+
return !j.includes(t) && e.isDirectory() && (n.children = R(l(e.path, t)).map(({ name: e }) => ({ name: e }))), n;
|
|
215
217
|
})
|
|
216
218
|
}];
|
|
217
|
-
|
|
219
|
+
P && (L(o), N = !0), s(l(n, `${typeof t == "string" && t || "directory"}.md`), L(o));
|
|
218
220
|
});
|
|
219
221
|
//#endregion
|
|
220
222
|
//#region src/commander/commands/check.ts
|
|
221
|
-
var
|
|
223
|
+
var z = k(), [B] = ["package.json"].map((e) => u(process.cwd(), e)), he = (e, n) => {
|
|
222
224
|
let r = `\r查找进度:[${Array.from({ length: n }, (t, n) => n < e ? "=" : " ").join("")}] ${e}/${n} ${~~(e / n * 100)}%\r`, i = e === n ? t.green(r) : t.yellow(r);
|
|
223
225
|
process.stdout.write(i);
|
|
224
|
-
},
|
|
226
|
+
}, ge = (e, t, n) => {
|
|
225
227
|
let r = "latest";
|
|
226
|
-
return
|
|
228
|
+
return z.resolve.some((t) => {
|
|
227
229
|
let n = t.lastIndexOf("@");
|
|
228
230
|
if (n <= 0) return !0;
|
|
229
231
|
let i = t.slice(0, n), a = t.slice(n + 1);
|
|
@@ -231,21 +233,21 @@ var L = D(), [R] = ["package.json"].map((e) => l(process.cwd(), e)), me = (e, n)
|
|
|
231
233
|
}), {
|
|
232
234
|
name: e,
|
|
233
235
|
value: t,
|
|
234
|
-
newVersion:
|
|
236
|
+
newVersion: z.prefix + n[r],
|
|
235
237
|
tag: r
|
|
236
238
|
};
|
|
237
|
-
},
|
|
238
|
-
let [{ major: t = 0, minor: n = 0, patch: r = 0, release: i = "" }] =
|
|
239
|
+
}, _e = (e, t) => (+!t + 1) * e.length, V = (e) => {
|
|
240
|
+
let [{ major: t = 0, minor: n = 0, patch: r = 0, release: i = "" }] = g(e);
|
|
239
241
|
return [
|
|
240
242
|
+t,
|
|
241
243
|
+n,
|
|
242
244
|
+r,
|
|
243
245
|
i
|
|
244
246
|
];
|
|
245
|
-
},
|
|
246
|
-
let [r, i, a, o] =
|
|
247
|
-
return s > r ? t.red(n) : s < r ? !1 : c > i ? `${s}.${t.yellow(c)}.${t.yellow(l)}${
|
|
248
|
-
},
|
|
247
|
+
}, H = (e, n) => e ? "-" + t[n](e) : "", ve = (e, n) => {
|
|
248
|
+
let [r, i, a, o] = V(e), [s, c, l, u] = V(n);
|
|
249
|
+
return s > r ? t.red(n) : s < r ? !1 : c > i ? `${s}.${t.yellow(c)}.${t.yellow(l)}${H(u, "yellow")}` : c < i ? !1 : l > a ? `${s}.${c}.${t.green(l)}${H(u, "green")}` : l === a && u && u !== o ? `${s}.${c}.${l}${H(u, "green")}` : !1;
|
|
250
|
+
}, ye = (e) => {
|
|
249
251
|
let n = {};
|
|
250
252
|
e.forEach((e) => {
|
|
251
253
|
Object.entries(e).forEach(([e, t]) => {
|
|
@@ -264,91 +266,91 @@ var L = D(), [R] = ["package.json"].map((e) => l(process.cwd(), e)), me = (e, n)
|
|
|
264
266
|
value: i,
|
|
265
267
|
newVersion: a,
|
|
266
268
|
tag: o
|
|
267
|
-
}).map(([e, t]) =>
|
|
269
|
+
}).map(([e, t]) => A(_e(t, s), n[e])), f = t.yellow("→"), p = !0;
|
|
268
270
|
if (s) {
|
|
269
|
-
let e =
|
|
271
|
+
let e = ve(i, a);
|
|
270
272
|
e ? a = e : p = !1;
|
|
271
273
|
} else e = t.green(e), i = t.green(i), a = t.green(a), o = t.green(o), f = " ";
|
|
272
|
-
let
|
|
273
|
-
p && r.push(
|
|
274
|
-
}), r.length > 1 ? r.forEach(
|
|
275
|
-
},
|
|
276
|
-
|
|
274
|
+
let m = `${e + c} ${l + i} ${f} ${u + a} ${d + o}`;
|
|
275
|
+
p && r.push(m);
|
|
276
|
+
}), r.length > 1 ? r.forEach(C) : x("所有版本已是最新");
|
|
277
|
+
}, be = async (e, t, n) => {
|
|
278
|
+
C();
|
|
277
279
|
let r = 0, i = [], a = Object.entries(e), o = a.map(async ([e, o]) => {
|
|
278
|
-
let s =
|
|
280
|
+
let s = ge(e, o, (await h.packument(e, { registry: z.registry }))["dist-tags"]);
|
|
279
281
|
i.push(s), t.forEach((t) => {
|
|
280
282
|
let r = n[t];
|
|
281
283
|
r && r[e] && (r[e] = s.newVersion);
|
|
282
|
-
}), r++, await
|
|
284
|
+
}), r++, await he(r, a.length);
|
|
283
285
|
});
|
|
284
|
-
return await Promise.all(o),
|
|
286
|
+
return await Promise.all(o), C(), C(), i;
|
|
285
287
|
};
|
|
286
288
|
e.command("check").option("-u, --update", "更新 package.json 依赖内容", !1).description("升级 package.json 依赖版本").action(async ({ update: e }) => {
|
|
287
|
-
if (!r(
|
|
288
|
-
let t = e ||
|
|
289
|
+
if (!r(B)) return S("package.json 文件不存在");
|
|
290
|
+
let t = e || z.check, n = i(B).toString(), a = JSON.parse(n), o = [
|
|
289
291
|
"dependencies",
|
|
290
292
|
"devDependencies",
|
|
291
293
|
"optionalDependencies"
|
|
292
294
|
], c = {}, l = JSON.parse(n);
|
|
293
295
|
o.forEach((e) => {
|
|
294
296
|
a[e] && Object.entries(a[e]).forEach(([e, t]) => {
|
|
295
|
-
!
|
|
297
|
+
!z.reject.includes(e) && (c[e] = t);
|
|
296
298
|
});
|
|
297
299
|
});
|
|
298
|
-
let u = await
|
|
299
|
-
t ? (s(
|
|
300
|
+
let u = await be(c, o, l);
|
|
301
|
+
t ? (s(B, JSON.stringify(l, null, 2)), x("文件 package.json 已更新"), C()) : ye(u);
|
|
300
302
|
});
|
|
301
303
|
//#endregion
|
|
302
304
|
//#region src/commander/commands/comment.ts
|
|
303
|
-
var
|
|
305
|
+
var xe = k(), U = "comment.md", [W, G] = ["package.json", U].map((e) => u(process.cwd(), e));
|
|
304
306
|
e.command("comment").description("生成依赖注释文件").action(() => {
|
|
305
|
-
if (!r(
|
|
306
|
-
let e = i(
|
|
307
|
+
if (!r(W)) return S("package.json 文件不存在");
|
|
308
|
+
let e = i(W).toString(), n = JSON.parse(e), a = [
|
|
307
309
|
"dependencies",
|
|
308
310
|
"devDependencies",
|
|
309
311
|
"optionalDependencies"
|
|
310
312
|
], o = "### 依赖解析\n\n";
|
|
311
313
|
a.forEach((e) => {
|
|
312
314
|
n[e] && (o += `#### ${e}\n\n`, Object.keys(n[e]).forEach((e) => {
|
|
313
|
-
o += `- \`${e}\`: ${
|
|
315
|
+
o += `- \`${e}\`: ${xe.comment[e] || ""}\n`;
|
|
314
316
|
}), o += "\n");
|
|
315
|
-
}), o = o.slice(0, -1), s(
|
|
317
|
+
}), o = o.slice(0, -1), s(G, o), C(), x(`${U} 文件创建成功`), C(), C(t.green(`文件目录 ${G}`));
|
|
316
318
|
});
|
|
317
319
|
//#endregion
|
|
318
320
|
//#region src/commander/commands/vscode.ts
|
|
319
|
-
var
|
|
321
|
+
var Se = {
|
|
320
322
|
recursive: !0,
|
|
321
323
|
force: !0
|
|
322
324
|
};
|
|
323
325
|
e.command("vscode-config").description("更新 .vscode 配置文件").action(() => {
|
|
324
|
-
let e = `${+/* @__PURE__ */ new Date()}`, t =
|
|
325
|
-
|
|
326
|
-
!e && n(
|
|
326
|
+
let e = `${+/* @__PURE__ */ new Date()}`, t = l(process.cwd()), r = l(t, e);
|
|
327
|
+
_("direct:https://gitee.com/biaovorg/vscode-config.git#master", r, { clone: !0 }, async (e) => {
|
|
328
|
+
!e && n(l(r, ".vscode"), l(t, ".vscode"), Se), o(r, Se);
|
|
327
329
|
});
|
|
328
330
|
});
|
|
329
331
|
//#endregion
|
|
330
332
|
//#region src/commander/commands/node.ts
|
|
331
|
-
var
|
|
333
|
+
var Ce = (e, t, n) => {
|
|
332
334
|
let r = Object.entries(t), i = r.findIndex(([t]) => e === t), [a, o] = r[i];
|
|
333
335
|
if (o) {
|
|
334
|
-
if (n[a] === o) return i === r.length - 1 ? !0 :
|
|
336
|
+
if (n[a] === o) return i === r.length - 1 ? !0 : Ce(r[i + 1][0], t, n);
|
|
335
337
|
} else return !0;
|
|
338
|
+
}, we = (e) => {
|
|
339
|
+
e && (p(`nvm use ${e}`), C(), x(`切换成功 当前版本:${e}`), C());
|
|
336
340
|
}, K = (e) => {
|
|
337
|
-
e && (
|
|
338
|
-
}, q = (e) => {
|
|
339
|
-
e && f(`nvm install ${e}`);
|
|
341
|
+
e && p(`nvm install ${e}`);
|
|
340
342
|
};
|
|
341
343
|
e.command("node [版本号]").option("-i, --install", "是否安装此版本", !1).description("切换 node 版本,默认选择第一个版本").action((e, n) => {
|
|
342
|
-
let r =
|
|
343
|
-
if (e.major === i) return s.push(e),
|
|
344
|
+
let r = g(p("nvm ls").toString()), [{ major: i, minor: a, patch: o }] = g(e), s = [], c = r.find((e) => {
|
|
345
|
+
if (e.major === i) return s.push(e), Ce("minor", {
|
|
344
346
|
minor: a,
|
|
345
347
|
patch: o
|
|
346
348
|
}, e);
|
|
347
349
|
});
|
|
348
|
-
if (c)
|
|
349
|
-
else if (
|
|
350
|
+
if (c) we(c.semver);
|
|
351
|
+
else if (C(), C(t.red(`输入的版本 ${e} 不存在`)), C(), s.length) {
|
|
350
352
|
let t = s.map((e) => e.semver);
|
|
351
|
-
|
|
353
|
+
v.prompt({
|
|
352
354
|
type: "list",
|
|
353
355
|
name: "preset",
|
|
354
356
|
message: "请选择相似版本或输入版本进行安装:",
|
|
@@ -360,125 +362,138 @@ e.command("node [版本号]").option("-i, --install", "是否安装此版本", !
|
|
|
360
362
|
}).then(({ preset: t }) => {
|
|
361
363
|
if (t !== "取消") if (t === e) {
|
|
362
364
|
if (!o) return;
|
|
363
|
-
|
|
364
|
-
} else
|
|
365
|
+
K(t);
|
|
366
|
+
} else we(t);
|
|
365
367
|
});
|
|
366
368
|
} else {
|
|
367
369
|
if (!o) return;
|
|
368
370
|
if (n.install) {
|
|
369
|
-
|
|
371
|
+
K(e);
|
|
370
372
|
return;
|
|
371
373
|
}
|
|
372
|
-
|
|
374
|
+
v.prompt({
|
|
373
375
|
type: "confirm",
|
|
374
376
|
name: "isInstall",
|
|
375
377
|
message: `是否安装 ${e}?`
|
|
376
378
|
}).then(({ isInstall: t }) => {
|
|
377
|
-
t &&
|
|
379
|
+
t && K(e);
|
|
378
380
|
});
|
|
379
381
|
}
|
|
380
382
|
});
|
|
381
383
|
//#endregion
|
|
382
384
|
//#region src/commander/commands/ai.ts
|
|
383
|
-
var
|
|
385
|
+
var q = [
|
|
384
386
|
"ANTHROPIC_AUTH_TOKEN",
|
|
385
387
|
"ANTHROPIC_BASE_URL",
|
|
386
388
|
"ANTHROPIC_MODEL",
|
|
387
389
|
"ANTHROPIC_SMALL_FAST_MODEL"
|
|
388
|
-
],
|
|
389
|
-
r(
|
|
390
|
-
let e = JSON.parse(i(
|
|
390
|
+
], Te = D(u(import.meta.dirname, "ai.jsonc"), !0), Ee = Object.entries(Te)[0], J = u(y.homedir(), ".claude/settings.json"), De = u(y.homedir(), ".claude/settings.local.json"), Y = u(y.homedir(), ".ai-model.json"), X = () => {
|
|
391
|
+
r(J) || (S(`${J} 文件不存在,请先检查或者去安装 Claude Code`), process.exit(1));
|
|
392
|
+
let e = JSON.parse(i(J).toString());
|
|
391
393
|
return !e.env && (e.env = {}), e;
|
|
392
|
-
},
|
|
393
|
-
|
|
394
|
-
let e = JSON.parse(i(
|
|
395
|
-
if (e ===
|
|
396
|
-
let n = t.env, r =
|
|
397
|
-
return !(!n ||
|
|
394
|
+
}, Oe = () => {
|
|
395
|
+
C(), r(Y) || (S("配置不存在,请先使用 `ai init` 初始化 AI 模型配置"), process.exit(1));
|
|
396
|
+
let e = JSON.parse(i(Y).toString()), n = Object.entries(e).filter(([e, t]) => {
|
|
397
|
+
if (e === Ee[0]) return !1;
|
|
398
|
+
let n = t.env, r = Ee[1].env;
|
|
399
|
+
return !(!n || q.some((e) => !n[e] || n[e] === r[e]));
|
|
398
400
|
});
|
|
399
|
-
return n.length || (
|
|
400
|
-
},
|
|
401
|
-
if (
|
|
402
|
-
|
|
401
|
+
return n.length || (C(`暂无已配置的 AI 模型,请先配置,路径 ${t.green(Y)}`), process.exit(1)), [n, e];
|
|
402
|
+
}, ke = () => {
|
|
403
|
+
if (C(), r(Y)) {
|
|
404
|
+
C(`配置已存在,路径 ${t.green(Y)}`);
|
|
403
405
|
return;
|
|
404
406
|
}
|
|
405
|
-
s(
|
|
406
|
-
},
|
|
407
|
-
let [e] =
|
|
407
|
+
s(Y, JSON.stringify(Te, null, 2)), x(`配置已初始化,路径 ${t.green(Y)}`);
|
|
408
|
+
}, Ae = (e) => e.replace(/[\u4e00-\u9fa5]/g, "aa").length, je = () => {
|
|
409
|
+
let [e] = Oe(), n = 0, r = -1, i = X();
|
|
408
410
|
e.forEach(([e, t], a) => {
|
|
409
|
-
n = Math.max(n,
|
|
411
|
+
n = Math.max(n, Ae(e)), r < 0 && !q.some((e) => i.env[e] !== t.env[e]) && (r = a);
|
|
410
412
|
}), e.forEach(([e, i], a) => {
|
|
411
413
|
let { ANTHROPIC_BASE_URL: o } = i.env;
|
|
412
|
-
|
|
414
|
+
C(`${a === r ? t.green("*") : " "} ${e} ${A(Ae(e), n + 4, "-")} ${o}`);
|
|
413
415
|
});
|
|
414
|
-
},
|
|
415
|
-
let n =
|
|
416
|
-
r.some(([t]) => t === e) || (
|
|
417
|
-
},
|
|
416
|
+
}, Me = async (e) => {
|
|
417
|
+
let n = X(), [r, i] = Oe();
|
|
418
|
+
r.some(([t]) => t === e) || (C(`模型 ${t.red(e)} 不存在`), process.exit(1)), q.some((t) => n.env[t] !== i[e].env[t]) ? (n.env = i[e].env, s(J, JSON.stringify(n, null, 2)), x(`模型 ${t.green(e)} 已切换`)) : C(`当前正处于 ${t.green(e)} 模型,无需切换`);
|
|
419
|
+
}, Z = () => {
|
|
418
420
|
let e = "@anthropic-ai/claude-code";
|
|
419
421
|
try {
|
|
420
|
-
|
|
421
|
-
let i =
|
|
422
|
-
return r(s) ? (!r(
|
|
422
|
+
p(`npm list -g ${e} --depth=0`).toString().trim().includes(e) || (S(t.red(`请使用 nodejs 安装 ${e}`)), process.exit(1));
|
|
423
|
+
let i = p("npm root -g").toString().trim(), a = u(i, e, "cli.js"), o = u(i, e, "cli.bak.js"), s = u(i, e, "bin/claude.exe"), c = u(i, e, "bin/claude.zh.exe"), l = u(i, e, "bin/claude.bak.exe"), d = !1;
|
|
424
|
+
return r(s) ? (!r(l) && n(s, l), d = !0) : !r(o) && n(a, o), {
|
|
423
425
|
cliPath: a,
|
|
424
426
|
cliPathBak: o,
|
|
425
427
|
exePath: s,
|
|
426
|
-
|
|
427
|
-
|
|
428
|
+
exeZhPath: c,
|
|
429
|
+
exePathBak: l,
|
|
430
|
+
isExistExe: d
|
|
428
431
|
};
|
|
429
432
|
} catch {
|
|
430
|
-
|
|
433
|
+
S(t.red(`请使用 nodejs 安装 ${e}`)), process.exit(1);
|
|
431
434
|
}
|
|
432
|
-
},
|
|
433
|
-
|
|
434
|
-
let { cliPath:
|
|
435
|
-
if (
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
for (; (a = e.indexOf(r, a)) !== -1;) i.copy(e, a), e.fill(32, a + i.length, a + r.length), a += r.length;
|
|
442
|
-
}), s(t, e);
|
|
435
|
+
}, Ne = async () => {
|
|
436
|
+
C(), C("开始汉化 Claude Code");
|
|
437
|
+
let e = Z(), { cliPath: t, exePath: a, exeZhPath: o, isExistExe: c } = e;
|
|
438
|
+
if (c) {
|
|
439
|
+
if (r(o)) {
|
|
440
|
+
n(o, a);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
await Le(e), n(o, a);
|
|
443
444
|
} else {
|
|
444
|
-
let
|
|
445
|
-
s(
|
|
445
|
+
let e = i(t).toString(), n = (await import("./keyword-B5vOiHTH.js")).default;
|
|
446
|
+
s(t, Object.entries(n).reduce((e, [t, n]) => {
|
|
446
447
|
let r = t.replace(/\n/g, "\\\\n").replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), i = n.replace(/\n/g, "\\n");
|
|
447
448
|
return ["`", "\\"].includes(r[0]) ? e.replace(new RegExp(r, "g"), n) : e.replace(RegExp(`\"${r}\"`, "g"), `\"${i}\"`).replace(RegExp(`(\'${r}\')`, "g"), `\'${i}\'`);
|
|
448
|
-
},
|
|
449
|
+
}, e));
|
|
449
450
|
}
|
|
450
|
-
|
|
451
|
-
},
|
|
452
|
-
|
|
453
|
-
let { cliPath: e, cliPathBak: t, exePath: r, exePathBak: i, isExistExe: a } =
|
|
454
|
-
a ? n(i, r) : n(t, e),
|
|
455
|
-
},
|
|
456
|
-
|
|
457
|
-
let e = (await import("./claude.settings-
|
|
458
|
-
s(
|
|
459
|
-
},
|
|
460
|
-
if (
|
|
461
|
-
|
|
451
|
+
x("Claude Code 已汉化");
|
|
452
|
+
}, Pe = () => {
|
|
453
|
+
C(), C("开始恢复 Claude Code");
|
|
454
|
+
let { cliPath: e, cliPathBak: t, exePath: r, exePathBak: i, isExistExe: a } = Z();
|
|
455
|
+
a ? n(i, r) : n(t, e), x("Claude Code 已恢复成英文");
|
|
456
|
+
}, Fe = async () => {
|
|
457
|
+
C();
|
|
458
|
+
let e = (await import("./claude.settings-D0MSYWxl.js")).default, n = X();
|
|
459
|
+
Object.assign(n, e), s(J, JSON.stringify(n, null, 2)), x(`Claude Code 配置成功,请前往查看:${t.yellow(J)}`);
|
|
460
|
+
}, Ie = async () => {
|
|
461
|
+
if (C(), C("开始配置 Claude Code 默认权限"), C(), !r(De)) {
|
|
462
|
+
Fe();
|
|
462
463
|
return;
|
|
463
464
|
}
|
|
464
|
-
|
|
465
|
+
v.prompt({
|
|
465
466
|
type: "confirm",
|
|
466
467
|
name: "isOk",
|
|
467
|
-
message: "
|
|
468
|
+
message: "存在本地配置文件,继续配置会直接覆盖本地配置文件里的属性内容,是否继续 ?"
|
|
468
469
|
}).then(({ isOk: e }) => {
|
|
469
|
-
e &&
|
|
470
|
+
e && Fe();
|
|
470
471
|
});
|
|
472
|
+
}, Le = async ({ cliPath: e, exePath: t, exeZhPath: n, exePathBak: r, isExistExe: a }) => {
|
|
473
|
+
let o = c(t), l = t, d = u(o, me());
|
|
474
|
+
p(`npx bun-extractor "${l}" -o "${d}"`, { stdio: "ignore" });
|
|
475
|
+
let f = u(d, te(i(l)).entryPoint.path), m = i(f).toString(), ee = (await import("./keyword-B5vOiHTH.js")).default, h = Object.entries(ee).reduce((e, [t, n]) => {
|
|
476
|
+
let r = t.replace(/\n/g, "\\\\n").replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), i = n.replace(/\n/g, "\\n");
|
|
477
|
+
return ["`", "\\"].includes(r[0]) ? e.replace(new RegExp(r, "g"), n) : e.replace(RegExp(`\"${r}\"`, "g"), `\"${i}\"`).replace(RegExp(`(\'${r}\')`, "g"), `\'${i}\'`);
|
|
478
|
+
}, m), g = Array.from(h).map((e) => {
|
|
479
|
+
let t = e.charCodeAt(0);
|
|
480
|
+
return t >= 19968 && t <= 40959 ? `\\u${t.toString(16).padStart(4, "0")}` : e;
|
|
481
|
+
}).join(""), _ = f.slice(0, -3) + ".zh.js";
|
|
482
|
+
s(_, g);
|
|
483
|
+
let v = `import { dirname, resolve } from 'node:path'
|
|
484
|
+
await import(resolve(dirname(process.execPath), "${_.replace(/\\/g, "/")}"))`, y = u(d, "entry.js");
|
|
485
|
+
s(y, v), p(`bun build ${y} --compile --icon=claude-code.ico --outfile ${l.slice(0, -4) + ".zh.exe"}`, { stdio: "ignore" });
|
|
471
486
|
}, Q = e.command("ai").description("AI 命令,详细操作请查看 ai -h").helpOption("-h, --help", "输出所有命令").helpCommand(!1);
|
|
472
|
-
Q.command("init").description("初始化 AI 模型配置").action(
|
|
487
|
+
Q.command("init").description("初始化 AI 模型配置").action(ke), Q.command("ls").description("查看当前已配置的 AI 模型").action(je), Q.command("use <模型>").description("切换 AI 模型").action(Me), Q.command("zh").description("汉化 Claude Code").action(Ne), Q.command("zh-restore").description("恢复汉化 Claude Code").action(Pe), Q.command("config").description("配置 Claude Code 默认权限").action(Ie), e.usage("[commands] [options]").version(ie, "-v, --version", "输出版本号").helpOption("-h, --help", "输出所有命令"), e.command("build[:环境] [描述]").description("简化打包提交命令"), e.command("version<[++]|[@<版本号>]>").description("例如:version++ 或者 version@1.0.0;自动更新 package.json 版本号,自动更新 `README.md` 中的 `version-v<version>-blue` 图标版本"), e.arguments("<cmd> [env]").action((e, t) => {
|
|
473
488
|
de(e, t);
|
|
474
489
|
}), process.argv.length < 3 ? e.help() : e.parse(process.argv);
|
|
475
490
|
//#endregion
|
|
476
491
|
//#region src/update.ts
|
|
477
|
-
var $ =
|
|
478
|
-
pkg:
|
|
492
|
+
var $ = ne({
|
|
493
|
+
pkg: b,
|
|
479
494
|
updateCheckInterval: 1e3 * 1
|
|
480
495
|
});
|
|
481
|
-
if ($.update && $.update.latest !==
|
|
496
|
+
if ($.update && $.update.latest !== b.version) {
|
|
482
497
|
let e = "";
|
|
483
498
|
switch ($.update.type) {
|
|
484
499
|
case "major":
|
|
@@ -491,7 +506,7 @@ if ($.update && $.update.latest !== _.version) {
|
|
|
491
506
|
e = t.green("{latestVersion}");
|
|
492
507
|
break;
|
|
493
508
|
}
|
|
494
|
-
let n = `https://github.com/biaov/${
|
|
509
|
+
let n = `https://github.com/biaov/${b.name}/compare/v${b.version}...v{latestVersion}`;
|
|
495
510
|
$.notify({
|
|
496
511
|
defer: !1,
|
|
497
512
|
isGlobal: !0,
|
|
@@ -1,25 +1,39 @@
|
|
|
1
1
|
//#region src/config/keyword.ts
|
|
2
2
|
var e = {
|
|
3
3
|
"Auto-compact": "自动压缩",
|
|
4
|
+
"Switch models when a message is flagged": "当消息被标记时切换模型",
|
|
4
5
|
"Show tips": "显示提示",
|
|
5
6
|
"Reduce motion": "减少动画效果",
|
|
6
7
|
"Thinking mode": "深度思考模式",
|
|
8
|
+
"Session recap": "会话总结",
|
|
7
9
|
"`Fast mode (${Ok} only)`": "`快速模式(仅限 ${Ok})`",
|
|
8
10
|
"Prompt suggestions": "提示词建议",
|
|
9
|
-
"Rewind code (checkpoints)": "
|
|
11
|
+
"Rewind code (checkpoints)": "代码回退(检查点)",
|
|
10
12
|
"Verbose output": "详细输出",
|
|
11
13
|
"Terminal progress bar": "终端进度条",
|
|
12
14
|
"Show turn duration": "显示每轮耗时条",
|
|
15
|
+
"Dynamic workflows": "动态工作流",
|
|
16
|
+
"Ultracode keyword trigger": "Ultracode 关键词触发",
|
|
17
|
+
"Dynamic workflow size": "动态工作流大小",
|
|
13
18
|
"Default permission mode": "默认权限模式",
|
|
19
|
+
"Worktree base ref": "工作树基础引用",
|
|
20
|
+
"Use auto mode during plan": "在计划中使用自动模式",
|
|
14
21
|
"Respect .gitignore in file picker": "文件选择器中遵守 .gitignore 规则",
|
|
22
|
+
"Skip the /copy picker": "跳过 /copy 选择器",
|
|
23
|
+
"Open agents view by default": "默认打开智能体视图",
|
|
24
|
+
"opens agents": "打开智能体",
|
|
15
25
|
"Always copy full response (skip /copy picker)": "始终复制完整回复(跳过 /copy 选择器)",
|
|
16
26
|
"Auto-update channel": "自动更新频道",
|
|
17
27
|
Theme: "主题",
|
|
18
28
|
Notifications: "通知",
|
|
29
|
+
"Local notifications": "本地通知",
|
|
19
30
|
"Output style": "输出风格",
|
|
20
31
|
Language: "语言",
|
|
21
32
|
"Editor mode": "编辑器模式",
|
|
33
|
+
"Question auto-continue timeout": "问题自动继续超时时间",
|
|
34
|
+
"Show last response in external editor": "在外部编辑器中显示最后一条回复",
|
|
22
35
|
Model: "模型",
|
|
36
|
+
"Diff tool": "差异工具",
|
|
23
37
|
"Auto-install IDE extension": "自动安装 IDE 扩展",
|
|
24
38
|
"Enable Claude in Chrome by default": "默认启用 Chrome 中的 Claude",
|
|
25
39
|
Usage: "使用量",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mine-auto-cli",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "2.8.
|
|
4
|
+
"version": "2.8.2",
|
|
5
5
|
"exports": "./dist/index.js",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"type": "module",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
}
|
|
46
46
|
],
|
|
47
47
|
"dependencies": {
|
|
48
|
+
"@avmc/bun-extractor": "^0.5.1",
|
|
48
49
|
"chalk": "^5.6.2",
|
|
49
50
|
"commander": "^15.0.0",
|
|
50
51
|
"download-git-repo": "^3.0.2",
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
//#region src/config/keyword-latest.ts
|
|
2
|
-
var e = {
|
|
3
|
-
"Search settings": "搜索",
|
|
4
|
-
"Auto-compact": "自动压缩",
|
|
5
|
-
"Show tips": "提示",
|
|
6
|
-
"Reduce motion": "减少动画",
|
|
7
|
-
"Thinking mode": "深度思考",
|
|
8
|
-
"Session recap": "会议",
|
|
9
|
-
"Rewind code (checkpoints)": "代码回退",
|
|
10
|
-
"Dynamic workflows": "动态工作流",
|
|
11
|
-
"Ultracode keyword trigger": "关键词触发",
|
|
12
|
-
"Verbose output": "详细输出",
|
|
13
|
-
"Terminal progress bar": "进度条",
|
|
14
|
-
"Show turn duration": "耗时条",
|
|
15
|
-
"Default permission mode": "默认权限",
|
|
16
|
-
"Worktree base ref": "工作树引用",
|
|
17
|
-
"Use auto mode during plan": "计划时自动模式",
|
|
18
|
-
"Respect .gitignore in file picker": "选择文件遵守.gitignore",
|
|
19
|
-
"Skip the /copy picker": "跳过/copy选择",
|
|
20
|
-
"Open agents view by default": "默认打开代理视图",
|
|
21
|
-
"opens agents": "代理",
|
|
22
|
-
"Auto-update channel": "自动更新",
|
|
23
|
-
"Local notifications": "本地通知",
|
|
24
|
-
"Output style": "输出风格",
|
|
25
|
-
"\"Language\"": "\"语言\"",
|
|
26
|
-
"Editor mode": "编辑",
|
|
27
|
-
"Show last response in external editor": "显示最新回复",
|
|
28
|
-
"Show PR status footer": "显示PR状态",
|
|
29
|
-
"Auto-connect to IDE (external terminal)": "自动连接到IDE",
|
|
30
|
-
"Auto-install IDE extension": "自动安装IDE扩展",
|
|
31
|
-
"Diff tool": "对比",
|
|
32
|
-
"Claude in Chrome enabled by default": "Claude在Chrome启用",
|
|
33
|
-
"Welcome back!": "欢迎回来!",
|
|
34
|
-
"Tips for getting started": "入门技巧",
|
|
35
|
-
"What's new": "最新",
|
|
36
|
-
"API Usage Billing": "API使用计费",
|
|
37
|
-
"Run /init to create a CLAUDE.md file with instructions for Claude": "/init创建CLAUDE.md文件,包含 Claude 的说明",
|
|
38
|
-
"Recent activity": "最近活动记录",
|
|
39
|
-
"No recent activity": "暂无最近活动记录",
|
|
40
|
-
"create a util logging.py that...": "创建logging.py,用于...",
|
|
41
|
-
"Initialize a new CLAUDE.md file with codebase documentation": "初始化新的 CLAUDE.md 文件,写入相关文档说明",
|
|
42
|
-
"Review changed code for reuse, quality, and efficiency, then fix any issues found.": "检查修改过的代码,评估其可复用性、代码质量和执行效率,然后修复发现的所有问题。",
|
|
43
|
-
"Add a new working directory": "添加新的目录",
|
|
44
|
-
"Clear conversation history and free up context": "清除对话历史记录,释放上下文空间",
|
|
45
|
-
"Set the prompt bar color for this session": "设置本次会话的提示栏颜色",
|
|
46
|
-
"Clear conversation history but keep a summary in context. Optional: /compact [instructions for summarization]": "清除对话历史记录,但在上下文中保留一份摘要。可选:/compact [摘要的自定义指令]",
|
|
47
|
-
"Open config panel": "设置",
|
|
48
|
-
"Copy Claude's last response to clipboard (or /copy N for the Nth-latest)": "复制 Claude 最新回复到剪贴板(/copy N复制第N条)",
|
|
49
|
-
"Show the total cost and duration of the current session": "显示当前会话的总费用和持续时间",
|
|
50
|
-
"Continue the current session in Claude Desktop": "在 Claude Desktop 中继续当前会话",
|
|
51
|
-
"View uncommitted changes and per-turn diffs": "查看未提交的差异",
|
|
52
|
-
"Diagnose and verify your Claude Code installation and settings": "诊断并验证 Claude Code 的安装和设置",
|
|
53
|
-
"Set effort level for model usage": "设置模型使用等级",
|
|
54
|
-
"Exit the REPL": "退出 REPL",
|
|
55
|
-
"Export the current conversation to a file or clipboard": "将当前对话导出到文件或剪贴板",
|
|
56
|
-
"Show help and available commands": "显示帮助和命令",
|
|
57
|
-
"View hook configurations for tool events": "查看工具事件的钩子配置",
|
|
58
|
-
"Manage IDE integrations and show status": "管理 IDE 集成并显示状态",
|
|
59
|
-
"Set up Claude GitHub Actions for a repository": "为仓库配置 Claude GitHub Actions",
|
|
60
|
-
"Install the Claude Slack app": "安装 Claude Slack 应用",
|
|
61
|
-
"Sign in with your Anthropic account": "使用 Anthropic 账号登录",
|
|
62
|
-
"Sign out from your Anthropic account": "退出 Anthropic 账号",
|
|
63
|
-
"Manage MCP servers": "管理 MCP",
|
|
64
|
-
"Edit Claude memory files": "编辑 Claude 记忆",
|
|
65
|
-
"Show QR code to download the Claude mobile app": "显示二维码下载 Claude App",
|
|
66
|
-
"Manage allow & deny tool permission rules": "管理工具的权限规则",
|
|
67
|
-
"Enable plan mode or view the current session plan": "启用计划模式或查看当前会话计划",
|
|
68
|
-
"Manage Claude Code plugins": "管理 Claude Code 插件",
|
|
69
|
-
"View release notes": "查看发布说明",
|
|
70
|
-
"Activate pending plugin changes in the current session": "在当前会话中激活待生效的插件更改",
|
|
71
|
-
"Rename the current conversation": "重命名当前对话",
|
|
72
|
-
"Resume a previous conversation": "恢复之前的对话",
|
|
73
|
-
"Restore the code and/or conversation to a previous point": "将代码和/或对话恢复到之前的某个节点",
|
|
74
|
-
"List available skills": "列出可用的技能",
|
|
75
|
-
"Show your Claude Code usage statistics and activity": "显示 Claude Code 的使用统计和活动记录",
|
|
76
|
-
"Show Claude Code status including version, model, account, API connectivity, and tool statuses": "显示 Claude Code 状态,包括版本、模型、账号、API 连接和工具状态",
|
|
77
|
-
"Order Claude Code stickers": "订购 Claude Code 贴纸",
|
|
78
|
-
"List and manage background tasks": "列出并管理后台任务",
|
|
79
|
-
"Install Shift+Enter key binding for newlines": "安装 Shift+Enter 换行快捷键绑定",
|
|
80
|
-
"Change the theme": "更改主题",
|
|
81
|
-
"Upgrade to Max for higher rate limits and more Opus": "升级 Max 获得高速率和更多 Opus",
|
|
82
|
-
"Show plan usage limits": "显示计划用量限制",
|
|
83
|
-
"Toggle between Vim and Normal editing modes": "在 Vim 和普通编辑模式之间切换",
|
|
84
|
-
"Generate a report analyzing your Claude Code sessions": "生成分析 Claude Code 会话的报告",
|
|
85
|
-
"Get comments from a GitHub pull request": "获取 GitHub Pull Request 的评论",
|
|
86
|
-
"Review a pull request": "审查 Pull Request",
|
|
87
|
-
"Complete a security review of the pending changes on the current branch": "对当前分支的待提交更改进行安全审查",
|
|
88
|
-
"Set up Claude Code's status line UI": "配置 Claude Code 的状态栏 UI",
|
|
89
|
-
"Type to filter": "过滤",
|
|
90
|
-
"Ask a quick side question without interrupting the main conversation": "提问一个临时问题,不打断主对话",
|
|
91
|
-
"Config dialog dismissed": "对话框已关闭",
|
|
92
|
-
"Manage agent configurations": "管理 Agent 配置"
|
|
93
|
-
};
|
|
94
|
-
//#endregion
|
|
95
|
-
export { e as default };
|