mine-auto-cli 2.8.2 → 2.9.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/README.md
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
- [x] [切换 Node 版本](#切换-node-版本)
|
|
23
23
|
- [x] [切换 AI 模型](#切换-ai-模型)
|
|
24
24
|
- [x] [汉化 Claude Code](#汉化-claude-code)
|
|
25
|
+
- [x] [压缩图片](#压缩图片)
|
|
25
26
|
|
|
26
27
|
## 全局安装
|
|
27
28
|
|
|
@@ -225,6 +226,9 @@ auto ai -h
|
|
|
225
226
|
|
|
226
227
|
# 设置 Claude Code 权限
|
|
227
228
|
auto ai config
|
|
229
|
+
|
|
230
|
+
# 查看 Claude Code 配置信息
|
|
231
|
+
auto ai config-ls
|
|
228
232
|
```
|
|
229
233
|
|
|
230
234
|
### 汉化 Claude Code
|
|
@@ -237,6 +241,27 @@ auto ai zh
|
|
|
237
241
|
auto ai zh-restore
|
|
238
242
|
```
|
|
239
243
|
|
|
244
|
+
### 压缩图片
|
|
245
|
+
|
|
246
|
+
- 基于 `sharp` 压缩图片,默认采用 TinyPNG 风格的智能有损压缩(PNG 调色板量化、JPEG 优化量化表)
|
|
247
|
+
- 递归处理子目录并保持原目录结构,默认输出到图片目录下的 `mini` 子目录
|
|
248
|
+
- 压缩后体积未减小的图片会原样输出;GIF / SVG 等不支持的文件会跳过
|
|
249
|
+
- 需要画质完全不变时添加 `--lossless` 切换为无损压缩(体积会明显更大)
|
|
250
|
+
|
|
251
|
+
```sh
|
|
252
|
+
# 压缩 images 目录,输出到 images/mini
|
|
253
|
+
auto mini ./images
|
|
254
|
+
|
|
255
|
+
# 指定输出目录
|
|
256
|
+
auto mini ./images ./dist-images
|
|
257
|
+
|
|
258
|
+
# 转换为 webp(可选 png / jpg / webp / avif / tiff)
|
|
259
|
+
auto mini ./images -e webp
|
|
260
|
+
|
|
261
|
+
# 无损压缩
|
|
262
|
+
auto mini ./images --lossless
|
|
263
|
+
```
|
|
264
|
+
|
|
240
265
|
### 技术栈
|
|
241
266
|
|
|
242
267
|
- `Vite` + `TypeScript` + `NodeJs`
|
|
@@ -254,6 +279,7 @@ auto ai zh-restore
|
|
|
254
279
|
- `ora`: 动画效果
|
|
255
280
|
- `pacote`: 包信息请求器
|
|
256
281
|
- `semver-utils`: 解析包版本
|
|
282
|
+
- `sharp`: 图片压缩
|
|
257
283
|
- `strip-json-comments`: 移除 json 注释
|
|
258
284
|
- `update-notifier`: 检查更新
|
|
259
285
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
var e = {
|
|
2
|
+
env: { DISABLE_AUTOUPDATER: "1" },
|
|
3
|
+
permissions: {
|
|
4
|
+
allow: [
|
|
5
|
+
"Read(//**)",
|
|
6
|
+
"Edit(//**)",
|
|
7
|
+
"Delete(//**)",
|
|
8
|
+
"Bash(*)"
|
|
9
|
+
],
|
|
10
|
+
deny: [
|
|
11
|
+
"Bash(git add *)",
|
|
12
|
+
"Bash(git commit *)",
|
|
13
|
+
"Bash(git push *)",
|
|
14
|
+
"Bash(git reset *)",
|
|
15
|
+
"Bash(git checkout *)",
|
|
16
|
+
"Bash(git switch *)",
|
|
17
|
+
"Bash(git merge *)",
|
|
18
|
+
"Bash(git rebase *)",
|
|
19
|
+
"Bash(git branch *)",
|
|
20
|
+
"Bash(git rm *)",
|
|
21
|
+
"Bash(git mv *)",
|
|
22
|
+
"Bash(git tag *)",
|
|
23
|
+
"Bash(git stash *)",
|
|
24
|
+
"Bash(git clean *)",
|
|
25
|
+
"Bash(git cherry-pick *)",
|
|
26
|
+
"Bash(git revert *)"
|
|
27
|
+
],
|
|
28
|
+
defaultMode: "bypassPermissions"
|
|
29
|
+
},
|
|
30
|
+
enabledPlugins: {
|
|
31
|
+
"context7@claude-plugins-official": !0,
|
|
32
|
+
"frontend-design@claude-plugins-official": !0,
|
|
33
|
+
"superpowers@claude-plugins-official": !0,
|
|
34
|
+
"claude-mem@thedotmack": !0,
|
|
35
|
+
"code-simplifier@claude-plugins-official": !0
|
|
36
|
+
},
|
|
37
|
+
language: "Chinese",
|
|
38
|
+
skipDangerousModePermissionPrompt: !0,
|
|
39
|
+
theme: "dark-daltonized"
|
|
40
|
+
};
|
|
41
|
+
export { e as default };
|
package/dist/index.js
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { Command as e, Help as t, program as n } from "commander";
|
|
2
|
+
import r from "string-width";
|
|
3
|
+
import i from "chalk";
|
|
4
|
+
import { copyFileSync as a, cpSync as o, existsSync as s, mkdirSync as c, readFileSync as l, readdirSync as u, renameSync as d, rmSync as f, statSync as p, unlinkSync as m, writeFileSync as h } from "fs";
|
|
5
|
+
import { basename as g, dirname as ee, extname as _, join as v, relative as te, resolve as y } from "path";
|
|
6
|
+
import b from "log-symbols";
|
|
7
|
+
import x from "ora";
|
|
8
|
+
import { execSync as S } from "child_process";
|
|
9
|
+
import * as C from "js-yaml";
|
|
10
|
+
import w from "strip-json-comments";
|
|
11
|
+
import T from "pacote";
|
|
12
|
+
import { parseRange as E } from "semver-utils";
|
|
13
|
+
import D from "download-git-repo";
|
|
14
|
+
import O from "inquirer";
|
|
15
|
+
import ne from "os";
|
|
16
|
+
import { openBinary as re } from "@avmc/bun-extractor";
|
|
17
|
+
import ie from "sharp";
|
|
18
|
+
import ae from "update-notifier";
|
|
19
|
+
// package.json
|
|
20
|
+
var oe = "mine-auto-cli", se = "2.9.1", k = {
|
|
21
|
+
name: oe,
|
|
20
22
|
private: !1,
|
|
21
|
-
version:
|
|
23
|
+
version: se,
|
|
22
24
|
exports: "./dist/index.js",
|
|
23
25
|
main: "./dist/index.js",
|
|
24
26
|
type: "module",
|
|
@@ -61,171 +63,167 @@ var re = "mine-auto-cli", ie = "2.8.2", b = {
|
|
|
61
63
|
}],
|
|
62
64
|
dependencies: {
|
|
63
65
|
"@avmc/bun-extractor": "^0.5.1",
|
|
64
|
-
chalk: "^
|
|
66
|
+
chalk: "^6.0.1",
|
|
65
67
|
commander: "^15.0.0",
|
|
66
68
|
"download-git-repo": "^3.0.2",
|
|
67
|
-
inquirer: "^14.
|
|
68
|
-
"js-yaml": "^5.
|
|
69
|
+
inquirer: "^14.2.5",
|
|
70
|
+
"js-yaml": "^5.5.0",
|
|
69
71
|
"log-symbols": "^7.0.1",
|
|
70
72
|
ora: "^9.4.1",
|
|
71
|
-
pacote: "^22.0.
|
|
73
|
+
pacote: "^22.0.1",
|
|
72
74
|
"semver-utils": "^1.1.4",
|
|
75
|
+
sharp: "^0.35.5",
|
|
76
|
+
"string-width": "^8.3.0",
|
|
73
77
|
"strip-json-comments": "^5.0.3",
|
|
74
78
|
"update-notifier": "^7.3.1"
|
|
75
79
|
},
|
|
76
80
|
devDependencies: {
|
|
77
81
|
"@types/js-yaml": "^4.0.9",
|
|
78
|
-
"@types/node": "^26.
|
|
82
|
+
"@types/node": "^26.6.6",
|
|
79
83
|
"@types/pacote": "^11.1.8",
|
|
80
84
|
"@types/semver-utils": "^1.1.3",
|
|
81
85
|
"@types/update-notifier": "^6.0.8",
|
|
82
|
-
prettier: "^3.
|
|
83
|
-
typescript: "^
|
|
84
|
-
vite: "^8.
|
|
86
|
+
prettier: "^3.9.10",
|
|
87
|
+
typescript: "^7.0.2",
|
|
88
|
+
vite: "^8.3.5"
|
|
85
89
|
}
|
|
86
|
-
},
|
|
87
|
-
console.log(`${
|
|
88
|
-
},
|
|
89
|
-
console.log(`${
|
|
90
|
-
},
|
|
90
|
+
}, A = (e) => {
|
|
91
|
+
console.log(`${b.success} ${i.green("SUCCESS")} ${e}`);
|
|
92
|
+
}, j = (e) => {
|
|
93
|
+
console.log(`${oe} ${b.error} ${i.red("ERROR")} ${e}`);
|
|
94
|
+
}, M = (e) => {
|
|
91
95
|
console.log(e ?? "");
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
let
|
|
96
|
+
}, ce = (e) => {
|
|
97
|
+
M(`开始执行 ${i.cyanBright(e)} 命令`);
|
|
98
|
+
let t = x({
|
|
95
99
|
text: "正在执行命令中...",
|
|
96
100
|
color: "yellow"
|
|
97
101
|
});
|
|
98
|
-
|
|
99
|
-
},
|
|
102
|
+
t.start(), M(S(e, { cwd: process.cwd() }).toString()), t.succeed(`${i.green(e)} 命令执行成功`), M();
|
|
103
|
+
}, le = (e) => [
|
|
100
104
|
"git add -A",
|
|
101
105
|
`git commit -m ${e}`,
|
|
102
106
|
"git push"
|
|
103
|
-
],
|
|
107
|
+
], ue = (e, t) => [
|
|
104
108
|
`npm run ${e}`,
|
|
105
109
|
"git add -A",
|
|
106
110
|
`git commit -m ${t}`,
|
|
107
111
|
"git push"
|
|
108
|
-
],
|
|
109
|
-
|
|
110
|
-
},
|
|
111
|
-
|
|
112
|
-
},
|
|
112
|
+
], de = async (e, t = "打包") => {
|
|
113
|
+
M(), M(`${i.yellow(">>")} 开始依次执行命令...`), M(), ue(e, t).map(ce), A("全部命令执行完成"), M();
|
|
114
|
+
}, N = (e) => {
|
|
115
|
+
M(), j(`\`${e}\` 命令错误,请检查你的命令`), M(), n.help();
|
|
116
|
+
}, fe = (e) => {
|
|
113
117
|
let [t, n] = ["package.json", "README.md"].map((e) => {
|
|
114
|
-
let t =
|
|
118
|
+
let t = v(process.cwd(), e);
|
|
115
119
|
return {
|
|
116
120
|
path: t,
|
|
117
|
-
content:
|
|
121
|
+
content: l(t).toString()
|
|
118
122
|
};
|
|
119
123
|
}), r = JSON.parse(t.content);
|
|
120
|
-
|
|
121
|
-
},
|
|
124
|
+
r.version = e || r.version.split(".").reduce((e, t, n, r) => e + (n === r.length - 1 ? +t + 1 : `${t}.`), ""), h(t.path, JSON.stringify(r, null, 2)), n.content = n.content.replace(/version\-v.+\-blue/, () => `version-v${r.version}-blue`), h(n.path, n.content);
|
|
125
|
+
}, pe = async (e) => {
|
|
122
126
|
let t = e.split("version")[1];
|
|
123
|
-
if (!t) return
|
|
124
|
-
let n = JSON.parse(
|
|
127
|
+
if (!t) return N(e);
|
|
128
|
+
let n = JSON.parse(l(v(process.cwd(), "package.json")).toString());
|
|
125
129
|
if (t === "++") {
|
|
126
|
-
|
|
130
|
+
fe(n.version.split(".").reduce((e, t, n, r) => e + (n === r.length - 1 ? +t + 1 : `${t}.`), "")), M(), A("命令执行完成");
|
|
127
131
|
return;
|
|
128
132
|
}
|
|
129
133
|
let r = t.split("@")[1];
|
|
130
|
-
r ? (
|
|
131
|
-
},
|
|
132
|
-
if (
|
|
133
|
-
if (
|
|
134
|
-
|
|
135
|
-
},
|
|
134
|
+
r ? (fe(r), M(), A("命令执行完成")) : N(e);
|
|
135
|
+
}, me = (e, t) => {
|
|
136
|
+
if (e.includes("build")) return de(e, t);
|
|
137
|
+
if (e.includes("version")) return pe(e);
|
|
138
|
+
j(i.hex("#f56c6c")(`\`auto ${e}${t ? ` ${t}` : ""}\` 命令不存在`)), n.help();
|
|
139
|
+
}, P = "https://gitee.com/biaovorg/project-template.git";
|
|
136
140
|
Object.keys({
|
|
137
|
-
vue:
|
|
138
|
-
react:
|
|
139
|
-
"uni-app":
|
|
140
|
-
electron:
|
|
141
|
-
node:
|
|
142
|
-
"node-simple":
|
|
141
|
+
vue: P,
|
|
142
|
+
react: P,
|
|
143
|
+
"uni-app": P,
|
|
144
|
+
electron: P,
|
|
145
|
+
node: P,
|
|
146
|
+
"node-simple": P
|
|
143
147
|
}).reduce((e, t, n) => e + (n ? ", " : "") + t, "");
|
|
144
|
-
var
|
|
145
|
-
|
|
146
|
-
var
|
|
147
|
-
if (!
|
|
148
|
-
let n =
|
|
149
|
-
return t ? JSON.parse(
|
|
150
|
-
},
|
|
151
|
-
if (!
|
|
152
|
-
let t =
|
|
148
|
+
var F = (e = "jsonc") => `auto-cli.${e}`;
|
|
149
|
+
y(import.meta.dirname, "./presetData.json");
|
|
150
|
+
var I = (e, t = !1) => {
|
|
151
|
+
if (!s(e)) return t ? {} : "";
|
|
152
|
+
let n = l(e).toString();
|
|
153
|
+
return t ? JSON.parse(w(n)) : n;
|
|
154
|
+
}, he = (e) => {
|
|
155
|
+
if (!s(e)) return {};
|
|
156
|
+
let t = l(e).toString();
|
|
153
157
|
try {
|
|
154
|
-
return
|
|
158
|
+
return C.load(t);
|
|
155
159
|
} catch {
|
|
156
160
|
return {};
|
|
157
161
|
}
|
|
158
|
-
},
|
|
159
|
-
let [e, t] = [
|
|
162
|
+
}, ge = (e = !1) => I(y(import.meta.dirname, F()), e), _e = () => {
|
|
163
|
+
let [e, t] = [F(), F("yml")].map((e) => y(process.cwd(), e)), n = ge(!0);
|
|
160
164
|
try {
|
|
161
|
-
Object.assign(n,
|
|
165
|
+
Object.assign(n, he(t), I(e, !0));
|
|
162
166
|
} catch {}
|
|
163
167
|
return n;
|
|
164
|
-
},
|
|
165
|
-
let n =
|
|
168
|
+
}, ve = (e, t = !1) => {
|
|
169
|
+
let n = ge(t);
|
|
166
170
|
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;
|
|
167
|
-
},
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
let
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
s(o, pe(a, n)), x(`${a} 文件创建成功`), C(), C(t.green(`文件目录 ${o}`));
|
|
176
|
-
}), e.command("git [描述]").description("简化 Git 提交命令").action(async (e = "更新代码") => {
|
|
177
|
-
C(), C(`${t.yellow(">>")} 开始依次执行命令...`), C(), ae(e).forEach(w), x("全部命令执行完成"), C();
|
|
171
|
+
}, ye = (e, t, n = " ") => Array.from({ length: t - e }, () => n).join(""), be = () => `${+/* @__PURE__ */ new Date()}${Math.random().toString(36).substring(2, 6)}`;
|
|
172
|
+
n.command("init").option("-f, --force", `强制替换 ${F()} 文件内容`, !1).option("--unc, --uncomment", `取消生成 ${F()} 带注释`, !1).option("-y, --yml", `生成 ${F("yml")} 文件`, !1).description("初始化配置文件").action(({ yml: e, uncomment: t, force: n }) => {
|
|
173
|
+
M();
|
|
174
|
+
let r = F(e ? "yml" : "jsonc"), a = y(process.cwd(), r);
|
|
175
|
+
s(a) && !n ? (M(i.yellow(`${r} 文件已存在`)), M(), M(i.yellow(`文件目录 ${a}`))) : (h(a, ve(r, t)), A(`${r} 文件创建成功`), M(), M(i.green(`文件目录 ${a}`)));
|
|
176
|
+
}), n.command("git [描述]").description("简化 Git 提交命令").action(async (e = "更新代码") => {
|
|
177
|
+
M(), M(`${i.yellow(">>")} 开始依次执行命令...`), M(), le(e).forEach(ce), A("全部命令执行完成"), M();
|
|
178
178
|
});
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
var j = [
|
|
179
|
+
// src/commander/commands/mkdir.ts
|
|
180
|
+
var xe = [
|
|
182
181
|
"dist",
|
|
183
182
|
"node_modules",
|
|
184
183
|
".git",
|
|
185
184
|
"miniprogram_npm"
|
|
186
|
-
],
|
|
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:
|
|
188
|
-
return !
|
|
189
|
-
},
|
|
185
|
+
], L = 0, Se = !1, R = !1, Ce = 20, z = ({ prev: e, i: t, index: n, arr: r, curText: i }) => {
|
|
186
|
+
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: Ce + L - s }).reduce((e) => `${e}-`, " ");
|
|
187
|
+
return !Se && (L = Math.max(L, s)), `${o}${i}${R ? c : ""}\n`;
|
|
188
|
+
}, B = (e, t = 0) => e.reduce((e, n, r, i) => {
|
|
190
189
|
let a;
|
|
191
|
-
return n.children ? (a = `├── ${n.name}`,
|
|
190
|
+
return n.children ? (a = `├── ${n.name}`, z({
|
|
192
191
|
prev: e,
|
|
193
192
|
i: t,
|
|
194
193
|
index: r,
|
|
195
194
|
arr: i,
|
|
196
195
|
curText: a
|
|
197
|
-
}) +
|
|
196
|
+
}) + B(n.children, t + 1)) : (a = `${r === i.length - 1 ? "└── " : "├── "}${n.name}`, z({
|
|
198
197
|
prev: e,
|
|
199
198
|
i: t,
|
|
200
199
|
index: r,
|
|
201
200
|
arr: i,
|
|
202
201
|
curText: a
|
|
203
202
|
}));
|
|
204
|
-
}, ""),
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
let n = process.cwd(),
|
|
208
|
-
if (r
|
|
209
|
-
let e =
|
|
210
|
-
|
|
203
|
+
}, ""), we = (e) => u(e, { withFileTypes: !0 }).sort((e, t) => +t.isDirectory() - e.isDirectory());
|
|
204
|
+
n.command("mkdir").option("-l, --line [数量]", "数量", !1).option("-n, --name [文件名称]", "文件名称", !1).option("-d, --depth [深度值]", "深度值", "3").description("生成目录结构文件").action(({ line: e, name: t }) => {
|
|
205
|
+
R = !!e, typeof e == "string" && (Ce = +e);
|
|
206
|
+
let n = process.cwd(), r = v(n, ".gitignore");
|
|
207
|
+
if (s(r)) {
|
|
208
|
+
let e = l(r).toString().split("\r\n");
|
|
209
|
+
xe.push(...e);
|
|
211
210
|
}
|
|
212
|
-
let
|
|
211
|
+
let i = [{
|
|
213
212
|
name: n.split("\\").at(-1),
|
|
214
|
-
children:
|
|
213
|
+
children: we(n).map((e) => {
|
|
215
214
|
let { name: t } = e, n = { name: t };
|
|
216
|
-
return !
|
|
215
|
+
return !xe.includes(t) && e.isDirectory() && (n.children = we(v(e.path, t)).map(({ name: e }) => ({ name: e }))), n;
|
|
217
216
|
})
|
|
218
217
|
}];
|
|
219
|
-
|
|
218
|
+
R && (B(i), Se = !0), h(v(n, `${typeof t == "string" && t || "directory"}.md`), B(i));
|
|
220
219
|
});
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}, ge = (e, t, n) => {
|
|
220
|
+
// src/commander/commands/check.ts
|
|
221
|
+
var V = _e(), [H] = ["package.json"].map((e) => y(process.cwd(), e)), Te = (e, t) => {
|
|
222
|
+
let n = `\r查找进度:[${Array.from({ length: t }, (t, n) => n < e ? "=" : " ").join("")}] ${e}/${t} ${~~(e / t * 100)}%\r`, r = e === t ? i.green(n) : i.yellow(n);
|
|
223
|
+
process.stdout.write(r);
|
|
224
|
+
}, Ee = (e, t, n) => {
|
|
227
225
|
let r = "latest";
|
|
228
|
-
return
|
|
226
|
+
return V.resolve.some((t) => {
|
|
229
227
|
let n = t.lastIndexOf("@");
|
|
230
228
|
if (n <= 0) return !0;
|
|
231
229
|
let i = t.slice(0, n), a = t.slice(n + 1);
|
|
@@ -233,25 +231,25 @@ var z = k(), [B] = ["package.json"].map((e) => u(process.cwd(), e)), he = (e, n)
|
|
|
233
231
|
}), {
|
|
234
232
|
name: e,
|
|
235
233
|
value: t,
|
|
236
|
-
newVersion:
|
|
234
|
+
newVersion: V.prefix + n[r],
|
|
237
235
|
tag: r
|
|
238
236
|
};
|
|
239
|
-
},
|
|
240
|
-
let [{ major: t = 0, minor: n = 0, patch: r = 0, release: i = "" }] =
|
|
237
|
+
}, De = (e, t) => (+!t + 1) * e.length, Oe = (e) => {
|
|
238
|
+
let [{ major: t = 0, minor: n = 0, patch: r = 0, release: i = "" }] = E(e);
|
|
241
239
|
return [
|
|
242
240
|
+t,
|
|
243
241
|
+n,
|
|
244
242
|
+r,
|
|
245
243
|
i
|
|
246
244
|
];
|
|
247
|
-
},
|
|
248
|
-
let [
|
|
249
|
-
return s >
|
|
250
|
-
},
|
|
251
|
-
let
|
|
245
|
+
}, U = (e, t) => e ? "-" + i[t](e) : "", ke = (e, t) => {
|
|
246
|
+
let [n, r, a, o] = Oe(e), [s, c, l, u] = Oe(t);
|
|
247
|
+
return s > n ? i.red(t) : s < n ? !1 : c > r ? `${s}.${i.yellow(c)}.${i.yellow(l)}${U(u, "yellow")}` : c < r ? !1 : l > a ? `${s}.${c}.${i.green(l)}${U(u, "green")}` : l === a && u && u !== o ? `${s}.${c}.${l}${U(u, "green")}` : !1;
|
|
248
|
+
}, Ae = (e) => {
|
|
249
|
+
let t = {};
|
|
252
250
|
e.forEach((e) => {
|
|
253
|
-
Object.entries(e).forEach(([e,
|
|
254
|
-
|
|
251
|
+
Object.entries(e).forEach(([e, n]) => {
|
|
252
|
+
t[e] = Math.max(n.length, t[e] ?? 0);
|
|
255
253
|
});
|
|
256
254
|
}), e.unshift({
|
|
257
255
|
name: "包名",
|
|
@@ -259,98 +257,95 @@ var z = k(), [B] = ["package.json"].map((e) => u(process.cwd(), e)), he = (e, n)
|
|
|
259
257
|
newVersion: "新版本",
|
|
260
258
|
tag: "标签"
|
|
261
259
|
});
|
|
262
|
-
let
|
|
263
|
-
e.forEach(({ name: e, value:
|
|
260
|
+
let n = [];
|
|
261
|
+
e.forEach(({ name: e, value: r, newVersion: a, tag: o }, s) => {
|
|
264
262
|
let [c, l, u, d] = Object.entries({
|
|
265
263
|
name: e,
|
|
266
|
-
value:
|
|
264
|
+
value: r,
|
|
267
265
|
newVersion: a,
|
|
268
266
|
tag: o
|
|
269
|
-
}).map(([e,
|
|
267
|
+
}).map(([e, n]) => ye(De(n, s), t[e])), f = i.yellow("→"), p = !0;
|
|
270
268
|
if (s) {
|
|
271
|
-
let e =
|
|
269
|
+
let e = ke(r, a);
|
|
272
270
|
e ? a = e : p = !1;
|
|
273
|
-
} else e =
|
|
274
|
-
let m = `${e + c} ${l +
|
|
275
|
-
p &&
|
|
276
|
-
}),
|
|
277
|
-
},
|
|
278
|
-
|
|
271
|
+
} else e = i.green(e), r = i.green(r), a = i.green(a), o = i.green(o), f = " ";
|
|
272
|
+
let m = `${e + c} ${l + r} ${f} ${u + a} ${d + o}`;
|
|
273
|
+
p && n.push(m);
|
|
274
|
+
}), n.length > 1 ? n.forEach(M) : A("所有版本已是最新");
|
|
275
|
+
}, je = async (e, t, n) => {
|
|
276
|
+
M();
|
|
279
277
|
let r = 0, i = [], a = Object.entries(e), o = a.map(async ([e, o]) => {
|
|
280
|
-
let s =
|
|
278
|
+
let s = Ee(e, o, (await T.packument(e, { registry: V.registry }))["dist-tags"]);
|
|
281
279
|
i.push(s), t.forEach((t) => {
|
|
282
280
|
let r = n[t];
|
|
283
281
|
r && r[e] && (r[e] = s.newVersion);
|
|
284
|
-
}), r++, await
|
|
282
|
+
}), r++, await Te(r, a.length);
|
|
285
283
|
});
|
|
286
|
-
return await Promise.all(o),
|
|
284
|
+
return await Promise.all(o), M(), M(), i;
|
|
287
285
|
};
|
|
288
|
-
|
|
289
|
-
if (!
|
|
290
|
-
let t = e ||
|
|
286
|
+
n.command("check").option("-u, --update", "更新 package.json 依赖内容", !1).description("升级 package.json 依赖版本").action(async ({ update: e }) => {
|
|
287
|
+
if (!s(H)) return j("package.json 文件不存在");
|
|
288
|
+
let t = e || V.check, n = l(H).toString(), r = JSON.parse(n), i = [
|
|
291
289
|
"dependencies",
|
|
292
290
|
"devDependencies",
|
|
293
291
|
"optionalDependencies"
|
|
294
|
-
],
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
!
|
|
292
|
+
], a = {}, o = JSON.parse(n);
|
|
293
|
+
i.forEach((e) => {
|
|
294
|
+
r[e] && Object.entries(r[e]).forEach(([e, t]) => {
|
|
295
|
+
!V.reject.includes(e) && (a[e] = t);
|
|
298
296
|
});
|
|
299
297
|
});
|
|
300
|
-
let
|
|
301
|
-
t ? (
|
|
298
|
+
let c = await je(a, i, o);
|
|
299
|
+
t ? (h(H, JSON.stringify(o, null, 2)), A("文件 package.json 已更新"), M()) : Ae(c);
|
|
302
300
|
});
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
let e = i(W).toString(), n = JSON.parse(e), a = [
|
|
301
|
+
// src/commander/commands/comment.ts
|
|
302
|
+
var Me = _e(), Ne = "comment.md", [W, Pe] = ["package.json", Ne].map((e) => y(process.cwd(), e));
|
|
303
|
+
n.command("comment").description("生成依赖注释文件").action(() => {
|
|
304
|
+
if (!s(W)) return j("package.json 文件不存在");
|
|
305
|
+
let e = l(W).toString(), t = JSON.parse(e), n = [
|
|
309
306
|
"dependencies",
|
|
310
307
|
"devDependencies",
|
|
311
308
|
"optionalDependencies"
|
|
312
|
-
],
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}),
|
|
317
|
-
}),
|
|
309
|
+
], r = "### 依赖解析\n\n";
|
|
310
|
+
n.forEach((e) => {
|
|
311
|
+
t[e] && (r += `#### ${e}\n\n`, Object.keys(t[e]).forEach((e) => {
|
|
312
|
+
r += `- \`${e}\`: ${Me.comment[e] || ""}\n`;
|
|
313
|
+
}), r += "\n");
|
|
314
|
+
}), r = r.slice(0, -1), h(Pe, r), M(), A(`${Ne} 文件创建成功`), M(), M(i.green(`文件目录 ${Pe}`));
|
|
318
315
|
});
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
var Se = {
|
|
316
|
+
// src/commander/commands/vscode.ts
|
|
317
|
+
var Fe = {
|
|
322
318
|
recursive: !0,
|
|
323
319
|
force: !0
|
|
324
320
|
};
|
|
325
|
-
|
|
326
|
-
let e = `${+/* @__PURE__ */ new Date()}`, t =
|
|
327
|
-
|
|
328
|
-
!e &&
|
|
321
|
+
n.command("vscode-config").description("更新 .vscode 配置文件").action(() => {
|
|
322
|
+
let e = `${+/* @__PURE__ */ new Date()}`, t = v(process.cwd()), n = v(t, e);
|
|
323
|
+
D("direct:https://gitee.com/biaovorg/vscode-config.git#master", n, { clone: !0 }, async (e) => {
|
|
324
|
+
!e && o(v(n, ".vscode"), v(t, ".vscode"), Fe), f(n, Fe);
|
|
329
325
|
});
|
|
330
326
|
});
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
var Ce = (e, t, n) => {
|
|
327
|
+
// src/commander/commands/node.ts
|
|
328
|
+
var Ie = (e, t, n) => {
|
|
334
329
|
let r = Object.entries(t), i = r.findIndex(([t]) => e === t), [a, o] = r[i];
|
|
335
330
|
if (o) {
|
|
336
|
-
if (n[a] === o) return i === r.length - 1
|
|
331
|
+
if (n[a] === o) return i === r.length - 1 || Ie(r[i + 1][0], t, n);
|
|
337
332
|
} else return !0;
|
|
338
|
-
},
|
|
339
|
-
e && (
|
|
340
|
-
},
|
|
341
|
-
e &&
|
|
333
|
+
}, Le = (e) => {
|
|
334
|
+
e && (S(`nvm use ${e}`), M(), A(`切换成功 当前版本:${e}`), M());
|
|
335
|
+
}, G = (e) => {
|
|
336
|
+
e && S(`nvm install ${e}`);
|
|
342
337
|
};
|
|
343
|
-
|
|
344
|
-
let
|
|
345
|
-
if (e.major ===
|
|
346
|
-
minor:
|
|
347
|
-
patch:
|
|
338
|
+
n.command("node [版本号]").option("-i, --install", "是否安装此版本", !1).description("切换 node 版本,默认选择第一个版本").action((e, t) => {
|
|
339
|
+
let n = S("nvm ls").toString(), r = E(n), [{ major: a, minor: o, patch: s }] = E(e), c = [], l = r.find((e) => {
|
|
340
|
+
if (e.major === a) return c.push(e), Ie("minor", {
|
|
341
|
+
minor: o,
|
|
342
|
+
patch: s
|
|
348
343
|
}, e);
|
|
349
344
|
});
|
|
350
|
-
if (
|
|
351
|
-
else if (
|
|
352
|
-
let t =
|
|
353
|
-
|
|
345
|
+
if (l) Le(l.semver);
|
|
346
|
+
else if (M(), M(i.red(`输入的版本 ${e} 不存在`)), M(), c.length) {
|
|
347
|
+
let t = c.map((e) => e.semver);
|
|
348
|
+
O.prompt({
|
|
354
349
|
type: "list",
|
|
355
350
|
name: "preset",
|
|
356
351
|
message: "请选择相似版本或输入版本进行安装:",
|
|
@@ -360,157 +355,317 @@ e.command("node [版本号]").option("-i, --install", "是否安装此版本", !
|
|
|
360
355
|
"取消"
|
|
361
356
|
]
|
|
362
357
|
}).then(({ preset: t }) => {
|
|
363
|
-
if (t !== "取消")
|
|
364
|
-
if (
|
|
365
|
-
|
|
366
|
-
|
|
358
|
+
if (t !== "取消") {
|
|
359
|
+
if (t === e) {
|
|
360
|
+
if (!s) return;
|
|
361
|
+
G(t);
|
|
362
|
+
} else Le(t);
|
|
363
|
+
}
|
|
367
364
|
});
|
|
368
365
|
} else {
|
|
369
|
-
if (!
|
|
370
|
-
if (
|
|
371
|
-
|
|
366
|
+
if (!s) return;
|
|
367
|
+
if (t.install) {
|
|
368
|
+
G(e);
|
|
372
369
|
return;
|
|
373
370
|
}
|
|
374
|
-
|
|
371
|
+
O.prompt({
|
|
375
372
|
type: "confirm",
|
|
376
373
|
name: "isInstall",
|
|
377
374
|
message: `是否安装 ${e}?`
|
|
378
375
|
}).then(({ isInstall: t }) => {
|
|
379
|
-
t &&
|
|
376
|
+
t && G(e);
|
|
380
377
|
});
|
|
381
378
|
}
|
|
382
379
|
});
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
var q = [
|
|
380
|
+
// src/commander/commands/ai.ts
|
|
381
|
+
var K = [
|
|
386
382
|
"ANTHROPIC_AUTH_TOKEN",
|
|
387
383
|
"ANTHROPIC_BASE_URL",
|
|
388
384
|
"ANTHROPIC_MODEL",
|
|
389
385
|
"ANTHROPIC_SMALL_FAST_MODEL"
|
|
390
|
-
],
|
|
391
|
-
|
|
392
|
-
let e = JSON.parse(
|
|
386
|
+
], Re = I(y(import.meta.dirname, "ai.jsonc"), !0), ze = Object.entries(Re)[0], q = y(ne.homedir(), ".claude/settings.json"), J = y(ne.homedir(), ".ai-model.json"), Y = () => {
|
|
387
|
+
s(q) || (j(`${q} 文件不存在,请先检查或者去安装 Claude Code`), process.exit(1));
|
|
388
|
+
let e = JSON.parse(l(q).toString());
|
|
393
389
|
return !e.env && (e.env = {}), e;
|
|
394
|
-
},
|
|
395
|
-
|
|
396
|
-
let e = JSON.parse(
|
|
397
|
-
if (e ===
|
|
398
|
-
let n = t.env, r =
|
|
399
|
-
return !(!n ||
|
|
390
|
+
}, Be = () => {
|
|
391
|
+
M(), s(J) || (j("配置不存在,请先使用 `ai init` 初始化 AI 模型配置"), process.exit(1));
|
|
392
|
+
let e = JSON.parse(l(J).toString()), t = Object.entries(e).filter(([e, t]) => {
|
|
393
|
+
if (e === ze[0]) return !1;
|
|
394
|
+
let n = t.env, r = ze[1].env;
|
|
395
|
+
return !(!n || K.some((e) => !n[e] || n[e] === r[e]));
|
|
400
396
|
});
|
|
401
|
-
return
|
|
402
|
-
},
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
},
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
n = Math.max(n, Ae(e)), r < 0 && !q.some((e) => i.env[e] !== t.env[e]) && (r = a);
|
|
412
|
-
}), e.forEach(([e, i], a) => {
|
|
413
|
-
let { ANTHROPIC_BASE_URL: o } = i.env;
|
|
414
|
-
C(`${a === r ? t.green("*") : " "} ${e} ${A(Ae(e), n + 4, "-")} ${o}`);
|
|
397
|
+
return t.length || (M(`暂无已配置的 AI 模型,请先配置,路径 ${i.green(J)}`), process.exit(1)), [t, e];
|
|
398
|
+
}, Ve = () => {
|
|
399
|
+
M(), s(J) ? M(`配置已存在,路径 ${i.green(J)}`) : (h(J, JSON.stringify(Re, null, 2)), A(`配置已初始化,路径 ${i.green(J)}`));
|
|
400
|
+
}, He = (e) => e.replace(/[\u4e00-\u9fa5]/g, "aa").length, Ue = () => {
|
|
401
|
+
let [e] = Be(), t = 0, n = -1, r = Y();
|
|
402
|
+
e.forEach(([e, i], a) => {
|
|
403
|
+
t = Math.max(t, He(e)), n < 0 && !K.some((e) => r.env[e] !== i.env[e]) && (n = a);
|
|
404
|
+
}), e.forEach(([e, r], a) => {
|
|
405
|
+
let { ANTHROPIC_BASE_URL: o } = r.env;
|
|
406
|
+
M(`${a === n ? i.green("*") : " "} ${e} ${ye(He(e), t + 4, "-")} ${o}`);
|
|
415
407
|
});
|
|
416
|
-
},
|
|
417
|
-
let
|
|
418
|
-
|
|
419
|
-
},
|
|
408
|
+
}, We = async (e) => {
|
|
409
|
+
let t = Y(), [n, r] = Be();
|
|
410
|
+
n.some(([t]) => t === e) || (M(`模型 ${i.red(e)} 不存在`), process.exit(1)), K.some((n) => t.env[n] !== r[e].env[n]) ? (t.env = r[e].env, h(q, JSON.stringify(t, null, 2)), A(`模型 ${i.green(e)} 已切换`)) : M(`当前正处于 ${i.green(e)} 模型,无需切换`);
|
|
411
|
+
}, Ge = () => {
|
|
420
412
|
let e = "@anthropic-ai/claude-code";
|
|
421
413
|
try {
|
|
422
|
-
|
|
423
|
-
let
|
|
424
|
-
return
|
|
425
|
-
cliPath:
|
|
426
|
-
cliPathBak:
|
|
427
|
-
exePath:
|
|
414
|
+
S(`npm list -g ${e} --depth=0`).toString().trim().includes(e) || (j(i.red(`请使用 nodejs 安装 ${e}`)), process.exit(1));
|
|
415
|
+
let t = S("npm root -g").toString().trim(), n = y(t, e, "cli.js"), r = y(t, e, "cli.bak.js"), a = y(t, e, "bin/claude.exe"), c = y(t, e, "bin/claude.zh.exe"), l = y(t, e, "bin/claude.bak.exe"), u = !1;
|
|
416
|
+
return s(a) ? (!s(l) && o(a, l), u = !0) : !s(r) && o(n, r), {
|
|
417
|
+
cliPath: n,
|
|
418
|
+
cliPathBak: r,
|
|
419
|
+
exePath: a,
|
|
428
420
|
exeZhPath: c,
|
|
429
421
|
exePathBak: l,
|
|
430
|
-
isExistExe:
|
|
422
|
+
isExistExe: u
|
|
431
423
|
};
|
|
432
424
|
} catch {
|
|
433
|
-
|
|
425
|
+
j(i.red(`请使用 nodejs 安装 ${e}`)), process.exit(1);
|
|
434
426
|
}
|
|
435
|
-
},
|
|
436
|
-
|
|
437
|
-
let e =
|
|
438
|
-
if (
|
|
439
|
-
if (r
|
|
440
|
-
|
|
427
|
+
}, Ke = async () => {
|
|
428
|
+
M(), M("开始汉化 Claude Code");
|
|
429
|
+
let e = Ge(), { cliPath: t, exePath: n, exeZhPath: r, isExistExe: i } = e;
|
|
430
|
+
if (i) {
|
|
431
|
+
if (s(r)) {
|
|
432
|
+
o(r, n);
|
|
441
433
|
return;
|
|
442
434
|
}
|
|
443
|
-
await
|
|
435
|
+
await Xe(e), o(r, n);
|
|
444
436
|
} else {
|
|
445
|
-
let e =
|
|
446
|
-
s(t, Object.entries(n).reduce((e, [t, n]) => {
|
|
437
|
+
let e = l(t).toString(), n = (await import("./keyword-CgLMNoOo.js")).default, r = Object.entries(n).reduce((e, [t, n]) => {
|
|
447
438
|
let r = t.replace(/\n/g, "\\\\n").replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), i = n.replace(/\n/g, "\\n");
|
|
448
439
|
return ["`", "\\"].includes(r[0]) ? e.replace(new RegExp(r, "g"), n) : e.replace(RegExp(`\"${r}\"`, "g"), `\"${i}\"`).replace(RegExp(`(\'${r}\')`, "g"), `\'${i}\'`);
|
|
449
|
-
}, e)
|
|
450
|
-
|
|
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();
|
|
463
|
-
return;
|
|
440
|
+
}, e);
|
|
441
|
+
h(t, r);
|
|
464
442
|
}
|
|
465
|
-
|
|
443
|
+
A("Claude Code 已汉化");
|
|
444
|
+
}, qe = () => {
|
|
445
|
+
M(), M("开始恢复 Claude Code");
|
|
446
|
+
let { cliPath: e, cliPathBak: t, exePath: n, exePathBak: r, isExistExe: i } = Ge();
|
|
447
|
+
i ? o(r, n) : o(t, e), A("Claude Code 已恢复成英文");
|
|
448
|
+
}, Je = async () => {
|
|
449
|
+
M();
|
|
450
|
+
let e = (await import("./claude.settings-D209xJfD.js")).default, t = Y();
|
|
451
|
+
e.env && Object.assign(e.env, t.env), Object.assign(t, e), h(q, JSON.stringify(t, null, 2)), A(`Claude Code 配置成功,请前往查看:${i.yellow(q)}`);
|
|
452
|
+
}, Ye = async () => {
|
|
453
|
+
M(), M("开始配置 Claude Code 默认权限"), M(), s(q) ? O.prompt({
|
|
466
454
|
type: "confirm",
|
|
467
455
|
name: "isOk",
|
|
468
456
|
message: "存在本地配置文件,继续配置会直接覆盖本地配置文件里的属性内容,是否继续 ?"
|
|
469
457
|
}).then(({ isOk: e }) => {
|
|
470
|
-
e &&
|
|
471
|
-
});
|
|
472
|
-
},
|
|
473
|
-
let
|
|
474
|
-
|
|
475
|
-
let
|
|
458
|
+
e && Je();
|
|
459
|
+
}) : Je();
|
|
460
|
+
}, Xe = async ({ cliPath: e, exePath: t, exeZhPath: n, exePathBak: r, isExistExe: i }) => {
|
|
461
|
+
let a = ee(t), o = t, s = y(a, be());
|
|
462
|
+
S(`npx bun-extractor "${o}" -o "${s}"`, { stdio: "ignore" });
|
|
463
|
+
let c = re(l(o)), u = y(s, c.entryPoint.path), d = l(u).toString(), f = (await import("./keyword-CgLMNoOo.js")).default, p = Object.entries(f).reduce((e, [t, n]) => {
|
|
476
464
|
let r = t.replace(/\n/g, "\\\\n").replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), i = n.replace(/\n/g, "\\n");
|
|
477
465
|
return ["`", "\\"].includes(r[0]) ? e.replace(new RegExp(r, "g"), n) : e.replace(RegExp(`\"${r}\"`, "g"), `\"${i}\"`).replace(RegExp(`(\'${r}\')`, "g"), `\'${i}\'`);
|
|
478
|
-
},
|
|
466
|
+
}, d), m = Array.from(p).map((e) => {
|
|
479
467
|
let t = e.charCodeAt(0);
|
|
480
468
|
return t >= 19968 && t <= 40959 ? `\\u${t.toString(16).padStart(4, "0")}` : e;
|
|
481
|
-
}).join(""),
|
|
482
|
-
|
|
483
|
-
let
|
|
484
|
-
await import(resolve(dirname(process.execPath), "${
|
|
485
|
-
|
|
486
|
-
},
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
469
|
+
}).join(""), g = u.slice(0, -3) + ".zh.js";
|
|
470
|
+
h(g, m);
|
|
471
|
+
let _ = `import { dirname, resolve } from 'node:path'
|
|
472
|
+
await import(resolve(dirname(process.execPath), "${g.replace(/\\/g, "/")}"))`, v = y(s, "entry.js");
|
|
473
|
+
h(v, _), S(`bun build ${v} --compile --icon=claude-code.ico --outfile ${o.slice(0, -4) + ".zh.exe"}`, { stdio: "ignore" });
|
|
474
|
+
}, Ze = async () => {
|
|
475
|
+
M(), M("查看 Claude Code 默认配置"), M(), s(q) ? M(JSON.parse(l(q).toString())) : j("Claude Code 未配置,默认配置文件不存在");
|
|
476
|
+
}, X = n.command("ai").description("AI 命令,详细操作请查看 ai -h").helpCommand(!1);
|
|
477
|
+
X.command("init").description("初始化 AI 模型配置").action(Ve), X.command("ls").description("查看当前已配置的 AI 模型").action(Ue), X.command("use <模型>").description("切换 AI 模型").action(We), X.command("zh").description("汉化 Claude Code").action(Ke), X.command("zh-restore").description("恢复汉化 Claude Code").action(qe), X.command("config").description("配置 Claude Code 默认权限").action(Ye), X.command("config-ls").description("查看 Claude Code 默认配置").action(Ze);
|
|
478
|
+
// src/commander/commands/mini.ts
|
|
479
|
+
var Qe = [
|
|
480
|
+
"jpg",
|
|
481
|
+
"jpeg",
|
|
482
|
+
"png",
|
|
483
|
+
"webp",
|
|
484
|
+
"avif",
|
|
485
|
+
"tiff",
|
|
486
|
+
"tif"
|
|
487
|
+
], $e = [
|
|
488
|
+
"jpg",
|
|
489
|
+
"jpeg",
|
|
490
|
+
"png",
|
|
491
|
+
"webp",
|
|
492
|
+
"avif",
|
|
493
|
+
"tiff",
|
|
494
|
+
"tif"
|
|
495
|
+
], Z = (e) => p(e).size, Q = (e) => {
|
|
496
|
+
let t = [
|
|
497
|
+
"B",
|
|
498
|
+
"KB",
|
|
499
|
+
"MB",
|
|
500
|
+
"GB"
|
|
501
|
+
], n = 0, r = e;
|
|
502
|
+
for (; r >= 1024 && n < t.length - 1;) r /= 1024, n++;
|
|
503
|
+
return `${r.toFixed(n === 0 ? 0 : 2)} ${t[n]}`;
|
|
504
|
+
}, et = (e, t) => u(e, { withFileTypes: !0 }).reduce((n, r) => {
|
|
505
|
+
let i = v(e, r.name);
|
|
506
|
+
return r.isDirectory() ? (t.includes(y(i)) || n.push(...et(i, t)), n) : (Qe.includes(_(r.name).slice(1).toLowerCase()) && n.push(i), n);
|
|
507
|
+
}, []), tt = async (e, t, n, r) => {
|
|
508
|
+
let i = ie(e);
|
|
509
|
+
if (((await i.metadata()).pages ?? 1) > 1) return !1;
|
|
510
|
+
let a = i.rotate();
|
|
511
|
+
switch (n) {
|
|
512
|
+
case "png":
|
|
513
|
+
await a.png(r ? {
|
|
514
|
+
compressionLevel: 9,
|
|
515
|
+
adaptiveFiltering: !0
|
|
516
|
+
} : {
|
|
517
|
+
palette: !0,
|
|
518
|
+
quality: 100,
|
|
519
|
+
effort: 10,
|
|
520
|
+
dither: 1,
|
|
521
|
+
compressionLevel: 9,
|
|
522
|
+
adaptiveFiltering: !0
|
|
523
|
+
}).toFile(t);
|
|
524
|
+
break;
|
|
525
|
+
case "webp":
|
|
526
|
+
await a.webp(r ? {
|
|
527
|
+
lossless: !0,
|
|
528
|
+
effort: 6
|
|
529
|
+
} : {
|
|
530
|
+
quality: 80,
|
|
531
|
+
effort: 6
|
|
532
|
+
}).toFile(t);
|
|
533
|
+
break;
|
|
534
|
+
case "avif":
|
|
535
|
+
await a.avif(r ? {
|
|
536
|
+
lossless: !0,
|
|
537
|
+
effort: 9
|
|
538
|
+
} : {
|
|
539
|
+
quality: 60,
|
|
540
|
+
effort: 9
|
|
541
|
+
}).toFile(t);
|
|
542
|
+
break;
|
|
543
|
+
case "tiff":
|
|
544
|
+
case "tif":
|
|
545
|
+
await a.tiff({ compression: "lzw" }).toFile(t);
|
|
546
|
+
break;
|
|
547
|
+
default: await a.jpeg(r ? {
|
|
548
|
+
quality: 100,
|
|
549
|
+
mozjpeg: !0,
|
|
550
|
+
chromaSubsampling: "4:4:4"
|
|
551
|
+
} : {
|
|
552
|
+
quality: 80,
|
|
553
|
+
mozjpeg: !0,
|
|
554
|
+
progressive: !0,
|
|
555
|
+
chromaSubsampling: "4:2:0"
|
|
556
|
+
}).toFile(t);
|
|
557
|
+
}
|
|
558
|
+
return !0;
|
|
559
|
+
}, nt = (e) => {
|
|
560
|
+
if (!e.length) return;
|
|
561
|
+
let t = e.map(({ file: e, from: t, to: n, status: r }) => {
|
|
562
|
+
let i = r === "失败" ? "-" : `${t ? ((t - n) / t * 100).toFixed(1) : "0.0"}%`;
|
|
563
|
+
return {
|
|
564
|
+
file: e,
|
|
565
|
+
from: Q(t),
|
|
566
|
+
to: r === "失败" ? "-" : Q(n),
|
|
567
|
+
saved: i,
|
|
568
|
+
status: r
|
|
569
|
+
};
|
|
570
|
+
}), n = {
|
|
571
|
+
file: "文件",
|
|
572
|
+
from: "原大小",
|
|
573
|
+
to: "新大小",
|
|
574
|
+
saved: "节省",
|
|
575
|
+
status: "状态"
|
|
576
|
+
}, a = Object.keys(n).reduce((e, i) => (e[i] = Math.max(r(n[i]), ...t.map((e) => r(e[i]))), e), {}), o = (e, t) => e + " ".repeat(t - r(e)), s = (e) => e === "压缩" ? i.green(e) : e === "转换" ? i.cyan(e) : e === "跳过" ? i.yellow(e) : i.red(e);
|
|
577
|
+
M(), M(i.bold(`${o(n.file, a.file)} ${o(n.from, a.from)} ${o(n.to, a.to)} ${o(n.saved, a.saved)} ${n.status}`)), M(i.gray("─".repeat(a.file + a.from + a.to + a.saved + a.status + 8))), t.forEach(({ file: e, from: t, to: n, saved: r, status: i }) => {
|
|
578
|
+
M(`${o(e, a.file)} ${o(t, a.from)} ${o(n, a.to)} ${o(r, a.saved)} ${s(i)}`);
|
|
579
|
+
});
|
|
580
|
+
};
|
|
581
|
+
n.command("mini <图片目录> [输出目录]").option("-e, --extension [扩展名]", "目标扩展名,如 png / jpg / webp / avif / tiff,默认保持原格式", "").option("--lossless", "使用无损压缩(体积更大,画质完全不变)", !1).description("压缩图片(默认 TinyPNG 风格智能有损,支持格式转换)").action(async (e, t, n) => {
|
|
582
|
+
let r = y(process.cwd(), e);
|
|
583
|
+
if (!s(r) || !p(r).isDirectory()) return j(`图片目录不存在:${r}`);
|
|
584
|
+
let o = !!n?.lossless, l = typeof n?.extension == "string" ? n.extension.replace(/^\./, "").trim().toLowerCase() : "";
|
|
585
|
+
if (l && !$e.includes(l)) return j(`不支持的扩展名:${l},可选值:${$e.join(" / ")}`);
|
|
586
|
+
let u = y(process.cwd(), t || v(r, "mini")), f = et(r, [u, y(r, "mini")]);
|
|
587
|
+
if (!f.length) return M("未找到可处理的图片");
|
|
588
|
+
let h = x({
|
|
589
|
+
text: "正在压缩图片...",
|
|
590
|
+
color: "yellow"
|
|
591
|
+
}).start(), b = [];
|
|
592
|
+
for (let e of f) {
|
|
593
|
+
let t = Z(e), n = te(r, e), f = v(u, ee(n)), p = _(e).slice(1).toLowerCase(), x = l || p, S = x !== p, C = v(f, `${g(e, _(e))}.${x}`), w = y(C) === y(e), T = `${C}.mini-temp`, E = w ? T : C;
|
|
594
|
+
h.text = `正在处理 ${i.cyan(n)}`;
|
|
595
|
+
try {
|
|
596
|
+
c(f, { recursive: !0 });
|
|
597
|
+
let r = await tt(e, E, x, o);
|
|
598
|
+
if (r && (S || Z(E) < t)) w && d(T, C), b.push({
|
|
599
|
+
file: n,
|
|
600
|
+
from: t,
|
|
601
|
+
to: Z(C),
|
|
602
|
+
status: S ? "转换" : "压缩"
|
|
603
|
+
});
|
|
604
|
+
else if (s(T) && m(T), r || w) b.push({
|
|
605
|
+
file: n,
|
|
606
|
+
from: t,
|
|
607
|
+
to: t,
|
|
608
|
+
status: "跳过"
|
|
609
|
+
});
|
|
610
|
+
else {
|
|
611
|
+
let r = S ? v(f, g(e)) : C;
|
|
612
|
+
y(r) !== y(e) && a(e, r), b.push({
|
|
613
|
+
file: n,
|
|
614
|
+
from: t,
|
|
615
|
+
to: t,
|
|
616
|
+
status: "跳过"
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
} catch (e) {
|
|
620
|
+
s(T) && m(T), b.push({
|
|
621
|
+
file: n,
|
|
622
|
+
from: t,
|
|
623
|
+
to: 0,
|
|
624
|
+
status: "失败"
|
|
625
|
+
}), h.stop(), j(`${n} 处理失败:${e?.message || e}`), h.start();
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
h.stop(), nt(b);
|
|
629
|
+
let S = b.filter(({ status: e }) => e === "压缩"), C = b.filter(({ status: e }) => e === "转换"), w = b.filter(({ status: e }) => e === "跳过"), T = b.filter(({ status: e }) => e === "失败"), E = b.reduce((e, { from: t }) => e + t, 0), D = b.reduce((e, { from: t, to: n, status: r }) => e + (r === "失败" ? t : n), 0), O = E ? ((E - D) / E * 100).toFixed(1) : "0.0";
|
|
630
|
+
M(), A(`共 ${b.length} 张图片,压缩 ${S.length} 张,转换 ${C.length} 张,跳过 ${w.length} 张,失败 ${T.length} 张`), M(`${i.gray("模式")} ${o ? "无损" : "智能有损(TinyPNG 风格)"}`), M(`${i.gray("总计")} ${Q(E)} ${i.gray("→")} ${Q(D)} ${i.green(`节省 ${O}%`)}`), M(i.green(`输出目录 ${u}`));
|
|
631
|
+
}), n.usage("[commands] [options]").version(se, "-v, --version", "输出版本号"), n.command("build[:环境] [描述]").description("简化打包提交命令"), n.command("version<[++]|[@<版本号>]>").description("例如:version++ 或者 version@1.0.0;自动更新 package.json 版本号,自动更新 `README.md` 中的 `version-v<version>-blue` 图标版本");
|
|
632
|
+
var rt = class extends t {
|
|
633
|
+
displayWidth(e) {
|
|
634
|
+
return r(e);
|
|
635
|
+
}
|
|
636
|
+
formatItem(e, t, n, r) {
|
|
637
|
+
return super.formatItem(e, t, n, r) + "\n";
|
|
638
|
+
}
|
|
639
|
+
};
|
|
640
|
+
e.prototype.createHelp = function() {
|
|
641
|
+
return Object.assign(new rt(), this.configureHelp());
|
|
642
|
+
};
|
|
643
|
+
var it = (e) => {
|
|
644
|
+
e.helpOption("-h, --help", "输出帮助信息"), e.commands.forEach(it);
|
|
645
|
+
};
|
|
646
|
+
it(n), n.arguments("<cmd> [env]").action((e, t) => {
|
|
647
|
+
me(e, t);
|
|
648
|
+
}), process.argv.length < 3 ? n.help() : n.parse(process.argv);
|
|
649
|
+
// src/update.ts
|
|
650
|
+
var $ = ae({
|
|
651
|
+
pkg: k,
|
|
652
|
+
updateCheckInterval: 1e3
|
|
495
653
|
});
|
|
496
|
-
if ($.update && $.update.latest !==
|
|
654
|
+
if ($.update && $.update.latest !== k.version) {
|
|
497
655
|
let e = "";
|
|
498
656
|
switch ($.update.type) {
|
|
499
657
|
case "major":
|
|
500
|
-
e =
|
|
658
|
+
e = i.red("{latestVersion}");
|
|
501
659
|
break;
|
|
502
660
|
case "minor":
|
|
503
|
-
e =
|
|
504
|
-
break;
|
|
505
|
-
default:
|
|
506
|
-
e = t.green("{latestVersion}");
|
|
661
|
+
e = i.yellow("{latestVersion}");
|
|
507
662
|
break;
|
|
663
|
+
default: e = i.green("{latestVersion}");
|
|
508
664
|
}
|
|
509
|
-
let
|
|
665
|
+
let t = `https://github.com/biaov/${k.name}/compare/v${k.version}...v{latestVersion}`;
|
|
510
666
|
$.notify({
|
|
511
667
|
defer: !1,
|
|
512
668
|
isGlobal: !0,
|
|
513
|
-
message: `有更新 ${
|
|
669
|
+
message: `有更新 ${i.dim("{currentVersion}")}${i.reset(" → ")}${e}\n运行 ${i.cyan("{updateCommand}@latest")} 命令更新\n${i.dim.underline(t)}`
|
|
514
670
|
});
|
|
515
671
|
}
|
|
516
|
-
//#endregion
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/config/keyword.ts
|
|
2
2
|
var e = {
|
|
3
3
|
"Auto-compact": "自动压缩",
|
|
4
4
|
"Switch models when a message is flagged": "当消息被标记时切换模型",
|
|
@@ -144,5 +144,4 @@ var e = {
|
|
|
144
144
|
"accept edits": "接受编辑",
|
|
145
145
|
"Search settings…": "搜索设置…"
|
|
146
146
|
};
|
|
147
|
-
//#endregion
|
|
148
147
|
export { e as default };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mine-auto-cli",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.9.1",
|
|
5
5
|
"exports": "./dist/index.js",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"type": "module",
|
|
@@ -46,15 +46,17 @@
|
|
|
46
46
|
],
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@avmc/bun-extractor": "^0.5.1",
|
|
49
|
-
"chalk": "^
|
|
49
|
+
"chalk": "^6.0.1",
|
|
50
50
|
"commander": "^15.0.0",
|
|
51
51
|
"download-git-repo": "^3.0.2",
|
|
52
|
-
"inquirer": "^14.
|
|
53
|
-
"js-yaml": "^5.
|
|
52
|
+
"inquirer": "^14.2.5",
|
|
53
|
+
"js-yaml": "^5.5.0",
|
|
54
54
|
"log-symbols": "^7.0.1",
|
|
55
55
|
"ora": "^9.4.1",
|
|
56
|
-
"pacote": "^22.0.
|
|
56
|
+
"pacote": "^22.0.1",
|
|
57
57
|
"semver-utils": "^1.1.4",
|
|
58
|
+
"sharp": "^0.35.5",
|
|
59
|
+
"string-width": "^8.3.0",
|
|
58
60
|
"strip-json-comments": "^5.0.3",
|
|
59
61
|
"update-notifier": "^7.3.1"
|
|
60
62
|
},
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
var e = {
|
|
2
|
-
permissions: {
|
|
3
|
-
allow: [
|
|
4
|
-
"Read(//**)",
|
|
5
|
-
"Edit(//**)",
|
|
6
|
-
"Delete(//**)",
|
|
7
|
-
"Bash(*)"
|
|
8
|
-
],
|
|
9
|
-
deny: ["Bash(git *)"],
|
|
10
|
-
defaultMode: "acceptEdits"
|
|
11
|
-
},
|
|
12
|
-
enabledPlugins: {
|
|
13
|
-
"context7@claude-plugins-official": !0,
|
|
14
|
-
"frontend-design@claude-plugins-official": !0,
|
|
15
|
-
"superpowers@claude-plugins-official": !0,
|
|
16
|
-
"claude-mem@thedotmack": !0,
|
|
17
|
-
"code-simplifier@claude-plugins-official": !0
|
|
18
|
-
},
|
|
19
|
-
language: "Chinese",
|
|
20
|
-
theme: "dark-daltonized"
|
|
21
|
-
};
|
|
22
|
-
//#endregion
|
|
23
|
-
export { e as default };
|