@syedar/seedar-cli 1.1.2 → 1.2.0-test.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +26 -3
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +20 -522
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +2 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +18 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/help.d.ts +2 -0
  10. package/dist/commands/help.d.ts.map +1 -0
  11. package/dist/commands/help.js +17 -0
  12. package/dist/commands/help.js.map +1 -0
  13. package/dist/commands/install.d.ts +3 -0
  14. package/dist/commands/install.d.ts.map +1 -0
  15. package/dist/commands/install.js +35 -0
  16. package/dist/commands/install.js.map +1 -0
  17. package/dist/commands/lifecycle.d.ts +4 -0
  18. package/dist/commands/lifecycle.d.ts.map +1 -0
  19. package/dist/commands/lifecycle.js +63 -0
  20. package/dist/commands/lifecycle.js.map +1 -0
  21. package/dist/commands/logs.d.ts +3 -0
  22. package/dist/commands/logs.d.ts.map +1 -0
  23. package/dist/commands/logs.js +20 -0
  24. package/dist/commands/logs.js.map +1 -0
  25. package/dist/commands/status.d.ts +4 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +230 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/commands/uninstall.d.ts +5 -0
  30. package/dist/commands/uninstall.d.ts.map +1 -0
  31. package/dist/commands/uninstall.js +163 -0
  32. package/dist/commands/uninstall.js.map +1 -0
  33. package/dist/docker/compose.d.ts +6 -0
  34. package/dist/docker/compose.d.ts.map +1 -0
  35. package/dist/docker/compose.js +55 -0
  36. package/dist/docker/compose.js.map +1 -0
  37. package/dist/docker/health.d.ts +3 -0
  38. package/dist/docker/health.d.ts.map +1 -0
  39. package/dist/docker/health.js +38 -0
  40. package/dist/docker/health.js.map +1 -0
  41. package/dist/docker/ports.d.ts +3 -0
  42. package/dist/docker/ports.d.ts.map +1 -0
  43. package/dist/docker/ports.js +27 -0
  44. package/dist/docker/ports.js.map +1 -0
  45. package/dist/docker/prerequisites.d.ts +2 -0
  46. package/dist/docker/prerequisites.d.ts.map +1 -0
  47. package/dist/docker/prerequisites.js +12 -0
  48. package/dist/docker/prerequisites.js.map +1 -0
  49. package/dist/{process.d.ts → docker/process.d.ts} +2 -1
  50. package/dist/docker/process.d.ts.map +1 -0
  51. package/dist/{process.js → docker/process.js} +11 -0
  52. package/dist/docker/process.js.map +1 -0
  53. package/dist/index.js +0 -0
  54. package/dist/install/config.d.ts +7 -0
  55. package/dist/install/config.d.ts.map +1 -0
  56. package/dist/install/config.js +81 -0
  57. package/dist/install/config.js.map +1 -0
  58. package/dist/install/flow.d.ts +9 -0
  59. package/dist/install/flow.d.ts.map +1 -0
  60. package/dist/install/flow.js +103 -0
  61. package/dist/install/flow.js.map +1 -0
  62. package/dist/install/output.d.ts +7 -0
  63. package/dist/install/output.d.ts.map +1 -0
  64. package/dist/install/output.js +22 -0
  65. package/dist/install/output.js.map +1 -0
  66. package/dist/install/ports.d.ts +8 -0
  67. package/dist/install/ports.d.ts.map +1 -0
  68. package/dist/install/ports.js +38 -0
  69. package/dist/install/ports.js.map +1 -0
  70. package/dist/install/prompts.d.ts +4 -0
  71. package/dist/install/prompts.d.ts.map +1 -0
  72. package/dist/install/prompts.js +155 -0
  73. package/dist/install/prompts.js.map +1 -0
  74. package/dist/runtime/guards.d.ts +3 -0
  75. package/dist/runtime/guards.d.ts.map +1 -0
  76. package/dist/runtime/guards.js +7 -0
  77. package/dist/runtime/guards.js.map +1 -0
  78. package/dist/{runtime.d.ts → runtime/index.d.ts} +2 -2
  79. package/dist/runtime/index.d.ts.map +1 -0
  80. package/dist/{runtime.js → runtime/index.js} +2 -2
  81. package/dist/runtime/index.js.map +1 -0
  82. package/dist/shared/args.d.ts +8 -0
  83. package/dist/shared/args.d.ts.map +1 -0
  84. package/dist/shared/args.js +40 -0
  85. package/dist/shared/args.js.map +1 -0
  86. package/dist/shared/constants.d.ts.map +1 -0
  87. package/dist/shared/constants.js.map +1 -0
  88. package/dist/shared/logging.d.ts +3 -0
  89. package/dist/shared/logging.d.ts.map +1 -0
  90. package/dist/shared/logging.js +8 -0
  91. package/dist/shared/logging.js.map +1 -0
  92. package/dist/shared/package.d.ts +2 -0
  93. package/dist/shared/package.d.ts.map +1 -0
  94. package/dist/shared/package.js +2 -0
  95. package/dist/shared/package.js.map +1 -0
  96. package/dist/shared/time.d.ts +2 -0
  97. package/dist/shared/time.d.ts.map +1 -0
  98. package/dist/shared/time.js +4 -0
  99. package/dist/shared/time.js.map +1 -0
  100. package/dist/{types.d.ts → shared/types.d.ts} +6 -0
  101. package/dist/shared/types.d.ts.map +1 -0
  102. package/dist/shared/types.js.map +1 -0
  103. package/dist/shared/ui.d.ts +7 -0
  104. package/dist/shared/ui.d.ts.map +1 -0
  105. package/dist/shared/ui.js +25 -0
  106. package/dist/shared/ui.js.map +1 -0
  107. package/package.json +11 -6
  108. package/dist/constants.d.ts.map +0 -1
  109. package/dist/constants.js.map +0 -1
  110. package/dist/process.d.ts.map +0 -1
  111. package/dist/process.js.map +0 -1
  112. package/dist/prompts.d.ts +0 -4
  113. package/dist/prompts.d.ts.map +0 -1
  114. package/dist/prompts.js +0 -115
  115. package/dist/prompts.js.map +0 -1
  116. package/dist/runtime.d.ts.map +0 -1
  117. package/dist/runtime.js.map +0 -1
  118. package/dist/types.d.ts.map +0 -1
  119. package/dist/types.js.map +0 -1
  120. /package/dist/{constants.d.ts → shared/constants.d.ts} +0 -0
  121. /package/dist/{constants.js → shared/constants.js} +0 -0
  122. /package/dist/{types.js → shared/types.js} +0 -0
