mioku 0.8.13 → 0.8.15
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 +95 -0
- package/dist/cli.cjs +92 -36
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +92 -36
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -8,7 +8,7 @@ import dedent from "dedent";
|
|
|
8
8
|
import consola from "consola";
|
|
9
9
|
|
|
10
10
|
//#region package.json
|
|
11
|
-
var version = "0.8.
|
|
11
|
+
var version = "0.8.15";
|
|
12
12
|
|
|
13
13
|
//#endregion
|
|
14
14
|
//#region src/cli.ts
|
|
@@ -28,21 +28,72 @@ const args = process.argv.slice(2);
|
|
|
28
28
|
function run(cmd, args$1 = [], options = {}) {
|
|
29
29
|
return execFileSync(cmd, args$1, {
|
|
30
30
|
stdio: "inherit",
|
|
31
|
+
shell: process.platform === "win32",
|
|
31
32
|
...options
|
|
32
33
|
});
|
|
33
34
|
}
|
|
34
|
-
function
|
|
35
|
+
async function rmrf(dir, retries = 5) {
|
|
36
|
+
for (let i = 0; i < retries; i++) try {
|
|
37
|
+
fs.rmSync(dir, {
|
|
38
|
+
recursive: true,
|
|
39
|
+
force: true
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
42
|
+
} catch (err) {
|
|
43
|
+
if (i === retries - 1) throw err;
|
|
44
|
+
const code = err?.code;
|
|
45
|
+
if (code === "EPERM" || code === "EBUSY" || code === "ENOTEMPTY" || code === "ENOENT") await new Promise((resolve) => setTimeout(resolve, 300 * (i + 1)));
|
|
46
|
+
else throw err;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function hasCommand(cmd) {
|
|
35
50
|
try {
|
|
36
|
-
execFileSync(
|
|
51
|
+
execFileSync(cmd, ["--version"], {
|
|
52
|
+
stdio: "ignore",
|
|
53
|
+
shell: process.platform === "win32"
|
|
54
|
+
});
|
|
37
55
|
return true;
|
|
38
56
|
} catch {
|
|
39
57
|
return false;
|
|
40
58
|
}
|
|
41
59
|
}
|
|
60
|
+
function findNpmPath() {
|
|
61
|
+
if (process.platform !== "win32") return "npm";
|
|
62
|
+
const candidates = [
|
|
63
|
+
"npm.cmd",
|
|
64
|
+
"npm.exe",
|
|
65
|
+
path.join(process.env.ProgramFiles || "", "nodejs", "npm.cmd"),
|
|
66
|
+
path.join(process.env["ProgramFiles(x86)"] || "", "nodejs", "npm.cmd"),
|
|
67
|
+
path.join(process.env.APPDATA || "", "npm", "npm.cmd")
|
|
68
|
+
];
|
|
69
|
+
for (const candidate of candidates) try {
|
|
70
|
+
execFileSync(candidate, ["--version"], {
|
|
71
|
+
stdio: "ignore",
|
|
72
|
+
shell: true
|
|
73
|
+
});
|
|
74
|
+
return candidate;
|
|
75
|
+
} catch {}
|
|
76
|
+
try {
|
|
77
|
+
const result = execFileSync("where", ["npm"], {
|
|
78
|
+
encoding: "utf-8",
|
|
79
|
+
shell: true
|
|
80
|
+
});
|
|
81
|
+
const lines = result.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
82
|
+
const cmdPath = lines.find((line) => line.endsWith(".cmd"));
|
|
83
|
+
return cmdPath || lines[0] || null;
|
|
84
|
+
} catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
42
88
|
function ensurePackageManager() {
|
|
43
|
-
if (
|
|
89
|
+
if (hasCommand("bun")) return;
|
|
44
90
|
console.log("安装 bun...");
|
|
45
|
-
|
|
91
|
+
const npmPath = findNpmPath();
|
|
92
|
+
if (!npmPath) {
|
|
93
|
+
consola.error("未找到 npm,请确保 Node.js 已安装并包含 npm");
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
run(npmPath, [
|
|
46
97
|
"install",
|
|
47
98
|
"-g",
|
|
48
99
|
"bun"
|
|
@@ -86,11 +137,10 @@ async function installWebUIDist(projectPath) {
|
|
|
86
137
|
}
|
|
87
138
|
const release = await releaseRes.json();
|
|
88
139
|
consola.success(`获取 Release 成功: ${release.tag_name}`);
|
|
89
|
-
const
|
|
90
|
-
const distAsset = assets.find((a) => a.name.includes("dist") || a.name.endsWith(".zip"));
|
|
140
|
+
const distAsset = release.assets.find((a) => a.name.includes("dist") || a.name.endsWith(".zip"));
|
|
91
141
|
if (!distAsset) {
|
|
92
142
|
consola.error("未找到 dist zip 资源");
|
|
93
|
-
console.log("可用资源:", assets.map((a) => a.name));
|
|
143
|
+
console.log("可用资源:", release.assets.map((a) => a.name));
|
|
94
144
|
return;
|
|
95
145
|
}
|
|
96
146
|
consola.info(`下载资源: ${distAsset.name}`);
|
|
@@ -105,14 +155,10 @@ async function installWebUIDist(projectPath) {
|
|
|
105
155
|
consola.success(`ZIP 下载完成: ${tmpZip}`);
|
|
106
156
|
const tmpUnpack = path.join(os.tmpdir(), `mioku-webui-unpack-${Date.now()}`);
|
|
107
157
|
fs.mkdirSync(tmpUnpack, { recursive: true });
|
|
108
|
-
if (!commandExists("unzip")) {
|
|
109
|
-
consola.error("系统未安装 unzip");
|
|
110
|
-
consola.info("Debian/Ubuntu: apt install unzip");
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
158
|
consola.info("正在解压 WebUI...");
|
|
114
|
-
run("
|
|
115
|
-
"
|
|
159
|
+
run("bun", [
|
|
160
|
+
"x",
|
|
161
|
+
"unzip",
|
|
116
162
|
tmpZip,
|
|
117
163
|
"-d",
|
|
118
164
|
tmpUnpack
|
|
@@ -131,11 +177,8 @@ async function installWebUIDist(projectPath) {
|
|
|
131
177
|
force: true
|
|
132
178
|
});
|
|
133
179
|
consola.success("WebUI dist 安装成功");
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
recursive: true,
|
|
137
|
-
force: true
|
|
138
|
-
});
|
|
180
|
+
await rmrf(tmpZip);
|
|
181
|
+
await rmrf(tmpUnpack);
|
|
139
182
|
consola.success("临时文件清理完成");
|
|
140
183
|
} catch (err) {
|
|
141
184
|
consola.error("安装 WebUI dist 失败");
|
|
@@ -196,7 +239,8 @@ async function checkUpdates(packages, cwd) {
|
|
|
196
239
|
], {
|
|
197
240
|
cwd,
|
|
198
241
|
encoding: "utf-8",
|
|
199
|
-
stdio: "pipe"
|
|
242
|
+
stdio: "pipe",
|
|
243
|
+
shell: process.platform === "win32"
|
|
200
244
|
});
|
|
201
245
|
if (!output.trim()) {
|
|
202
246
|
consola.info("所有依赖已是最新版本");
|
|
@@ -266,17 +310,20 @@ async function getInstalledPackages(cwd) {
|
|
|
266
310
|
if (!type || !name) {
|
|
267
311
|
consola.error("请指定类型和名称: mioku install plugin <名称> 或 mioku install service <名称>");
|
|
268
312
|
console.log(helpInfo);
|
|
269
|
-
process.
|
|
313
|
+
process.exitCode = 1;
|
|
314
|
+
return;
|
|
270
315
|
}
|
|
271
316
|
if (type !== "plugin" && type !== "service") {
|
|
272
317
|
consola.error(`无效的类型 "${type}",请使用 plugin 或 service`);
|
|
273
318
|
console.log(helpInfo);
|
|
274
|
-
process.
|
|
319
|
+
process.exitCode = 1;
|
|
320
|
+
return;
|
|
275
321
|
}
|
|
276
322
|
const prefix = type === "plugin" ? PLUGIN_PREFIX : SERVICE_PREFIX;
|
|
277
323
|
const normalized = `${prefix}${name}`;
|
|
278
324
|
const success = await installPackage(normalized, cwd);
|
|
279
|
-
process.
|
|
325
|
+
process.exitCode = success ? 0 : 1;
|
|
326
|
+
return;
|
|
280
327
|
}
|
|
281
328
|
case "update": {
|
|
282
329
|
ensurePackageManager();
|
|
@@ -290,21 +337,25 @@ async function getInstalledPackages(cwd) {
|
|
|
290
337
|
updates.forEach((u) => consola.warn(` ${u}`));
|
|
291
338
|
console.log("\n运行 npx mioku update all 更新所有包");
|
|
292
339
|
}
|
|
293
|
-
process.
|
|
340
|
+
process.exitCode = 0;
|
|
341
|
+
return;
|
|
294
342
|
}
|
|
295
343
|
const target = cmdArgs[0];
|
|
296
344
|
if (target === "all") {
|
|
297
345
|
const packages$1 = await getInstalledPackages(cwd);
|
|
298
346
|
if (packages$1.length === 0) {
|
|
299
347
|
consola.info("未找到 mioku 相关依赖");
|
|
300
|
-
process.
|
|
348
|
+
process.exitCode = 0;
|
|
349
|
+
return;
|
|
301
350
|
}
|
|
302
351
|
for (const pkg of packages$1) await updatePackage(pkg, cwd);
|
|
303
|
-
process.
|
|
352
|
+
process.exitCode = 0;
|
|
353
|
+
return;
|
|
304
354
|
}
|
|
305
355
|
if (target === "self") {
|
|
306
356
|
await updatePackage("mioku", cwd);
|
|
307
|
-
process.
|
|
357
|
+
process.exitCode = 0;
|
|
358
|
+
return;
|
|
308
359
|
}
|
|
309
360
|
if (target === "plugin" || target === "service") {
|
|
310
361
|
const name = cmdArgs[1];
|
|
@@ -314,7 +365,8 @@ async function getInstalledPackages(cwd) {
|
|
|
314
365
|
const filtered = packages$1.filter((p) => p.startsWith(prefix));
|
|
315
366
|
if (filtered.length === 0) {
|
|
316
367
|
consola.info(`未找到 ${prefix}* 相关依赖`);
|
|
317
|
-
process.
|
|
368
|
+
process.exitCode = 0;
|
|
369
|
+
return;
|
|
318
370
|
}
|
|
319
371
|
for (const pkg of filtered) await updatePackage(pkg, cwd);
|
|
320
372
|
} else {
|
|
@@ -322,7 +374,8 @@ async function getInstalledPackages(cwd) {
|
|
|
322
374
|
const normalized = name.startsWith(prefix) ? name : `${prefix}${name}`;
|
|
323
375
|
await updatePackage(normalized, cwd);
|
|
324
376
|
}
|
|
325
|
-
process.
|
|
377
|
+
process.exitCode = 0;
|
|
378
|
+
return;
|
|
326
379
|
}
|
|
327
380
|
const packages = await getInstalledPackages(cwd);
|
|
328
381
|
if (packages.includes(target)) await updatePackage(target, cwd);
|
|
@@ -330,7 +383,8 @@ async function getInstalledPackages(cwd) {
|
|
|
330
383
|
const normalized = normalizePackageName(target);
|
|
331
384
|
await updatePackage(normalized, cwd);
|
|
332
385
|
}
|
|
333
|
-
process.
|
|
386
|
+
process.exitCode = 0;
|
|
387
|
+
return;
|
|
334
388
|
}
|
|
335
389
|
default: {
|
|
336
390
|
const cli$1 = mri(args, { alias: {
|
|
@@ -340,10 +394,12 @@ async function getInstalledPackages(cwd) {
|
|
|
340
394
|
switch (true) {
|
|
341
395
|
case cli$1.version:
|
|
342
396
|
console.log(`v${version}`);
|
|
343
|
-
process.
|
|
397
|
+
process.exitCode = 0;
|
|
398
|
+
return;
|
|
344
399
|
case cli$1.help:
|
|
345
400
|
console.log(helpInfo);
|
|
346
|
-
process.
|
|
401
|
+
process.exitCode = 0;
|
|
402
|
+
return;
|
|
347
403
|
default: break;
|
|
348
404
|
}
|
|
349
405
|
const name = await input("请输入项目名称", {
|
|
@@ -446,9 +502,9 @@ async function createNewProject(name, fileTree) {
|
|
|
446
502
|
if (!confirmOver) gracefullyExit();
|
|
447
503
|
}
|
|
448
504
|
}
|
|
449
|
-
|
|
505
|
+
await rmrf(projectPath);
|
|
450
506
|
}
|
|
451
|
-
fs.mkdirSync(projectPath);
|
|
507
|
+
fs.mkdirSync(projectPath, { recursive: true });
|
|
452
508
|
makeFileTree(fileTree, projectPath);
|
|
453
509
|
console.log(`项目 ${projectName} 创建成功!`);
|
|
454
510
|
const [cmd, args$1] = getAddCommand(DEFAULT_PACKAGES);
|
|
@@ -482,7 +538,7 @@ function makeFileTree(fileTree, base) {
|
|
|
482
538
|
for (const [name, content] of Object.entries(fileTree)) if (typeof content === "object" && content !== null) {
|
|
483
539
|
const subPath = `${base}/${name}`;
|
|
484
540
|
if (!fs.existsSync(subPath)) fs.mkdirSync(subPath, { recursive: true });
|
|
485
|
-
for (const [subName, subContent] of Object.entries(content)) if (typeof subContent === "object") makeFileTree(
|
|
541
|
+
for (const [subName, subContent] of Object.entries(content)) if (typeof subContent === "object") makeFileTree(subContent, path.join(subPath, subName));
|
|
486
542
|
else fs.writeFileSync(`${subPath}/${subName}`, subContent);
|
|
487
543
|
} else {
|
|
488
544
|
const filePath = `${base}/${name}`;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":["cmd: string","args: string[]","options: Parameters<typeof execFileSync>[2]","args","packages: string[]","input: string","input","name: string","projectPath: string","a: any","unpackDir: string","cwd?: string","updates: string[]","cwd: string","packages","cli","fileTree: Record<string, any>","_path: string","message: string","options?: OmitTypeWithRequired<{ initial?: boolean }>","options?: OmitTypeWithRequired<{ default?: string; placeholder?: string }>","fileTree: Record<\n string,\n string | Record<string, string | Record<string, string>>\n >","base: string"],"sources":["../package.json","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"mioku\",\n \"type\": \"module\",\n \"version\": \"0.8.9\",\n \"packageManager\": \"bun@1.2.0\",\n \"description\": \"Mioku - Plugin framework extended from mioki for NapCat OneBot v11\",\n \"keywords\": [\n \"onebot\",\n \"framework\",\n \"bot\",\n \"mioki\",\n \"mioku\"\n ],\n \"bin\": {\n \"mioku\": \"./dist/cli.js\"\n },\n \"engines\": {\n \"node\": \">= 22.18.0\"\n },\n \"homepage\": \"https://github.com/jerryplusy/mioku#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/jerryplusy/mioku/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jerryplusy/mioku.git\",\n \"directory\": \"src/packages/mioku\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Jerryplusy <jerryplusy@outlook.com>\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mioki\": \"^0.16.0\",\n \"napcat-sdk\": \"^0.16.0\",\n \"consola\": \"^3.4.2\",\n \"dayjs\": \"^1.11.19\",\n \"dedent\": \"^1.7.1\",\n \"filesize\": \"^11.0.13\",\n \"inquirer\": \"^10.0.0\",\n \"jiti\": \"^2.6.1\",\n \"lowdb\": \"^7.0.1\",\n \"mri\": \"^1.2.0\",\n \"node-cron\": \"^4.2.1\",\n \"openai\": \"^4.0.0\",\n \"puppeteer\": \"^23.10.0\",\n \"pretty-ms\": \"^9.3.0\",\n \"string2argv\": \"^1.0.2\",\n \"systeminformation\": \"^5.30.7\",\n \"lodash\": \"^4.17.21\"\n },\n \"devDependencies\": {\n \"@types/lodash\": \"^4.17.0\",\n \"@types/node\": \"^22.0.0\",\n \"@types/puppeteer\": \"^7.0.4\",\n \"tsdown\": \"^0.11.0\",\n \"typescript\": \"^5.8.0\"\n }\n}\n","#!/usr/bin/env node\n\nimport fs from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport mri from \"mri\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport dedent from \"dedent\";\nimport consola from \"consola\";\nimport { version } from \"../package.json\";\nimport { readFileSync } from \"node:fs\";\n\nconst DEFAULT_PACKAGES = [\n \"mioku\",\n \"mioku-plugin-boot\",\n \"mioku-plugin-help\",\n \"mioku-plugin-chat\",\n \"mioku-service-config\",\n \"mioku-service-ai\",\n \"mioku-service-screenshot\",\n \"mioku-service-help\",\n];\n\nconst PLUGIN_PREFIX = \"mioku-plugin-\";\nconst SERVICE_PREFIX = \"mioku-service-\";\n\nconst args = process.argv.slice(2);\n\nfunction run(\n cmd: string,\n args: string[] = [],\n options: Parameters<typeof execFileSync>[2] = {},\n) {\n return execFileSync(cmd, args, {\n stdio: \"inherit\",\n ...options,\n });\n}\n\ninterface CliOptions {\n name?: string;\n protocol?: string;\n host?: string;\n port?: number;\n token?: string;\n prefix?: string;\n owners?: string;\n admins?: string;\n help?: boolean;\n version?: boolean;\n \"use-npm-mirror\"?: boolean;\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execFileSync(\"which\", [cmd], {\n stdio: \"ignore\",\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction ensurePackageManager() {\n if (commandExists(\"bun\")) return;\n\n console.log(\"安装 bun...\");\n\n run(\"npm\", [\"install\", \"-g\", \"bun\"]);\n}\n\nfunction getAddCommand(packages: string[]): [string, string[]] {\n return [\"bun\", [\"add\", ...packages]];\n}\n\nfunction normalizePackageName(input: string): string {\n if (input.startsWith(PLUGIN_PREFIX) || input.startsWith(SERVICE_PREFIX)) {\n return input;\n }\n if (input.startsWith(\"mioku-\")) {\n // 已经是完整名称,如 mioku-plugin-xxx\n return input;\n }\n // 默认当作 plugin 处理\n return `${PLUGIN_PREFIX}${input}`;\n}\n\nfunction detectType(name: string): \"plugin\" | \"service\" | \"unknown\" {\n if (name.startsWith(PLUGIN_PREFIX)) return \"plugin\";\n if (name.startsWith(SERVICE_PREFIX)) return \"service\";\n return \"unknown\";\n}\n\nasync function getPackageManager(): Promise<string> {\n return \"bun\";\n}\n\nasync function installWebUIDist(projectPath: string) {\n consola.info(\"正在安装 WebUI...\");\n\n try {\n run(\"bun\", [\"add\", \"mioku-service-webui\"], {\n cwd: projectPath,\n });\n\n consola.success(\"mioku-service-webui 安装成功\");\n } catch (err) {\n consola.error(\"安装 mioku-service-webui 失败\");\n console.error(err);\n return;\n }\n\n const nodeModulesWebui = path.join(\n projectPath,\n \"node_modules\",\n \"mioku-service-webui\",\n );\n\n const targetDist = path.join(nodeModulesWebui, \"dist\");\n\n consola.info(`WebUI dist 目录: ${targetDist}`);\n\n try {\n consola.info(\"正在获取 WebUI Release 信息...\");\n\n const releaseRes = await fetch(\n \"https://api.github.com/repos/mioku-lab/mioku-webui/releases/latest\",\n {\n headers: {\n Accept: \"application/vnd.github+json\",\n \"User-Agent\": \"mioku-cli\",\n },\n },\n );\n\n if (!releaseRes.ok) {\n consola.error(`GitHub API 请求失败: ${releaseRes.status}`);\n return;\n }\n\n const release = await releaseRes.json();\n\n consola.success(`获取 Release 成功: ${release.tag_name}`);\n\n const assets = release.assets || [];\n\n const distAsset = assets.find(\n (a: any) =>\n a.name.includes(\"dist\") ||\n a.name.endsWith(\".zip\"),\n );\n\n if (!distAsset) {\n consola.error(\"未找到 dist zip 资源\");\n console.log(\n \"可用资源:\",\n assets.map((a: any) => a.name),\n );\n return;\n }\n\n consola.info(`下载资源: ${distAsset.name}`);\n\n const zipRes = await fetch(distAsset.browser_download_url, {\n headers: {\n \"User-Agent\": \"mioku-cli\",\n },\n });\n\n if (!zipRes.ok) {\n consola.error(`下载失败: ${zipRes.status}`);\n return;\n }\n\n const buffer = Buffer.from(await zipRes.arrayBuffer());\n\n const tmpZip = path.join(\n os.tmpdir(),\n `mioku-webui-${Date.now()}.zip`,\n );\n\n fs.writeFileSync(tmpZip, buffer);\n\n consola.success(`ZIP 下载完成: ${tmpZip}`);\n\n const tmpUnpack = path.join(\n os.tmpdir(),\n `mioku-webui-unpack-${Date.now()}`,\n );\n\n fs.mkdirSync(tmpUnpack, {\n recursive: true,\n });\n\n if (!commandExists(\"unzip\")) {\n consola.error(\"系统未安装 unzip\");\n consola.info(\"Debian/Ubuntu: apt install unzip\");\n return;\n }\n\n consola.info(\"正在解压 WebUI...\");\n\n run(\"unzip\", [\"-oq\", tmpZip, \"-d\", tmpUnpack]);\n\n consola.success(\"解压完成\");\n\n const sourceDir = findDistSourceDir(tmpUnpack);\n\n if (!sourceDir) {\n consola.error(\"未找到 dist/index.html\");\n consola.info(`解压目录: ${tmpUnpack}`);\n return;\n }\n\n consola.success(`找到 dist: ${sourceDir}`);\n\n fs.mkdirSync(targetDist, {\n recursive: true,\n });\n\n fs.cpSync(sourceDir, targetDist, {\n recursive: true,\n force: true,\n });\n\n consola.success(\"WebUI dist 安装成功\");\n\n fs.rmSync(tmpZip, {\n force: true,\n });\n\n fs.rmSync(tmpUnpack, {\n recursive: true,\n force: true,\n });\n\n consola.success(\"临时文件清理完成\");\n } catch (err) {\n consola.error(\"安装 WebUI dist 失败\");\n console.error(err);\n }\n}\n\nfunction findDistSourceDir(unpackDir: string): string | null {\n const directCandidates = [path.join(unpackDir, \"dist\"), unpackDir];\n for (const candidate of directCandidates) {\n if (fs.existsSync(path.join(candidate, \"index.html\"))) {\n return candidate;\n }\n }\n const children = fs.readdirSync(unpackDir);\n for (const child of children) {\n const childPath = path.join(unpackDir, child);\n if (fs.statSync(childPath).isDirectory()) {\n const subCandidate = path.join(childPath, \"dist\");\n if (fs.existsSync(path.join(subCandidate, \"index.html\"))) {\n return subCandidate;\n }\n }\n }\n return null;\n}\n\nfunction execAdd(packages: string[], cwd?: string) {\n const [cmd, args] = getAddCommand(packages);\n\n console.log(`执行: ${cmd} ${args.join(\" \")}`);\n\n run(cmd, args, {\n cwd,\n });\n}\n\nasync function installPackage(name: string, cwd?: string) {\n const normalized = normalizePackageName(name);\n const type = detectType(normalized);\n if (type === \"unknown\") {\n consola.error(`无法识别的包类型: ${name}`);\n return false;\n }\n try {\n execAdd([normalized], cwd);\n consola.success(`已安装 ${normalized}`);\n return true;\n } catch {\n consola.error(`安装失败: ${normalized}`);\n return false;\n }\n}\n\nasync function updatePackage(name: string, cwd?: string) {\n try {\n console.log(`执行: bun update ${name}`);\n\n run(\"bun\", [\"update\", name], {\n cwd,\n });\n consola.success(`已更新 ${name}`);\n return true;\n } catch {\n consola.error(`更新失败: ${name}`);\n return false;\n }\n}\n\nasync function checkUpdates(\n packages: string[],\n cwd?: string,\n) {\n try {\n const output = execFileSync(\n \"bun\",\n [\"pm\", \"outdated\", \"--json\"],\n {\n cwd,\n encoding: \"utf-8\",\n stdio: \"pipe\",\n },\n );\n if (!output.trim()) {\n consola.info(\"所有依赖已是最新版本\");\n return [];\n }\n const outdated = JSON.parse(output);\n const updates: string[] = [];\n for (const pkg of packages) {\n if (outdated[pkg]) {\n updates.push(\n `${pkg}: ${outdated[pkg].current} → ${outdated[pkg].latest}`,\n );\n }\n }\n return updates;\n } catch {\n return [];\n }\n}\n\nasync function getInstalledPackages(cwd: string): Promise<string[]> {\n try {\n const pkgPath = path.join(cwd, \"package.json\");\n const content = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const deps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n return Object.keys(deps).filter((k) => k.startsWith(\"mioku-\"));\n } catch {\n return [];\n }\n}\n\n(async () => {\n const cli = mri<CliOptions>(args, {\n alias: {\n v: \"version\",\n h: \"help\",\n },\n });\n\n const helpInfo = dedent(`\n mioku 命令行工具 v${version}\n\n 用法: mioku <命令> [选项]\n\n 命令:\n install plugin <名称> 安装插件,自动补全 mioku-plugin- 前缀\n install service <名称> 安装服务,自动补全 mioku-service- 前缀\n update [包名|self|all] 更新插件或服务\n update - 检查可用更新\n update all - 更新所有 mioku- 包\n update self - 更新 mioku 框架\n update xxx - 更新指定包\n\n 选项:\n -h, --help 显示帮助信息\n -v, --version 显示版本号\n --name <name> 指定项目/文件夹名称,默认 mioku-bot\n --protocol <protocol> 指定 NapCat 协议,默认 ws\n --host <host> 指定 NapCat 主机,默认 localhost\n --port <port> 指定 NapCat 端口,默认 3001\n --token <token> 指定 NapCat 连接 Token,默认空\n --prefix <prefix> 指定命令前缀,默认 #\n --owners <owners> 指定主人 QQ,英文逗号分隔,必填\n --admins <admins> 指定管理员 QQ,英文逗号分隔,可空\n --use-npm-mirror 使用 npm 镜像源加速依赖安装,默认否\n `);\n\n const [cmd, ...cmdArgs] = args;\n\n switch (cmd) {\n case \"install\": {\n ensurePackageManager();\n const cwd = process.cwd();\n const type = cmdArgs[0];\n const name = cmdArgs[1];\n\n if (!type || !name) {\n consola.error(\"请指定类型和名称: mioku install plugin <名称> 或 mioku install service <名称>\");\n console.log(helpInfo);\n process.exit(1);\n }\n\n if (type !== \"plugin\" && type !== \"service\") {\n consola.error(`无效的类型 \"${type}\",请使用 plugin 或 service`);\n console.log(helpInfo);\n process.exit(1);\n }\n\n const prefix = type === \"plugin\" ? PLUGIN_PREFIX : SERVICE_PREFIX;\n const normalized = `${prefix}${name}`;\n const success = await installPackage(normalized, cwd);\n process.exit(success ? 0 : 1);\n }\n\n case \"update\": {\n ensurePackageManager();\n const cwd = process.cwd();\n\n if (!cmdArgs.length || cmdArgs[0] === \"check\") {\n // 检查更新\n const packages = await getInstalledPackages(cwd);\n const updates = await checkUpdates(packages, cwd);\n if (updates.length === 0) {\n consola.info(\"所有 mioku 依赖已是最新版本\");\n } else {\n console.log(\"\\n可用更新:\");\n updates.forEach((u) => consola.warn(` ${u}`));\n console.log(\"\\n运行 npx mioku update all 更新所有包\");\n }\n process.exit(0);\n }\n\n const target = cmdArgs[0];\n\n if (target === \"all\") {\n // 更新所有 mioku- 包\n const packages = await getInstalledPackages(cwd);\n if (packages.length === 0) {\n consola.info(\"未找到 mioku 相关依赖\");\n process.exit(0);\n }\n for (const pkg of packages) {\n await updatePackage(pkg, cwd);\n }\n process.exit(0);\n }\n\n if (target === \"self\") {\n await updatePackage(\"mioku\", cwd);\n process.exit(0);\n }\n\n if (target === \"plugin\" || target === \"service\") {\n // update plugin/service [name]\n const name = cmdArgs[1];\n if (!name) {\n // 更新所有指定类型的包\n const packages = await getInstalledPackages(cwd);\n const prefix = target === \"plugin\" ? PLUGIN_PREFIX : SERVICE_PREFIX;\n const filtered = packages.filter((p) => p.startsWith(prefix));\n if (filtered.length === 0) {\n consola.info(`未找到 ${prefix}* 相关依赖`);\n process.exit(0);\n }\n for (const pkg of filtered) {\n await updatePackage(pkg, cwd);\n }\n } else {\n const prefix = target === \"plugin\" ? PLUGIN_PREFIX : SERVICE_PREFIX;\n const normalized = name.startsWith(prefix)\n ? name\n : `${prefix}${name}`;\n await updatePackage(normalized, cwd);\n }\n process.exit(0);\n }\n\n // update xxx - 更新指定包,自动识别前缀\n const packages = await getInstalledPackages(cwd);\n if (packages.includes(target)) {\n await updatePackage(target, cwd);\n } else {\n const normalized = normalizePackageName(target);\n await updatePackage(normalized, cwd);\n }\n process.exit(0);\n }\n\n default: {\n // 原始交互式项目创建\n const cli = mri<CliOptions>(args, {\n alias: {\n v: \"version\",\n h: \"help\",\n },\n });\n\n switch (true) {\n case cli.version:\n console.log(`v${version}`);\n process.exit(0);\n // fall through\n\n case cli.help:\n console.log(helpInfo);\n process.exit(0);\n // fall through\n\n default:\n break;\n }\n\n const name = await input(\"请输入项目名称\", {\n default: \"mioku-bot\",\n placeholder: \"mioku-bot\",\n required: true,\n });\n\n const owners = await input(\"请输入主人 QQ (最高权限,英文逗号分隔,必填)\", {\n placeholder: \"请输入\",\n default: \"\",\n required: true,\n });\n\n const host = await input(\"请输入 NapCat WS 主机\", {\n default: \"localhost\",\n placeholder: \"localhost\",\n required: true,\n });\n\n const port = parseInt(\n await input(\"请输入 NapCat WS 端口\", {\n default: \"3001\",\n placeholder: \"3001\",\n required: true,\n }),\n );\n\n const token = await input(\"请输入 NapCat WS Token(如无则留空)\", {\n placeholder: \"请输入\",\n });\n\n const installWebui = await confirm(\"是否安装 WebUI?(建议安装)\", {\n initial: true,\n });\n\n ensurePackageManager();\n\n const pkgJson = dedent(`\n {\n \"name\": \"${name}\",\n \"private\": true,\n \"type\": \"module\",\n \"dependencies\": {},\n \"mioki\": {\n \"prefix\": \"#\",\n \"owners\": [${String(owners)\n .split(\",\")\n .map((o) => o.trim())\n .join(\", \")}],\n \"admins\": [],\n \"plugins\": [\"boot\", \"help\", \"chat\", \"demo\"],\n \"log_level\": \"info\",\n \"online_push\": false,\n \"error_push\": false,\n \"napcat\": [\n {\n \"protocol\": \"ws\",\n \"port\": ${port},\n \"host\": \"${host}\",\n \"token\": \"${token}\"\n }\n ]\n },\n \"scripts\": {\n \"start\": \"bun run app.ts\",\n \"dev\": \"bun run --watch app.ts\"\n }\n }\n`);\n\n const pluginCode = dedent(`\n import { definePlugin } from 'mioku'\n\n export default definePlugin({\n name: 'demo',\n version: '${version}',\n async setup(ctx) {\n ctx.logger.info('Demo 插件已加载')\n\n ctx.handle('message', async (e) => {\n if (e.raw_message === 'hello') {\n e.reply('world', true)\n }\n })\n\n return () => {\n ctx.logger.info('Demo 插件已卸载')\n }\n },\n })\n`);\n\n const fileTree: Record<string, any> = {\n \"app.ts\":\n \"import { start } from 'mioku'\\n\\nstart({ cwd: import.meta.dirname }).then()\\n\",\n \"package.json\": pkgJson,\n plugins: { demo: { \"index.ts\": pluginCode } },\n config: {},\n data: {},\n };\n\n await createNewProject(name, fileTree);\n\n if (installWebui) {\n await installWebUIDist(path.join(process.cwd(), name));\n }\n\n console.log(\"\\n接下来的操作:\");\n console.log(\" cd\", name);\n console.log(\" bun run start\");\n }\n }\n})();\n\nasync function createNewProject(\n name: string,\n fileTree: Record<string, any>,\n) {\n const projectName = name;\n const projectPath = withRoot(`./${projectName}`);\n\n if (fs.existsSync(projectPath)) {\n const overwrite = await confirm(`项目 ${projectName} 已存在,是否覆盖?`);\n\n if (!overwrite) {\n gracefullyExit();\n }\n\n if (projectPath === process.cwd()) {\n if (fs.readdirSync(projectPath).length !== 0) {\n const confirmOver = await confirm(\n \"项目路径与当前路径相同,将删除当前目录下所有内容再创建,是否继续?\",\n );\n if (!confirmOver) {\n gracefullyExit();\n }\n }\n }\n\n fs.rmSync(projectPath, { recursive: true });\n }\n\n fs.mkdirSync(projectPath);\n\n makeFileTree(fileTree, projectPath);\n\n console.log(`项目 ${projectName} 创建成功!`);\n\n const [cmd, args] = getAddCommand(DEFAULT_PACKAGES);\n console.log(`正在安装 Mioku 依赖: ${cmd} ${args.join(\" \")}`);\n run(cmd, args, {\n cwd: projectPath,\n });\n}\n\nfunction gracefullyExit() {\n console.log(\"Bye!\");\n process.exit(0);\n}\n\nfunction withRoot(_path: string) {\n return path.resolve(process.cwd(), _path);\n}\n\ntype OmitTypeWithRequired<T> = Omit<T, \"type\" | \"required\"> & {\n required?: boolean;\n};\n\nasync function confirm(\n message: string,\n options?: OmitTypeWithRequired<{ initial?: boolean }>,\n) {\n return consola.prompt(message, {\n type: \"confirm\",\n cancel: \"reject\",\n ...options,\n });\n}\n\nasync function input(\n message: string,\n options?: OmitTypeWithRequired<{ default?: string; placeholder?: string }>,\n) {\n const result = await consola.prompt(message, {\n type: \"text\",\n cancel: \"reject\",\n ...options,\n });\n if (options?.required && !result) return input(message, options);\n return result;\n}\n\nfunction makeFileTree(\n fileTree: Record<\n string,\n string | Record<string, string | Record<string, string>>\n >,\n base: string,\n) {\n for (const [name, content] of Object.entries(fileTree)) {\n if (typeof content === \"object\" && content !== null) {\n const subPath = `${base}/${name}`;\n if (!fs.existsSync(subPath)) {\n fs.mkdirSync(subPath, { recursive: true });\n }\n for (const [subName, subContent] of Object.entries(content)) {\n if (typeof subContent === \"object\") {\n makeFileTree(content as typeof fileTree, subPath);\n } else {\n fs.writeFileSync(`${subPath}/${subName}`, subContent);\n }\n }\n } else {\n const filePath = `${base}/${name}`;\n const dirname = path.dirname(filePath);\n if (!fs.existsSync(dirname)) {\n fs.mkdirSync(dirname, { recursive: true });\n }\n fs.writeFileSync(filePath, content);\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","names":["cmd: string","args: string[]","options: Parameters<typeof execFileSync>[2]","args","dir: string","err: any","packages: string[]","input: string","input","name: string","projectPath: string","a: { name: string; browser_download_url: string }","a: { name: string }","unpackDir: string","cwd?: string","updates: string[]","cwd: string","packages","cli","fileTree: Record<string, any>","_path: string","message: string","options?: OmitTypeWithRequired<{ initial?: boolean }>","options?: OmitTypeWithRequired<{ default?: string; placeholder?: string }>","fileTree: Record<\n string,\n string | Record<string, string | Record<string, string>>\n >","base: string"],"sources":["../package.json","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"mioku\",\n \"type\": \"module\",\n \"version\": \"0.8.15\",\n \"packageManager\": \"bun@1.2.0\",\n \"description\": \"Mioku - Plugin framework extended from mioki for NapCat OneBot v11\",\n \"keywords\": [\n \"onebot\",\n \"framework\",\n \"bot\",\n \"mioki\",\n \"mioku\"\n ],\n \"bin\": {\n \"mioku\": \"./dist/cli.js\"\n },\n \"engines\": {\n \"node\": \">= 22.18.0\"\n },\n \"homepage\": \"https://github.com/jerryplusy/mioku#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/jerryplusy/mioku/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jerryplusy/mioku.git\",\n \"directory\": \"src/packages/mioku\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Jerryplusy <jerryplusy@outlook.com>\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mioki\": \"^0.16.0\",\n \"napcat-sdk\": \"^0.16.0\",\n \"consola\": \"^3.4.2\",\n \"dayjs\": \"^1.11.19\",\n \"dedent\": \"^1.7.1\",\n \"filesize\": \"^11.0.13\",\n \"inquirer\": \"^10.0.0\",\n \"jiti\": \"^2.6.1\",\n \"lowdb\": \"^7.0.1\",\n \"mri\": \"^1.2.0\",\n \"node-cron\": \"^4.2.1\",\n \"openai\": \"^4.0.0\",\n \"puppeteer\": \"^23.10.0\",\n \"pretty-ms\": \"^9.3.0\",\n \"string2argv\": \"^1.0.2\",\n \"systeminformation\": \"^5.30.7\",\n \"lodash\": \"^4.17.21\"\n },\n \"devDependencies\": {\n \"@types/lodash\": \"^4.17.0\",\n \"@types/node\": \"^22.0.0\",\n \"@types/puppeteer\": \"^7.0.4\",\n \"tsdown\": \"^0.11.0\",\n \"typescript\": \"^5.8.0\"\n }\n}\n","#!/usr/bin/env node\n\nimport fs from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport mri from \"mri\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport dedent from \"dedent\";\nimport consola from \"consola\";\nimport { version } from \"../package.json\";\nimport { readFileSync } from \"node:fs\";\n\nconst DEFAULT_PACKAGES = [\n \"mioku\",\n \"mioku-plugin-boot\",\n \"mioku-plugin-help\",\n \"mioku-plugin-chat\",\n \"mioku-service-config\",\n \"mioku-service-ai\",\n \"mioku-service-screenshot\",\n \"mioku-service-help\",\n];\n\nconst PLUGIN_PREFIX = \"mioku-plugin-\";\nconst SERVICE_PREFIX = \"mioku-service-\";\n\nconst args = process.argv.slice(2);\n\nfunction run(\n cmd: string,\n args: string[] = [],\n options: Parameters<typeof execFileSync>[2] = {},\n) {\n return execFileSync(cmd, args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n ...options,\n });\n}\n\nasync function rmrf(dir: string, retries = 5): Promise<void> {\n for (let i = 0; i < retries; i++) {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n return;\n } catch (err: any) {\n if (i === retries - 1) throw err;\n const code = err?.code;\n if (\n code === \"EPERM\" ||\n code === \"EBUSY\" ||\n code === \"ENOTEMPTY\" ||\n code === \"ENOENT\"\n ) {\n await new Promise((resolve) => setTimeout(resolve, 300 * (i + 1)));\n } else {\n throw err;\n }\n }\n }\n}\n\ninterface CliOptions {\n name?: string;\n protocol?: string;\n host?: string;\n port?: number;\n token?: string;\n prefix?: string;\n owners?: string;\n admins?: string;\n help?: boolean;\n version?: boolean;\n \"use-npm-mirror\"?: boolean;\n}\n\nfunction hasCommand(cmd: string): boolean {\n try {\n execFileSync(cmd, [\"--version\"], {\n stdio: \"ignore\",\n shell: process.platform === \"win32\",\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction findNpmPath(): string | null {\n if (process.platform !== \"win32\") {\n return \"npm\";\n }\n\n const candidates = [\n \"npm.cmd\",\n \"npm.exe\",\n path.join(process.env.ProgramFiles || \"\", \"nodejs\", \"npm.cmd\"),\n path.join(process.env[\"ProgramFiles(x86)\"] || \"\", \"nodejs\", \"npm.cmd\"),\n path.join(process.env.APPDATA || \"\", \"npm\", \"npm.cmd\"),\n ];\n\n for (const candidate of candidates) {\n try {\n execFileSync(candidate, [\"--version\"], {\n stdio: \"ignore\",\n shell: true,\n });\n return candidate;\n } catch {}\n }\n\n try {\n const result = execFileSync(\"where\", [\"npm\"], {\n encoding: \"utf-8\",\n shell: true,\n });\n\n const lines = result\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const cmdPath = lines.find((line) => line.endsWith(\".cmd\"));\n return cmdPath || lines[0] || null;\n } catch {\n return null;\n }\n}\n\nfunction ensurePackageManager() {\n if (hasCommand(\"bun\")) return;\n\n console.log(\"安装 bun...\");\n\n const npmPath = findNpmPath();\n if (!npmPath) {\n consola.error(\"未找到 npm,请确保 Node.js 已安装并包含 npm\");\n process.exit(1);\n }\n\n run(npmPath, [\"install\", \"-g\", \"bun\"]);\n}\n\nfunction getAddCommand(packages: string[]): [string, string[]] {\n return [\"bun\", [\"add\", ...packages]];\n}\n\nfunction normalizePackageName(input: string): string {\n if (input.startsWith(PLUGIN_PREFIX) || input.startsWith(SERVICE_PREFIX)) {\n return input;\n }\n if (input.startsWith(\"mioku-\")) {\n // 已经是完整名称,如 mioku-plugin-xxx\n return input;\n }\n // 默认当作 plugin 处理\n return `${PLUGIN_PREFIX}${input}`;\n}\n\nfunction detectType(name: string): \"plugin\" | \"service\" | \"unknown\" {\n if (name.startsWith(PLUGIN_PREFIX)) return \"plugin\";\n if (name.startsWith(SERVICE_PREFIX)) return \"service\";\n return \"unknown\";\n}\n\nasync function installWebUIDist(projectPath: string) {\n consola.info(\"正在安装 WebUI...\");\n\n try {\n run(\"bun\", [\"add\", \"mioku-service-webui\"], {\n cwd: projectPath,\n });\n\n consola.success(\"mioku-service-webui 安装成功\");\n } catch (err) {\n consola.error(\"安装 mioku-service-webui 失败\");\n console.error(err);\n return;\n }\n\n const nodeModulesWebui = path.join(\n projectPath,\n \"node_modules\",\n \"mioku-service-webui\",\n );\n\n const targetDist = path.join(nodeModulesWebui, \"dist\");\n\n consola.info(`WebUI dist 目录: ${targetDist}`);\n\n try {\n consola.info(\"正在获取 WebUI Release 信息...\");\n\n const releaseRes = await fetch(\n \"https://api.github.com/repos/mioku-lab/mioku-webui/releases/latest\",\n {\n headers: {\n Accept: \"application/vnd.github+json\",\n \"User-Agent\": \"mioku-cli\",\n },\n },\n );\n\n if (!releaseRes.ok) {\n consola.error(`GitHub API 请求失败: ${releaseRes.status}`);\n return;\n }\n\n const release = (await releaseRes.json()) as {\n tag_name: string;\n assets: Array<{ name: string; browser_download_url: string }>;\n };\n\n consola.success(`获取 Release 成功: ${release.tag_name}`);\n const distAsset = release.assets.find(\n (a: { name: string; browser_download_url: string }) =>\n a.name.includes(\"dist\") || a.name.endsWith(\".zip\"),\n );\n\n if (!distAsset) {\n consola.error(\"未找到 dist zip 资源\");\n console.log(\n \"可用资源:\",\n release.assets.map((a: { name: string }) => a.name),\n );\n return;\n }\n\n consola.info(`下载资源: ${distAsset.name}`);\n\n const zipRes = await fetch(distAsset.browser_download_url, {\n headers: {\n \"User-Agent\": \"mioku-cli\",\n },\n });\n\n if (!zipRes.ok) {\n consola.error(`下载失败: ${zipRes.status}`);\n return;\n }\n\n const buffer = Buffer.from(await zipRes.arrayBuffer());\n\n const tmpZip = path.join(os.tmpdir(), `mioku-webui-${Date.now()}.zip`);\n\n fs.writeFileSync(tmpZip, buffer);\n\n consola.success(`ZIP 下载完成: ${tmpZip}`);\n\n const tmpUnpack = path.join(\n os.tmpdir(),\n `mioku-webui-unpack-${Date.now()}`,\n );\n\n fs.mkdirSync(tmpUnpack, {\n recursive: true,\n });\n\n consola.info(\"正在解压 WebUI...\");\n\n run(\"bun\", [\"x\", \"unzip\", tmpZip, \"-d\", tmpUnpack]);\n\n consola.success(\"解压完成\");\n\n const sourceDir = findDistSourceDir(tmpUnpack);\n\n if (!sourceDir) {\n consola.error(\"未找到 dist/index.html\");\n consola.info(`解压目录: ${tmpUnpack}`);\n return;\n }\n\n consola.success(`找到 dist: ${sourceDir}`);\n\n fs.mkdirSync(targetDist, {\n recursive: true,\n });\n\n fs.cpSync(sourceDir, targetDist, {\n recursive: true,\n force: true,\n });\n\n consola.success(\"WebUI dist 安装成功\");\n\n await rmrf(tmpZip);\n await rmrf(tmpUnpack);\n\n consola.success(\"临时文件清理完成\");\n } catch (err) {\n consola.error(\"安装 WebUI dist 失败\");\n console.error(err);\n }\n}\n\nfunction findDistSourceDir(unpackDir: string): string | null {\n const directCandidates = [path.join(unpackDir, \"dist\"), unpackDir];\n for (const candidate of directCandidates) {\n if (fs.existsSync(path.join(candidate, \"index.html\"))) {\n return candidate;\n }\n }\n const children = fs.readdirSync(unpackDir);\n for (const child of children) {\n const childPath = path.join(unpackDir, child);\n if (fs.statSync(childPath).isDirectory()) {\n const subCandidate = path.join(childPath, \"dist\");\n if (fs.existsSync(path.join(subCandidate, \"index.html\"))) {\n return subCandidate;\n }\n }\n }\n return null;\n}\n\nfunction execAdd(packages: string[], cwd?: string) {\n const [cmd, args] = getAddCommand(packages);\n\n console.log(`执行: ${cmd} ${args.join(\" \")}`);\n\n run(cmd, args, {\n cwd,\n });\n}\n\nasync function installPackage(name: string, cwd?: string) {\n const normalized = normalizePackageName(name);\n const type = detectType(normalized);\n if (type === \"unknown\") {\n consola.error(`无法识别的包类型: ${name}`);\n return false;\n }\n try {\n execAdd([normalized], cwd);\n consola.success(`已安装 ${normalized}`);\n return true;\n } catch {\n consola.error(`安装失败: ${normalized}`);\n return false;\n }\n}\n\nasync function updatePackage(name: string, cwd?: string) {\n try {\n console.log(`执行: bun update ${name}`);\n\n run(\"bun\", [\"update\", name], {\n cwd,\n });\n consola.success(`已更新 ${name}`);\n return true;\n } catch {\n consola.error(`更新失败: ${name}`);\n return false;\n }\n}\n\nasync function checkUpdates(packages: string[], cwd?: string) {\n try {\n const output = execFileSync(\"bun\", [\"pm\", \"outdated\", \"--json\"], {\n cwd,\n encoding: \"utf-8\",\n stdio: \"pipe\",\n shell: process.platform === \"win32\",\n });\n if (!output.trim()) {\n consola.info(\"所有依赖已是最新版本\");\n return [];\n }\n const outdated = JSON.parse(output);\n const updates: string[] = [];\n for (const pkg of packages) {\n if (outdated[pkg]) {\n updates.push(\n `${pkg}: ${outdated[pkg].current} → ${outdated[pkg].latest}`,\n );\n }\n }\n return updates;\n } catch {\n return [];\n }\n}\n\nasync function getInstalledPackages(cwd: string): Promise<string[]> {\n try {\n const pkgPath = path.join(cwd, \"package.json\");\n const content = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const deps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n return Object.keys(deps).filter((k) => k.startsWith(\"mioku-\"));\n } catch {\n return [];\n }\n}\n\n(async () => {\n const cli = mri<CliOptions>(args, {\n alias: {\n v: \"version\",\n h: \"help\",\n },\n });\n\n const helpInfo = dedent(`\n mioku 命令行工具 v${version}\n\n 用法: mioku <命令> [选项]\n\n 命令:\n install plugin <名称> 安装插件,自动补全 mioku-plugin- 前缀\n install service <名称> 安装服务,自动补全 mioku-service- 前缀\n update [包名|self|all] 更新插件或服务\n update - 检查可用更新\n update all - 更新所有 mioku- 包\n update self - 更新 mioku 框架\n update xxx - 更新指定包\n\n 选项:\n -h, --help 显示帮助信息\n -v, --version 显示版本号\n --name <name> 指定项目/文件夹名称,默认 mioku-bot\n --protocol <protocol> 指定 NapCat 协议,默认 ws\n --host <host> 指定 NapCat 主机,默认 localhost\n --port <port> 指定 NapCat 端口,默认 3001\n --token <token> 指定 NapCat 连接 Token,默认空\n --prefix <prefix> 指定命令前缀,默认 #\n --owners <owners> 指定主人 QQ,英文逗号分隔,必填\n --admins <admins> 指定管理员 QQ,英文逗号分隔,可空\n --use-npm-mirror 使用 npm 镜像源加速依赖安装,默认否\n `);\n\n const [cmd, ...cmdArgs] = args;\n\n switch (cmd) {\n case \"install\": {\n ensurePackageManager();\n const cwd = process.cwd();\n const type = cmdArgs[0];\n const name = cmdArgs[1];\n\n if (!type || !name) {\n consola.error(\n \"请指定类型和名称: mioku install plugin <名称> 或 mioku install service <名称>\",\n );\n console.log(helpInfo);\n process.exitCode = 1;\n return;\n }\n\n if (type !== \"plugin\" && type !== \"service\") {\n consola.error(`无效的类型 \"${type}\",请使用 plugin 或 service`);\n console.log(helpInfo);\n process.exitCode = 1;\n return;\n }\n\n const prefix = type === \"plugin\" ? PLUGIN_PREFIX : SERVICE_PREFIX;\n const normalized = `${prefix}${name}`;\n const success = await installPackage(normalized, cwd);\n process.exitCode = success ? 0 : 1;\n return;\n }\n\n case \"update\": {\n ensurePackageManager();\n const cwd = process.cwd();\n\n if (!cmdArgs.length || cmdArgs[0] === \"check\") {\n // 检查更新\n const packages = await getInstalledPackages(cwd);\n const updates = await checkUpdates(packages, cwd);\n if (updates.length === 0) {\n consola.info(\"所有 mioku 依赖已是最新版本\");\n } else {\n console.log(\"\\n可用更新:\");\n updates.forEach((u) => consola.warn(` ${u}`));\n console.log(\"\\n运行 npx mioku update all 更新所有包\");\n }\n process.exitCode = 0;\n return;\n }\n\n const target = cmdArgs[0];\n\n if (target === \"all\") {\n // 更新所有 mioku- 包\n const packages = await getInstalledPackages(cwd);\n if (packages.length === 0) {\n consola.info(\"未找到 mioku 相关依赖\");\n process.exitCode = 0;\n return;\n }\n for (const pkg of packages) {\n await updatePackage(pkg, cwd);\n }\n process.exitCode = 0;\n return;\n }\n\n if (target === \"self\") {\n await updatePackage(\"mioku\", cwd);\n process.exitCode = 0;\n return;\n }\n\n if (target === \"plugin\" || target === \"service\") {\n // update plugin/service [name]\n const name = cmdArgs[1];\n if (!name) {\n // 更新所有指定类型的包\n const packages = await getInstalledPackages(cwd);\n const prefix = target === \"plugin\" ? PLUGIN_PREFIX : SERVICE_PREFIX;\n const filtered = packages.filter((p) => p.startsWith(prefix));\n if (filtered.length === 0) {\n consola.info(`未找到 ${prefix}* 相关依赖`);\n process.exitCode = 0;\n return;\n }\n for (const pkg of filtered) {\n await updatePackage(pkg, cwd);\n }\n } else {\n const prefix = target === \"plugin\" ? PLUGIN_PREFIX : SERVICE_PREFIX;\n const normalized = name.startsWith(prefix)\n ? name\n : `${prefix}${name}`;\n await updatePackage(normalized, cwd);\n }\n process.exitCode = 0;\n return;\n }\n\n // update xxx - 更新指定包,自动识别前缀\n const packages = await getInstalledPackages(cwd);\n if (packages.includes(target)) {\n await updatePackage(target, cwd);\n } else {\n const normalized = normalizePackageName(target);\n await updatePackage(normalized, cwd);\n }\n process.exitCode = 0;\n return;\n }\n\n default: {\n // 原始交互式项目创建\n const cli = mri<CliOptions>(args, {\n alias: {\n v: \"version\",\n h: \"help\",\n },\n });\n\n switch (true) {\n case cli.version:\n console.log(`v${version}`);\n process.exitCode = 0;\n return;\n // fall through\n\n case cli.help:\n console.log(helpInfo);\n process.exitCode = 0;\n return;\n // fall through\n\n default:\n break;\n }\n\n const name = await input(\"请输入项目名称\", {\n default: \"mioku-bot\",\n placeholder: \"mioku-bot\",\n required: true,\n });\n\n const owners = await input(\n \"请输入主人 QQ (最高权限,英文逗号分隔,必填)\",\n {\n placeholder: \"请输入\",\n default: \"\",\n required: true,\n },\n );\n\n const host = await input(\"请输入 NapCat WS 主机\", {\n default: \"localhost\",\n placeholder: \"localhost\",\n required: true,\n });\n\n const port = parseInt(\n await input(\"请输入 NapCat WS 端口\", {\n default: \"3001\",\n placeholder: \"3001\",\n required: true,\n }),\n );\n\n const token = await input(\"请输入 NapCat WS Token(如无则留空)\", {\n placeholder: \"请输入\",\n });\n\n const installWebui = await confirm(\"是否安装 WebUI?(建议安装)\", {\n initial: true,\n });\n\n ensurePackageManager();\n\n const pkgJson = dedent(`\n {\n \"name\": \"${name}\",\n \"private\": true,\n \"type\": \"module\",\n \"dependencies\": {},\n \"mioki\": {\n \"prefix\": \"#\",\n \"owners\": [${String(owners)\n .split(\",\")\n .map((o) => o.trim())\n .join(\", \")}],\n \"admins\": [],\n \"plugins\": [\"boot\", \"help\", \"chat\", \"demo\"],\n \"log_level\": \"info\",\n \"online_push\": false,\n \"error_push\": false,\n \"napcat\": [\n {\n \"protocol\": \"ws\",\n \"port\": ${port},\n \"host\": \"${host}\",\n \"token\": \"${token}\"\n }\n ]\n },\n \"scripts\": {\n \"start\": \"bun run app.ts\",\n \"dev\": \"bun run --watch app.ts\"\n }\n }\n`);\n\n const pluginCode = dedent(`\n import { definePlugin } from 'mioku'\n\n export default definePlugin({\n name: 'demo',\n version: '${version}',\n async setup(ctx) {\n ctx.logger.info('Demo 插件已加载')\n\n ctx.handle('message', async (e) => {\n if (e.raw_message === 'hello') {\n e.reply('world', true)\n }\n })\n\n return () => {\n ctx.logger.info('Demo 插件已卸载')\n }\n },\n })\n`);\n\n const fileTree: Record<string, any> = {\n \"app.ts\":\n \"import { start } from 'mioku'\\n\\nstart({ cwd: import.meta.dirname }).then()\\n\",\n \"package.json\": pkgJson,\n plugins: { demo: { \"index.ts\": pluginCode } },\n config: {},\n data: {},\n };\n\n await createNewProject(name, fileTree);\n\n if (installWebui) {\n await installWebUIDist(path.join(process.cwd(), name));\n }\n\n console.log(\"\\n接下来的操作:\");\n console.log(\" cd\", name);\n console.log(\" bun run start\");\n }\n }\n})();\n\nasync function createNewProject(name: string, fileTree: Record<string, any>) {\n const projectName = name;\n const projectPath = withRoot(`./${projectName}`);\n\n if (fs.existsSync(projectPath)) {\n const overwrite = await confirm(`项目 ${projectName} 已存在,是否覆盖?`);\n\n if (!overwrite) {\n gracefullyExit();\n }\n\n if (projectPath === process.cwd()) {\n if (fs.readdirSync(projectPath).length !== 0) {\n const confirmOver = await confirm(\n \"项目路径与当前路径相同,将删除当前目录下所有内容再创建,是否继续?\",\n );\n if (!confirmOver) {\n gracefullyExit();\n }\n }\n }\n\n await rmrf(projectPath);\n }\n\n fs.mkdirSync(projectPath, { recursive: true });\n\n makeFileTree(fileTree, projectPath);\n\n console.log(`项目 ${projectName} 创建成功!`);\n\n const [cmd, args] = getAddCommand(DEFAULT_PACKAGES);\n console.log(`正在安装 Mioku 依赖: ${cmd} ${args.join(\" \")}`);\n run(cmd, args, {\n cwd: projectPath,\n });\n}\n\nfunction gracefullyExit() {\n console.log(\"Bye!\");\n process.exit(0);\n}\n\nfunction withRoot(_path: string) {\n return path.resolve(process.cwd(), _path);\n}\n\ntype OmitTypeWithRequired<T> = Omit<T, \"type\" | \"required\"> & {\n required?: boolean;\n};\n\nasync function confirm(\n message: string,\n options?: OmitTypeWithRequired<{ initial?: boolean }>,\n) {\n return consola.prompt(message, {\n type: \"confirm\",\n cancel: \"reject\",\n ...options,\n });\n}\n\nasync function input(\n message: string,\n options?: OmitTypeWithRequired<{ default?: string; placeholder?: string }>,\n) {\n const result = await consola.prompt(message, {\n type: \"text\",\n cancel: \"reject\",\n ...options,\n });\n if (options?.required && !result) return input(message, options);\n return result;\n}\n\nfunction makeFileTree(\n fileTree: Record<\n string,\n string | Record<string, string | Record<string, string>>\n >,\n base: string,\n) {\n for (const [name, content] of Object.entries(fileTree)) {\n if (typeof content === \"object\" && content !== null) {\n const subPath = `${base}/${name}`;\n if (!fs.existsSync(subPath)) {\n fs.mkdirSync(subPath, { recursive: true });\n }\n for (const [subName, subContent] of Object.entries(content)) {\n if (typeof subContent === \"object\") {\n makeFileTree(\n subContent as typeof fileTree,\n path.join(subPath, subName),\n );\n } else {\n fs.writeFileSync(`${subPath}/${subName}`, subContent);\n }\n }\n } else {\n const filePath = `${base}/${name}`;\n const dirname = path.dirname(filePath);\n if (!fs.existsSync(dirname)) {\n fs.mkdirSync(dirname, { recursive: true });\n }\n fs.writeFileSync(filePath, content);\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -589,8 +589,10 @@ async function start(options = {}) {
|
|
|
589
589
|
const requiredServices = plugin_manager_default.collectRequiredServices();
|
|
590
590
|
const missingServices = await service_manager_default.checkMissingServices(requiredServices);
|
|
591
591
|
if (missingServices.length > 0) logger$1.warn(`发现缺失服务: ${missingServices.join(", ")}`);
|
|
592
|
-
const
|
|
593
|
-
|
|
592
|
+
const userSpecifiedPlugins = miokuConfig.plugins !== void 0;
|
|
593
|
+
if (!userSpecifiedPlugins) {
|
|
594
|
+
for (const name of linkedPluginNames) if (!botConfig.plugins.includes(name)) botConfig.plugins.push(name);
|
|
595
|
+
}
|
|
594
596
|
await startMioki({ cwd });
|
|
595
597
|
}
|
|
596
598
|
const version = "1.0.0";
|