package/README.md CHANGED
@@ -1,16 +1,39 @@
1
1
  # @syedar/seedar-cli
2
2
 
3
- Seedar 的安装与运维命令行工具。
3
+ Seedar ????????????
4
4
 
5
- ## 使用
5
+ ## ??
6
6
 
7
7
  ```bash
8
8
  npx @syedar/seedar-cli@latest install
9
9
  ```
10
10
 
11
- 或全局安装:
11
+ ??????
12
12
 
13
13
  ```bash
14
14
  npm install -g @syedar/seedar-cli
15
15
  seedar status
16
16
  ```
17
+
18
+ ## ????
19
+
20
+ ```bash
21
+ # ????
22
+ seedar install
23
+
24
+ # ?? / ??????
25
+ seedar start
26
+ seedar stop
27
+
28
+ # ???????
29
+ seedar status
30
+ seedar logs --follow
31
+
32
+ # ??????????? / ??????? data
33
+ seedar uninstall --remove-data --force
34
+
35
+ # ?????????????? CLI
36
+ seedar uninstall --all --force
37
+ # ?
38
+ seedar remove --force
39
+ ```
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA0oBA,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B3D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AASA,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C3D"}
package/dist/cli.js CHANGED
@@ -1,537 +1,35 @@
1
- import { access, appendFile, mkdir, rm } from "node:fs/promises";
2
- import net from "node:net";
3
- import path from "node:path";
4
- import { DEFAULT_SERVER_IMAGE, DEFAULT_VERSION, DEFAULT_WEB_IMAGE, MIN_NODE_MAJOR, REQUIRED_ENV_KEYS, VALID_SERVICES, } from "./constants.js";
5
- import { runCommand, runCommandOrThrow, runDockerCompose, runDockerComposeOrThrow } from "./process.js";
6
- import { collectInstallConfig, ensurePortsAvailable } from "./prompts.js";
7
- import { backupRuntime, getRuntimeLayout, hasRuntimeConfig, readEnvConfig, readInstallState, readInstalledVersion, restoreRuntimeFromBackup, writeInstalledVersion, writeInstallState, writeRuntimeFiles, } from "./runtime.js";
8
- async function isPortAvailable(port) {
9
- return await new Promise((resolve) => {
10
- const server = net.createServer();
11
- server.unref();
12
- server.on("error", () => resolve(false));
13
- server.listen(port, "0.0.0.0", () => {
14
- server.close(() => resolve(true));
15
- });
16
- });
17
- }
18
- function parseArgs(rawArgs) {
19
- const flags = {
20
- yes: false,
21
- force: false,
22
- follow: false,
23
- removeData: false,
24
- };
25
- const positional = [];
26
- for (const arg of rawArgs) {
27
- if (arg === "--yes" || arg === "-y") {
28
- flags.yes = true;
29
- continue;
30
- }
31
- if (arg === "--force") {
32
- flags.force = true;
33
- continue;
34
- }
35
- if (arg === "--follow" || arg === "-f") {
36
- flags.follow = true;
37
- continue;
38
- }
39
- if (arg === "--remove-data") {
40
- flags.removeData = true;
41
- continue;
42
- }
43
- positional.push(arg);
44
- }
45
- const [command = "help", ...rest] = positional;
46
- return {
47
- command,
48
- positional: rest,
49
- flags,
50
- };
51
- }
52
- async function writeCliLog(layout, message) {
53
- const line = `[${new Date().toISOString()}] ${message}\n`;
54
- await mkdir(layout.logsDir, { recursive: true });
55
- await appendFile(path.join(layout.logsDir, "cli.log"), line, "utf8");
56
- }
57
- async function requireRuntimeConfig(layout) {
58
- if (!(await hasRuntimeConfig(layout))) {
59
- throw new Error(`未检测到运行时配置,请先执行 seedar install。安装目录: ${layout.installRoot}`);
60
- }
61
- }
62
- async function ensurePrerequisites() {
63
- const major = Number(process.versions.node.split(".")[0]);
64
- if (major < MIN_NODE_MAJOR) {
65
- throw new Error(`Node.js 版本过低,当前 ${process.version},需要 >= ${MIN_NODE_MAJOR}`);
66
- }
67
- await runCommandOrThrow("docker", ["--version"]);
68
- await runCommandOrThrow("docker", ["compose", "version"]);
69
- await runCommandOrThrow("docker", ["info"]);
70
- }
71
- async function wait(ms) {
72
- await new Promise((resolve) => setTimeout(resolve, ms));
73
- }
74
- async function getServiceContainerId(layout, service) {
75
- const result = await runDockerCompose(layout, ["ps", "-q", service]);
76
- const id = result.stdout.trim();
77
- return id || null;
78
- }
79
- async function waitForServiceHealthy(layout, service, timeoutMs = 120_000) {
80
- const startedAt = Date.now();
81
- while (Date.now() - startedAt < timeoutMs) {
82
- const containerId = await getServiceContainerId(layout, service);
83
- if (!containerId) {
84
- await wait(2_000);
85
- continue;
86
- }
87
- const inspectResult = await runCommand("docker", [
88
- "inspect",
89
- "--format",
90
- "{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}",
91
- containerId,
92
- ]);
93
- const state = inspectResult.stdout.trim();
94
- if (state === "healthy" || state === "running") {
95
- return;
96
- }
97
- if (state === "unhealthy" || state === "exited") {
98
- throw new Error(`${service} 服务状态异常: ${state}`);
99
- }
100
- await wait(3_000);
101
- }
102
- throw new Error(`等待 ${service} 服务健康检查超时`);
103
- }
104
- function printInstallSummary(layout, env) {
105
- console.log("Seedar 安装完成。");
106
- console.log(`安装目录: ${layout.installRoot}`);
107
- console.log(`Web: http://localhost:${env.WEB_PORT}`);
108
- console.log(`Server: http://localhost:${env.SERVER_PORT}`);
109
- console.log(`MySQL: localhost:${env.MYSQL_PORT}`);
110
- console.log(`版本: ${env.SEEDAR_VERSION}`);
111
- }
112
- async function runInstallFlow(layout, env) {
113
- await writeCliLog(layout, `开始安装,目标版本 ${env.SEEDAR_VERSION}`);
114
- await runDockerComposeOrThrow(layout, ["pull", "mysql", "server", "web"], {
115
- stdio: "inherit",
116
- });
117
- await runDockerComposeOrThrow(layout, ["up", "-d", "mysql"], {
118
- stdio: "inherit",
119
- });
120
- await waitForServiceHealthy(layout, "mysql");
121
- await runDockerComposeOrThrow(layout, ["run", "--rm", "migrate"], {
122
- stdio: "inherit",
123
- });
124
- await runDockerComposeOrThrow(layout, ["up", "-d", "server", "web"], {
125
- stdio: "inherit",
126
- });
127
- await writeCliLog(layout, `安装完成,版本 ${env.SEEDAR_VERSION}`);
128
- }
129
- async function parseComposePsOutput(layout) {
130
- const result = await runDockerCompose(layout, ["ps", "--all", "--format", "json"]);
131
- const raw = result.stdout.trim();
132
- if (!raw) {
133
- return [];
134
- }
135
- try {
136
- const parsed = JSON.parse(raw);
137
- return Array.isArray(parsed) ? parsed : [];
138
- }
139
- catch {
140
- return raw
141
- .split(/\r?\n/)
142
- .filter(Boolean)
143
- .map((line) => JSON.parse(line));
144
- }
145
- }
146
- function getPublishersFromServices(services) {
147
- const ports = new Set();
148
- for (const service of services) {
149
- const publishers = service.Publishers;
150
- if (!Array.isArray(publishers)) {
151
- continue;
152
- }
153
- for (const publisher of publishers) {
154
- if (publisher &&
155
- typeof publisher === "object" &&
156
- "PublishedPort" in publisher &&
157
- typeof publisher.PublishedPort === "number") {
158
- ports.add(String(publisher.PublishedPort));
159
- }
160
- }
161
- }
162
- return ports;
163
- }
164
- async function getDiskFreeBytes(targetPath) {
165
- if (process.platform === "win32") {
166
- const root = path.parse(path.resolve(targetPath)).root.replace(/\\$/, "");
167
- const result = await runCommand("powershell", [
168
- "-NoProfile",
169
- "-Command",
170
- `(Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='${root}'").FreeSpace`,
171
- ], { shell: false });
172
- const value = Number(result.stdout.trim());
173
- return Number.isFinite(value) ? value : null;
174
- }
175
- const result = await runCommand("df", ["-Pk", targetPath]);
176
- const lines = result.stdout.trim().split(/\r?\n/);
177
- if (lines.length < 2) {
178
- return null;
179
- }
180
- const parts = lines[1].trim().split(/\s+/);
181
- const availableKb = Number(parts[3]);
182
- if (!Number.isFinite(availableKb)) {
183
- return null;
184
- }
185
- return availableKb * 1024;
186
- }
187
- async function collectDoctorChecks(layout) {
188
- const checks = [];
189
- const nodeMajor = Number(process.versions.node.split(".")[0]);
190
- checks.push({
191
- code: "D001",
192
- status: nodeMajor >= MIN_NODE_MAJOR ? "ok" : "fail",
193
- title: "Node.js 版本",
194
- detail: nodeMajor >= MIN_NODE_MAJOR
195
- ? `当前 ${process.version}`
196
- : `当前 ${process.version},需要 >= ${MIN_NODE_MAJOR}`,
197
- });
198
- const dockerVersion = await runCommand("docker", ["--version"]);
199
- checks.push({
200
- code: "D002",
201
- status: dockerVersion.code === 0 ? "ok" : "fail",
202
- title: "Docker CLI",
203
- detail: dockerVersion.code === 0
204
- ? dockerVersion.stdout.trim()
205
- : dockerVersion.stderr.trim() || "无法执行 docker --version",
206
- });
207
- const dockerInfo = await runCommand("docker", ["info"]);
208
- checks.push({
209
- code: "D003",
210
- status: dockerInfo.code === 0 ? "ok" : "fail",
211
- title: "Docker Daemon",
212
- detail: dockerInfo.code === 0
213
- ? "Docker daemon 可用"
214
- : dockerInfo.stderr.trim() || "无法连接 Docker daemon",
215
- });
216
- const composeVersion = await runCommand("docker", ["compose", "version"]);
217
- checks.push({
218
- code: "D004",
219
- status: composeVersion.code === 0 ? "ok" : "fail",
220
- title: "Docker Compose",
221
- detail: composeVersion.code === 0
222
- ? composeVersion.stdout.trim()
223
- : composeVersion.stderr.trim() || "无法执行 docker compose version",
224
- });
225
- const installRootParent = path.dirname(layout.installRoot);
226
- try {
227
- await access(installRootParent);
228
- checks.push({
229
- code: "D005",
230
- status: "ok",
231
- title: "安装目录访问",
232
- detail: `可访问 ${installRootParent}`,
233
- });
234
- }
235
- catch (error) {
236
- checks.push({
237
- code: "D005",
238
- status: "fail",
239
- title: "安装目录访问",
240
- detail: error instanceof Error ? error.message : "无法访问安装目录父级路径",
241
- });
242
- }
243
- const diskFree = await getDiskFreeBytes(layout.installRoot);
244
- if (diskFree === null) {
245
- checks.push({
246
- code: "D006",
247
- status: "warn",
248
- title: "磁盘剩余空间",
249
- detail: "无法识别磁盘剩余空间",
250
- });
251
- }
252
- else {
253
- const diskFreeGb = (diskFree / 1024 / 1024 / 1024).toFixed(2);
254
- checks.push({
255
- code: "D006",
256
- status: diskFree >= 2 * 1024 * 1024 * 1024 ? "ok" : "warn",
257
- title: "磁盘剩余空间",
258
- detail: `${diskFreeGb} GB`,
259
- });
260
- }
261
- const hasConfig = await hasRuntimeConfig(layout);
262
- if (!hasConfig) {
263
- const defaultPorts = [
264
- ["D009", "3306"],
265
- ["D010", "8090"],
266
- ["D011", "8080"],
267
- ];
268
- for (const [code, port] of defaultPorts) {
269
- const available = await isPortAvailable(Number(port));
270
- checks.push({
271
- code,
272
- status: available ? "ok" : "warn",
273
- title: `默认端口 ${port}`,
274
- detail: available ? "端口当前可用" : "端口已被占用,安装时需要改配",
275
- });
276
- }
277
- return checks;
278
- }
279
- let envConfig = null;
280
- try {
281
- envConfig = await readEnvConfig(layout);
282
- checks.push({
283
- code: "D007",
284
- status: "ok",
285
- title: "运行时配置",
286
- detail: `已检测到 ${REQUIRED_ENV_KEYS.length} 个必填字段`,
287
- });
288
- }
289
- catch (error) {
290
- checks.push({
291
- code: "D007",
292
- status: "fail",
293
- title: "运行时配置",
294
- detail: error instanceof Error ? error.message : "运行时配置损坏",
295
- });
296
- }
297
- if (!envConfig) {
298
- return checks;
299
- }
300
- const composeConfig = await runDockerCompose(layout, ["config", "-q"]);
301
- checks.push({
302
- code: "D008",
303
- status: composeConfig.code === 0 ? "ok" : "fail",
304
- title: "Compose 配置",
305
- detail: composeConfig.code === 0
306
- ? "docker compose config 校验通过"
307
- : composeConfig.stderr.trim() || "docker compose config 校验失败",
308
- });
309
- const services = await parseComposePsOutput(layout);
310
- const publishedPorts = getPublishersFromServices(services);
311
- const envPorts = [envConfig.MYSQL_PORT, envConfig.SERVER_PORT, envConfig.WEB_PORT];
312
- for (const [index, port] of envPorts.entries()) {
313
- const inUseByCurrentProject = publishedPorts.has(port);
314
- const available = await isPortAvailable(Number(port));
315
- const status = inUseByCurrentProject || available ? "ok" : "warn";
316
- checks.push({
317
- code: `D01${index}`,
318
- status,
319
- title: `端口 ${port}`,
320
- detail: inUseByCurrentProject
321
- ? "端口已由当前 Seedar 安装占用"
322
- : available
323
- ? "端口配置可用"
324
- : "端口已被其他进程占用",
325
- });
326
- }
327
- const serverImage = `${DEFAULT_SERVER_IMAGE}:${envConfig.SEEDAR_VERSION}`;
328
- const webImage = `${DEFAULT_WEB_IMAGE}:${envConfig.SEEDAR_VERSION}`;
329
- for (const [index, image] of [serverImage, webImage].entries()) {
330
- const manifest = await runCommand("docker", ["manifest", "inspect", image]);
331
- checks.push({
332
- code: `D02${index}`,
333
- status: manifest.code === 0 ? "ok" : "fail",
334
- title: `镜像可访问性 ${image}`,
335
- detail: manifest.code === 0
336
- ? "镜像清单可访问"
337
- : manifest.stderr.trim() || "无法访问镜像清单,请检查 DockerHub 凭证或镜像发布状态",
338
- });
339
- }
340
- return checks;
341
- }
342
- async function installCommand(versionArg, flags) {
343
- const layout = getRuntimeLayout();
344
- await ensurePrerequisites();
345
- const state = await readInstallState(layout);
346
- const hasConfig = await hasRuntimeConfig(layout);
347
- if (state === "installed" && hasConfig) {
348
- throw new Error(`检测到现有安装目录 ${layout.installRoot}。如需升级请使用 seedar update。`);
349
- }
350
- let env;
351
- if (state === "uninstalled" && hasConfig) {
352
- env = await readEnvConfig(layout);
353
- env.SEEDAR_VERSION = versionArg ?? env.SEEDAR_VERSION;
354
- await ensurePortsAvailable(env);
355
- await writeCliLog(layout, `复用已有配置重新安装,目标版本 ${env.SEEDAR_VERSION}`);
356
- }
357
- else {
358
- env = await collectInstallConfig(layout, versionArg, flags);
359
- await ensurePortsAvailable(env);
360
- }
361
- await writeRuntimeFiles(layout, env);
362
- await runInstallFlow(layout, env);
363
- await writeInstalledVersion(layout, env.SEEDAR_VERSION);
364
- await writeInstallState(layout, "installed");
365
- printInstallSummary(layout, env);
366
- }
367
- async function updateCommand(versionArg) {
368
- const layout = getRuntimeLayout();
369
- await ensurePrerequisites();
370
- await requireRuntimeConfig(layout);
371
- const currentEnv = await readEnvConfig(layout);
372
- const currentVersion = await readInstalledVersion(layout);
373
- const nextVersion = versionArg ?? DEFAULT_VERSION;
374
- const backupDir = await backupRuntime(layout);
375
- const nextEnv = {
376
- ...currentEnv,
377
- SEEDAR_VERSION: nextVersion,
378
- };
379
- await writeRuntimeFiles(layout, nextEnv);
380
- try {
381
- await writeCliLog(layout, `开始升级,当前版本 ${currentVersion ?? "unknown"} -> ${nextVersion}`);
382
- await runDockerComposeOrThrow(layout, ["pull", "mysql", "server", "web"], {
383
- stdio: "inherit",
384
- });
385
- await runDockerComposeOrThrow(layout, ["up", "-d", "mysql"], {
386
- stdio: "inherit",
387
- });
388
- await waitForServiceHealthy(layout, "mysql");
389
- await runDockerComposeOrThrow(layout, ["run", "--rm", "migrate"], {
390
- stdio: "inherit",
391
- });
392
- await runDockerComposeOrThrow(layout, ["up", "-d", "server", "web"], {
393
- stdio: "inherit",
394
- });
395
- await writeInstalledVersion(layout, nextVersion);
396
- await writeInstallState(layout, "installed");
397
- await writeCliLog(layout, `升级完成,版本 ${nextVersion}`);
398
- console.log(`Seedar 已升级到 ${nextVersion}`);
399
- console.log(`备份目录: ${backupDir}`);
400
- }
401
- catch (error) {
402
- await restoreRuntimeFromBackup(layout, backupDir);
403
- await writeCliLog(layout, `升级失败,已恢复运行时配置。备份目录 ${backupDir}`);
404
- throw new Error(`升级失败,已恢复运行时配置。备份目录: ${backupDir}\n${error instanceof Error ? error.message : "未知错误"}`);
405
- }
406
- }
407
- async function uninstallCommand(flags) {
408
- const layout = getRuntimeLayout();
409
- await ensurePrerequisites();
410
- await requireRuntimeConfig(layout);
411
- await writeCliLog(layout, "开始卸载");
412
- await runDockerComposeOrThrow(layout, ["down", "--remove-orphans"], {
413
- stdio: "inherit",
414
- });
415
- if (flags.removeData) {
416
- if (!flags.force && process.stdin.isTTY) {
417
- console.log("检测到 --remove-data,将删除本地数据目录。若需跳过确认,请附带 --force。");
418
- throw new Error("请确认后重新执行: seedar uninstall --remove-data --force");
419
- }
420
- const resolvedDataPath = path.resolve(layout.dataDir);
421
- const installRoot = path.resolve(layout.installRoot);
422
- if (!resolvedDataPath.startsWith(installRoot)) {
423
- throw new Error(`拒绝删除 installRoot 之外的路径: ${resolvedDataPath}`);
424
- }
425
- await rm(layout.dataDir, { recursive: true, force: true });
426
- await writeCliLog(layout, `已删除数据目录 ${layout.dataDir}`);
427
- }
428
- await writeInstallState(layout, "uninstalled");
429
- await writeCliLog(layout, "卸载完成");
430
- console.log("Seedar 已卸载。");
431
- console.log(`配置保留在: ${layout.runtimeDir}`);
432
- console.log(`备份保留在: ${layout.backupsDir}`);
433
- if (!flags.removeData) {
434
- console.log(`数据保留在: ${layout.dataDir}`);
435
- }
436
- }
437
- async function statusCommand() {
438
- const layout = getRuntimeLayout();
439
- const hasConfig = await hasRuntimeConfig(layout);
440
- if (!hasConfig) {
441
- console.log(`未检测到 Seedar 安装。预期目录: ${layout.installRoot}`);
442
- return;
443
- }
444
- const env = await readEnvConfig(layout);
445
- const state = await readInstallState(layout);
446
- const version = await readInstalledVersion(layout);
447
- const services = await parseComposePsOutput(layout);
448
- console.log(`安装目录: ${layout.installRoot}`);
449
- console.log(`状态: ${state}`);
450
- console.log(`目标版本: ${version ?? env.SEEDAR_VERSION}`);
451
- console.log(`Web: http://localhost:${env.WEB_PORT}`);
452
- console.log(`Server: http://localhost:${env.SERVER_PORT}`);
453
- console.log(`MySQL: localhost:${env.MYSQL_PORT}`);
454
- if (services.length === 0) {
455
- console.log("当前没有运行中的容器。");
456
- return;
457
- }
458
- console.log("");
459
- console.log("容器状态:");
460
- for (const service of services) {
461
- const serviceName = String(service.Service ?? service.Name ?? "unknown");
462
- const status = String(service.State ?? "unknown");
463
- const health = service.Health ? `, health=${String(service.Health)}` : "";
464
- const publishers = Array.isArray(service.Publishers)
465
- ? service.Publishers.map((item) => {
466
- if (item &&
467
- typeof item === "object" &&
468
- "PublishedPort" in item &&
469
- "TargetPort" in item) {
470
- return `${String(item.PublishedPort)}->${String(item.TargetPort)}`;
471
- }
472
- return null;
473
- })
474
- .filter(Boolean)
475
- .join(", ")
476
- : "";
477
- const ports = publishers ? `, ports=${publishers}` : "";
478
- console.log(`- ${serviceName}: ${status}${health}${ports}`);
479
- }
480
- }
481
- async function logsCommand(serviceArg, flags) {
482
- const layout = getRuntimeLayout();
483
- await requireRuntimeConfig(layout);
484
- if (serviceArg && !VALID_SERVICES.includes(serviceArg)) {
485
- throw new Error(`未知服务 ${serviceArg},可选值: ${VALID_SERVICES.join(", ")}`);
486
- }
487
- const args = ["logs", "--tail", "200"];
488
- if (flags.follow) {
489
- args.push("--follow");
490
- }
491
- if (serviceArg) {
492
- args.push(serviceArg);
493
- }
494
- await runDockerComposeOrThrow(layout, args, { stdio: "inherit" });
495
- }
496
- async function doctorCommand() {
497
- const layout = getRuntimeLayout();
498
- const checks = await collectDoctorChecks(layout);
499
- let failed = false;
500
- for (const check of checks) {
501
- const prefix = check.status === "ok" ? "OK" : check.status === "warn" ? "WARN" : "FAIL";
502
- console.log(`[${prefix} ${check.code}] ${check.title}: ${check.detail}`);
503
- if (check.status === "fail") {
504
- failed = true;
505
- }
506
- }
507
- if (failed) {
508
- process.exitCode = 1;
509
- }
510
- }
511
- function printHelp() {
512
- console.log(`Seedar CLI
513
-
514
- 用法:
515
- seedar install [version]
516
- seedar update [version]
517
- seedar uninstall [--remove-data] [--force]
518
- seedar status
519
- seedar logs [mysql|server|web|migrate] [--follow]
520
- seedar doctor
521
- `);
522
- }
1
+ import { parseArgs } from "./shared/args.js";
2
+ import { doctorCommand } from "./commands/doctor.js";
3
+ import { printHelp } from "./commands/help.js";
4
+ import { installCommand } from "./commands/install.js";
5
+ import { startCommand, stopCommand, updateCommand } from "./commands/lifecycle.js";
6
+ import { logsCommand } from "./commands/logs.js";
7
+ import { purgeCommand, removeAllCommand, uninstallCommand } from "./commands/uninstall.js";
8
+ import { statusCommand } from "./commands/status.js";
523
9
  export async function main(rawArgs) {
524
10
  const parsed = parseArgs(rawArgs);
525
11
  switch (parsed.command) {
526
12
  case "install":
527
13
  await installCommand(parsed.positional[0], parsed.flags);
528
14
  return;
15
+ case "start":
16
+ await startCommand();
17
+ return;
18
+ case "stop":
19
+ await stopCommand();
20
+ return;
529
21
  case "update":
530
22
  await updateCommand(parsed.positional[0]);
531
23
  return;
532
24
  case "uninstall":
533
25
  await uninstallCommand(parsed.flags);
534
26
  return;
27
+ case "remove":
28
+ await removeAllCommand(parsed.flags);
29
+ return;
30
+ case "purge":
31
+ await purgeCommand(parsed.flags);
32
+ return;
535
33
  case "status":
536
34
  await statusCommand();
537
35
  return;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;QACT,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACT,KAAK,MAAM;YACT,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,KAAK,WAAW;YACd,MAAM,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO;QACT,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,EAAE,CAAC;YACtB,OAAO;QACT,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACtD,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,EAAE,CAAC;YACtB,OAAO;QACT,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,SAAS,EAAE,CAAC;YACZ,OAAO;QACT;YACE,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function doctorCommand(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBnD"}
@@ -0,0 +1,18 @@
1
+ import { collectDoctorChecks } from "./status.js";
2
+ import { getRuntimeLayout } from "../runtime/index.js";
3
+ export async function doctorCommand() {
4
+ const layout = getRuntimeLayout();
5
+ const checks = await collectDoctorChecks(layout);
6
+ let failed = false;
7
+ for (const check of checks) {
8
+ const prefix = check.status === "ok" ? "OK" : check.status === "warn" ? "WARN" : "FAIL";
9
+ console.log(`[${prefix} ${check.code}] ${check.title}: ${check.detail}`);
10
+ if (check.status === "fail") {
11
+ failed = true;
12
+ }
13
+ }
14
+ if (failed) {
15
+ process.exitCode = 1;
16
+ }
17
+ }
18
+ //# sourceMappingURL=doctor.js.map