@archznn/xavva 3.1.2 → 3.2.0

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 (80) hide show
  1. package/README.md +221 -12
  2. package/package.json +3 -2
  3. package/src/commands/AuditCommand.ts +12 -10
  4. package/src/commands/BuildCommand.ts +9 -7
  5. package/src/commands/ChangelogCommand.ts +5 -5
  6. package/src/commands/CleanCommand.ts +242 -0
  7. package/src/commands/CompletionCommand.ts +7 -7
  8. package/src/commands/DbCommand.ts +43 -14
  9. package/src/commands/DeployCommand.ts +252 -229
  10. package/src/commands/DepsCommand.ts +174 -174
  11. package/src/commands/DockerCommand.ts +35 -4
  12. package/src/commands/DoctorCommand.ts +252 -239
  13. package/src/commands/EncodingCommand.ts +26 -19
  14. package/src/commands/HealthCommand.ts +7 -7
  15. package/src/commands/HelpCommand.ts +34 -14
  16. package/src/commands/HistoryCommand.ts +5 -5
  17. package/src/commands/HttpCommand.ts +27 -1
  18. package/src/commands/IdeCommand.ts +313 -0
  19. package/src/commands/InitCommand.ts +26 -25
  20. package/src/commands/LogsCommand.ts +8 -6
  21. package/src/commands/ProfilesCommand.ts +6 -6
  22. package/src/commands/RedoCommand.ts +2 -2
  23. package/src/commands/RunCommand.ts +64 -24
  24. package/src/commands/StartCommand.ts +9 -7
  25. package/src/commands/TestCommand.ts +25 -1
  26. package/src/commands/TomcatCommand.ts +232 -88
  27. package/src/config/versions.ts +111 -9
  28. package/src/di/container.ts +239 -105
  29. package/src/errors/ErrorHandler.ts +23 -19
  30. package/src/errors/errorMessages.ts +235 -0
  31. package/src/index.ts +20 -6
  32. package/src/logging/FileLogger.ts +235 -0
  33. package/src/logging/Logger.ts +545 -0
  34. package/src/logging/OperationLogger.ts +296 -0
  35. package/src/logging/ProgressLogger.ts +187 -0
  36. package/src/logging/TableLogger.ts +246 -0
  37. package/src/logging/colors.ts +167 -0
  38. package/src/logging/constants.ts +176 -0
  39. package/src/logging/formatters.ts +337 -0
  40. package/src/logging/index.ts +93 -0
  41. package/src/logging/types.ts +64 -0
  42. package/src/plugins/PluginManager.ts +325 -0
  43. package/src/plugins/types.ts +82 -0
  44. package/src/services/AuditService.ts +5 -3
  45. package/src/services/BuildService.ts +15 -17
  46. package/src/services/DashboardService.ts +14 -3
  47. package/src/services/DbService.ts +35 -34
  48. package/src/services/DependencyAnalyzerService.ts +18 -18
  49. package/src/services/DependencyCacheService.ts +303 -0
  50. package/src/services/DeployWatcher.ts +127 -23
  51. package/src/services/DockerService.ts +3 -3
  52. package/src/services/EmbeddedTomcatService.ts +13 -12
  53. package/src/services/FileWatcher.ts +15 -7
  54. package/src/services/HttpService.ts +5 -5
  55. package/src/services/LogAnalyzer.ts +26 -22
  56. package/src/services/PerformanceProfiler.ts +267 -0
  57. package/src/services/ProjectService.ts +3 -0
  58. package/src/services/TestService.ts +3 -3
  59. package/src/services/TomcatService.ts +46 -25
  60. package/src/services/tomcat/TomcatBackupManager.ts +330 -0
  61. package/src/services/tomcat/TomcatChecksumVerifier.ts +211 -0
  62. package/src/services/tomcat/TomcatCompatibilityChecker.ts +298 -0
  63. package/src/services/tomcat/TomcatDownloadCache.ts +250 -0
  64. package/src/services/tomcat/TomcatDownloadService.ts +335 -0
  65. package/src/services/tomcat/TomcatInstallerService.ts +474 -0
  66. package/src/services/tomcat/TomcatMirrorManager.ts +181 -0
  67. package/src/services/tomcat/index.ts +36 -0
  68. package/src/services/tomcat/types.ts +120 -0
  69. package/src/types/args.ts +68 -1
  70. package/src/types/configSchema.ts +174 -0
  71. package/src/utils/ChangelogGenerator.ts +11 -11
  72. package/src/utils/LoggerLevel.ts +44 -20
  73. package/src/utils/ProgressBar.ts +87 -46
  74. package/src/utils/argsParser.ts +260 -0
  75. package/src/utils/config.ts +340 -189
  76. package/src/utils/constants.ts +87 -9
  77. package/src/utils/dryRun.ts +192 -0
  78. package/src/utils/processManager.ts +23 -7
  79. package/src/utils/security.ts +293 -0
  80. package/src/utils/ui.ts +299 -428
@@ -1,233 +1,246 @@
1
1
  import type { Command } from "./Command";
2
2
  import type { AppConfig, CLIArguments } from "../types/config";
3
- import { Logger } from "../utils/ui";
3
+ import { Logger } from "../logging";
4
4
  import fs from "fs";
5
5
  import path from "path";
6
6
  import os from "os";
7
7
  import {
8
- getCatalinaScript,
9
- getWhichCommand,
10
- getJbrDownloadUrl,
11
- getTarExtractCommand,
12
- getJavaPath,
13
- getJavaBinary,
14
- isWindows,
15
- isLinux,
16
- isMacOS,
8
+ getCatalinaScript,
9
+ getWhichCommand,
10
+ getJbrDownloadUrl,
11
+ getTarExtractCommand,
12
+ getJavaPath,
13
+ getJavaBinary,
14
+ isWindows,
15
+ isLinux,
16
+ isMacOS,
17
17
  } from "../utils/platform";
18
18
 
19
19
  export class DoctorCommand implements Command {
20
- async execute(config: AppConfig, values: CLIArguments = {}): Promise<void> {
21
- Logger.section("Xavva Doctor - Ambiente");
22
-
23
- this.check(
24
- "JAVA_HOME",
25
- !!process.env.JAVA_HOME,
26
- process.env.JAVA_HOME || "Não definido",
27
- );
28
-
29
- const jvmInfo = this.checkJVM();
30
- this.check(
31
- "JVM Type",
32
- jvmInfo.dcevm,
33
- jvmInfo.name +
34
- (jvmInfo.dcevm ? " (Advanced Hot Reload OK)" : " (Standard)"),
35
- );
36
-
37
- if (!jvmInfo.dcevm) {
38
- Logger.log(
39
- ` ${Logger.C.warning}💡 Dica: Sua JVM não suporta mudanças estruturais (novos métodos/campos).${Logger.C.reset}`,
40
- );
41
- if (values.fix) {
42
- await this.installDCEVM();
43
- } else {
44
- Logger.log(
45
- ` ${Logger.C.primary}Use 'xavva doctor --fix' para baixar uma JDK com DCEVM integrado.${Logger.C.reset}`,
46
- );
47
- }
48
- }
49
-
50
- const tomcatOk = fs.existsSync(config.tomcat.path);
51
- this.check("Tomcat Path", tomcatOk, config.tomcat.path);
52
-
53
- if (tomcatOk) {
54
- const binOk = fs.existsSync(
55
- path.join(config.tomcat.path, "bin", getCatalinaScript()),
56
- );
57
- this.check(
58
- "Tomcat Bin",
59
- binOk,
60
- binOk ? "OK" : `${getCatalinaScript()} não encontrado`,
61
- );
62
- }
63
-
64
- const mvnOk = this.checkBinary("mvn");
65
- this.check("Maven", mvnOk, mvnOk ? "Disponível" : "Não encontrado no PATH");
66
-
67
- const gradleOk = this.checkBinary("gradle") || this.checkBinary("gradlew");
68
- this.check(
69
- "Gradle",
70
- gradleOk,
71
- gradleOk ? "Disponível" : "Não encontrado no PATH",
72
- );
73
-
74
- const gitOk = this.checkBinary("git");
75
- this.check("Git", gitOk, gitOk ? "Disponível" : "Não encontrado no PATH");
76
-
77
- Logger.section("Xavva Doctor - Integridade de Arquivos");
78
- await this.checkJarIntegrity(values.fix, config);
79
- await this.checkBOM(values.fix);
80
-
81
- console.log("");
82
- }
83
-
84
- private async checkJarIntegrity(fix: boolean, config: AppConfig) {
85
- const searchPaths = [
86
- path.join(process.cwd(), "target"),
87
- path.join(process.cwd(), "build"),
88
- path.join(config.tomcat.path, "webapps")
89
- ].filter(p => fs.existsSync(p));
90
-
91
- const corruptedJars: string[] = [];
92
- const zipEndSignature = Buffer.from([0x50, 0x4b, 0x05, 0x06]);
93
-
94
- const scan = (dir: string) => {
95
- try {
96
- const list = fs.readdirSync(dir, { withFileTypes: true });
97
- for (const item of list) {
98
- const res = path.resolve(dir, item.name);
99
- if (item.isDirectory()) {
100
- if (item.name === "node_modules" || item.name === ".git") continue;
101
- scan(res);
102
- } else if (item.name.endsWith(".jar")) {
103
- try {
104
- const stats = fs.statSync(res);
105
- if (stats.size < 22) {
106
- corruptedJars.push(res);
107
- continue;
108
- }
109
-
110
- // os últimos 1024 bytes para encontrar a assinatura EOCD do ZIP
111
- const readSize = Math.min(stats.size, 1024);
112
- const buffer = Buffer.alloc(readSize);
113
- const fd = fs.openSync(res, "r");
114
- fs.readSync(fd, buffer, 0, readSize, stats.size - readSize);
115
- fs.closeSync(fd);
116
-
117
- if (!buffer.includes(zipEndSignature)) {
118
- corruptedJars.push(res);
119
- }
120
- } catch (e) {
121
- corruptedJars.push(res);
122
- }
123
- }
124
- }
125
- } catch (e) {}
126
- };
127
-
128
- for (const p of searchPaths) {
129
- scan(p);
130
- }
131
-
132
- if (corruptedJars.length > 0) {
133
- this.check(
134
- "Integridade JAR",
135
- false,
136
- `${corruptedJars.length} arquivos corrompidos detectados.`,
137
- );
138
- if (fix) {
139
- for (const file of corruptedJars) {
140
- try {
141
- fs.unlinkSync(file);
142
- console.log(` \x1b[32m✔\x1b[0m Removido: ${path.basename(file)}`);
143
- } catch (e) {}
144
- }
145
- Logger.success("JARs corrompidos removidos! Eles serão reconstruídos no próximo build.");
146
-
147
- // Limpar cache do Tomcat
148
- Logger.process("Limpando cache do Tomcat (work/temp)...");
149
- const tomcatWork = path.join(config.tomcat.path, "work");
150
- const tomcatTemp = path.join(config.tomcat.path, "temp");
151
- [tomcatWork, tomcatTemp].forEach(p => {
152
- try {
153
- if (fs.existsSync(p)) {
154
- fs.rmSync(p, { recursive: true, force: true });
155
- fs.mkdirSync(p);
156
- }
157
- } catch (e) {}
158
- });
159
- Logger.success("Cache do Tomcat limpo com sucesso.");
160
- } else {
161
- Logger.warn(
162
- "Use 'xavva doctor --fix' para remover os JARs corrompidos e limpar o cache.",
163
- );
164
- }
165
- } else {
166
- this.check("Integridade JAR", true, "Todos os arquivos JAR parecem íntegros.");
167
- }
168
- }
169
-
170
- private async checkBOM(fix: boolean) {
171
- const srcPath = path.join(process.cwd(), "src");
172
- if (!fs.existsSync(srcPath)) return;
173
-
174
- const filesWithBOM: string[] = [];
175
- const scan = (dir: string) => {
176
- const list = fs.readdirSync(dir, { withFileTypes: true });
177
- for (const item of list) {
178
- const res = path.resolve(dir, item.name);
179
- if (item.isDirectory()) {
180
- scan(res);
181
- } else if (item.name.endsWith(".java")) {
182
- const buffer = fs.readFileSync(res);
183
- if (buffer[0] === 0xef && buffer[1] === 0xbb && buffer[2] === 0xbf) {
184
- filesWithBOM.push(res);
185
- }
186
- }
187
- }
188
- };
189
-
190
- scan(srcPath);
191
-
192
- if (filesWithBOM.length > 0) {
193
- this.check(
194
- "Encoding BOM",
195
- false,
196
- `${filesWithBOM.length} arquivos com BOM (UTF-8 com assinatura)`,
197
- );
198
- if (fix) {
199
- for (const file of filesWithBOM) {
200
- const buffer = fs.readFileSync(file);
201
- const cleanBuffer = buffer.subarray(3);
202
- fs.writeFileSync(file, cleanBuffer);
203
- console.log(
204
- ` \x1b[32m✔\x1b[0m Corrigido: ${path.basename(file)}`,
205
- );
206
- }
207
- Logger.success("BOM removido de todos os arquivos!");
208
- } else {
209
- Logger.warn(
210
- "Use 'xavva doctor --fix' para remover o BOM automaticamente.",
211
- );
212
- }
213
- } else {
214
- this.check("Encoding BOM", true, "Nenhum arquivo com BOM detectado.");
215
- }
216
- }
217
-
218
- private check(label: string, ok: boolean, detail: string) {
219
- const icon = ok ? "\x1b[32m✔\x1b[0m" : "\x1b[31m✘\x1b[0m";
220
- console.log(` ${icon} ${label.padEnd(15)} ${detail}`);
221
- }
222
-
223
- private checkBinary(name: string): boolean {
224
- try {
225
- const proc = Bun.spawnSync(getWhichCommand(name));
226
- return proc.exitCode === 0;
227
- } catch {
228
- return false;
229
- }
230
- }
20
+ private logger = Logger.getInstance();
21
+
22
+ async execute(config: AppConfig, values: CLIArguments = {}): Promise<void> {
23
+ this.logger.section("Xavva Doctor - Diagnóstico");
24
+
25
+ // Se modo fix, mostra aviso
26
+ if (values.fix) {
27
+ this.logger.warn("Modo --fix ativado - Problemas serão corrigidos automaticamente");
28
+ this.logger.newline();
29
+ }
30
+
31
+ const issues: Array<{ label: string; ok: boolean; detail: string; fixable?: boolean }> = [];
32
+
33
+ // Verifica JAVA_HOME
34
+ const javaHomeOk = !!process.env.JAVA_HOME;
35
+ issues.push({
36
+ label: "JAVA_HOME",
37
+ ok: javaHomeOk,
38
+ detail: process.env.JAVA_HOME || "Não definido",
39
+ fixable: true,
40
+ });
41
+
42
+ const jvmInfo = this.checkJVM();
43
+ this.check(
44
+ "JVM Type",
45
+ jvmInfo.dcevm,
46
+ jvmInfo.name +
47
+ (jvmInfo.dcevm ? " (Advanced Hot Reload OK)" : " (Standard)"),
48
+ );
49
+
50
+ if (!jvmInfo.dcevm) {
51
+ console.log(
52
+ ` 💡 Dica: Sua JVM não suporta mudanças estruturais (novos métodos/campos).`,
53
+ );
54
+ if (values.fix) {
55
+ await this.installDCEVM();
56
+ } else {
57
+ console.log(
58
+ ` Use 'xavva doctor --fix' para baixar uma JDK com DCEVM integrado.`,
59
+ );
60
+ }
61
+ }
62
+
63
+ const tomcatOk = fs.existsSync(config.tomcat.path);
64
+ this.check("Tomcat Path", tomcatOk, config.tomcat.path);
65
+
66
+ if (tomcatOk) {
67
+ const binOk = fs.existsSync(
68
+ path.join(config.tomcat.path, "bin", getCatalinaScript()),
69
+ );
70
+ this.check(
71
+ "Tomcat Bin",
72
+ binOk,
73
+ binOk ? "OK" : `${getCatalinaScript()} não encontrado`,
74
+ );
75
+ }
76
+
77
+ const mvnOk = this.checkBinary("mvn");
78
+ this.check("Maven", mvnOk, mvnOk ? "Disponível" : "Não encontrado no PATH");
79
+
80
+ const gradleOk = this.checkBinary("gradle") || this.checkBinary("gradlew");
81
+ this.check(
82
+ "Gradle",
83
+ gradleOk,
84
+ gradleOk ? "Disponível" : "Não encontrado no PATH",
85
+ );
86
+
87
+ const gitOk = this.checkBinary("git");
88
+ this.check("Git", gitOk, gitOk ? "Disponível" : "Não encontrado no PATH");
89
+
90
+ this.logger.section("Xavva Doctor - Integridade de Arquivos");
91
+ await this.checkJarIntegrity(values.fix, config);
92
+ await this.checkBOM(values.fix);
93
+
94
+ console.log("");
95
+ }
96
+
97
+ private async checkJarIntegrity(fix: boolean, config: AppConfig) {
98
+ const searchPaths = [
99
+ path.join(process.cwd(), "target"),
100
+ path.join(process.cwd(), "build"),
101
+ path.join(config.tomcat.path, "webapps")
102
+ ].filter(p => fs.existsSync(p));
103
+
104
+ const corruptedJars: string[] = [];
105
+ const zipEndSignature = Buffer.from([0x50, 0x4b, 0x05, 0x06]);
106
+
107
+ const scan = (dir: string) => {
108
+ try {
109
+ const list = fs.readdirSync(dir, { withFileTypes: true });
110
+ for (const item of list) {
111
+ const res = path.resolve(dir, item.name);
112
+ if (item.isDirectory()) {
113
+ if (item.name === "node_modules" || item.name === ".git") continue;
114
+ scan(res);
115
+ } else if (item.name.endsWith(".jar")) {
116
+ try {
117
+ const stats = fs.statSync(res);
118
+ if (stats.size < 22) {
119
+ corruptedJars.push(res);
120
+ continue;
121
+ }
122
+
123
+ // Lê os últimos 1024 bytes para encontrar a assinatura EOCD do ZIP
124
+ const readSize = Math.min(stats.size, 1024);
125
+ const buffer = Buffer.alloc(readSize);
126
+ const fd = fs.openSync(res, "r");
127
+ fs.readSync(fd, buffer, 0, readSize, stats.size - readSize);
128
+ fs.closeSync(fd);
129
+
130
+ if (!buffer.includes(zipEndSignature)) {
131
+ corruptedJars.push(res);
132
+ }
133
+ } catch (e) {
134
+ corruptedJars.push(res);
135
+ }
136
+ }
137
+ }
138
+ } catch (e) {}
139
+ };
140
+
141
+ for (const p of searchPaths) {
142
+ scan(p);
143
+ }
144
+
145
+ if (corruptedJars.length > 0) {
146
+ this.check(
147
+ "Integridade JAR",
148
+ false,
149
+ `${corruptedJars.length} arquivos corrompidos detectados.`,
150
+ );
151
+ if (fix) {
152
+ for (const file of corruptedJars) {
153
+ try {
154
+ fs.unlinkSync(file);
155
+ console.log(` ✔ Removido: ${path.basename(file)}`);
156
+ } catch (e) {}
157
+ }
158
+ this.logger.success("JARs corrompidos removidos! Eles serão reconstruídos no próximo build.");
159
+
160
+ // Limpar cache do Tomcat
161
+ this.logger.step("Limpando cache do Tomcat (work/temp)...");
162
+ const tomcatWork = path.join(config.tomcat.path, "work");
163
+ const tomcatTemp = path.join(config.tomcat.path, "temp");
164
+ [tomcatWork, tomcatTemp].forEach(p => {
165
+ try {
166
+ if (fs.existsSync(p)) {
167
+ fs.rmSync(p, { recursive: true, force: true });
168
+ fs.mkdirSync(p);
169
+ }
170
+ } catch (e) {}
171
+ });
172
+ this.logger.success("Cache do Tomcat limpo com sucesso.");
173
+ } else {
174
+ this.logger.warn(
175
+ "Use 'xavva doctor --fix' para remover os JARs corrompidos e limpar o cache.",
176
+ );
177
+ }
178
+ } else {
179
+ this.check("Integridade JAR", true, "Todos os arquivos JAR parecem íntegros.");
180
+ }
181
+ }
182
+
183
+ private async checkBOM(fix: boolean) {
184
+ const srcPath = path.join(process.cwd(), "src");
185
+ if (!fs.existsSync(srcPath)) return;
186
+
187
+ const filesWithBOM: string[] = [];
188
+ const scan = (dir: string) => {
189
+ const list = fs.readdirSync(dir, { withFileTypes: true });
190
+ for (const item of list) {
191
+ const res = path.resolve(dir, item.name);
192
+ if (item.isDirectory()) {
193
+ scan(res);
194
+ } else if (item.name.endsWith(".java")) {
195
+ const buffer = fs.readFileSync(res);
196
+ if (buffer[0] === 0xef && buffer[1] === 0xbb && buffer[2] === 0xbf) {
197
+ filesWithBOM.push(res);
198
+ }
199
+ }
200
+ }
201
+ };
202
+
203
+ scan(srcPath);
204
+
205
+ if (filesWithBOM.length > 0) {
206
+ this.check(
207
+ "Encoding BOM",
208
+ false,
209
+ `${filesWithBOM.length} arquivos com BOM (UTF-8 com assinatura)`,
210
+ );
211
+ if (fix) {
212
+ for (const file of filesWithBOM) {
213
+ const buffer = fs.readFileSync(file);
214
+ const cleanBuffer = buffer.subarray(3);
215
+ fs.writeFileSync(file, cleanBuffer);
216
+ console.log(
217
+ ` ✔ Corrigido: ${path.basename(file)}`,
218
+ );
219
+ }
220
+ this.logger.success("BOM removido de todos os arquivos!");
221
+ } else {
222
+ this.logger.warn(
223
+ "Use 'xavva doctor --fix' para remover o BOM automaticamente.",
224
+ );
225
+ }
226
+ } else {
227
+ this.check("Encoding BOM", true, "Nenhum arquivo com BOM detectado.");
228
+ }
229
+ }
230
+
231
+ private check(label: string, ok: boolean, detail: string) {
232
+ const icon = ok ? "✔" : "✘";
233
+ console.log(` ${icon} ${label.padEnd(15)} ${detail}`);
234
+ }
235
+
236
+ private checkBinary(name: string): boolean {
237
+ try {
238
+ const proc = Bun.spawnSync(getWhichCommand(name));
239
+ return proc.exitCode === 0;
240
+ } catch {
241
+ return false;
242
+ }
243
+ }
231
244
 
232
245
  private checkJVM(): { name: string, dcevm: boolean } {
233
246
  try {
@@ -252,8 +265,8 @@ export class DoctorCommand implements Command {
252
265
  }
253
266
 
254
267
  private async installDCEVM() {
255
- Logger.section("Instalação do JetBrains Runtime (JBR 21)");
256
- Logger.log("Baixando JDK moderna com DCEVM nativo (JBR 21 SDK)...");
268
+ this.logger.section("Instalação do JetBrains Runtime (JBR 21)");
269
+ this.logger.step("Baixando JDK moderna com DCEVM nativo (JBR 21 SDK)...");
257
270
 
258
271
  // URL para o JetBrains Runtime 21 SDK (multiplataforma)
259
272
  const url = getJbrDownloadUrl("21");
@@ -274,7 +287,7 @@ export class DoctorCommand implements Command {
274
287
  const tarPath = path.join(installDir, "jbr.tar.gz");
275
288
  fs.writeFileSync(tarPath, Buffer.from(buffer));
276
289
 
277
- Logger.success("Download concluído. Extraindo binários...");
290
+ this.logger.success("Download concluído. Extraindo binários...");
278
291
 
279
292
  // Extrair .tar.gz usando comando apropriado para a plataforma
280
293
  const extractCmd = getTarExtractCommand(tarPath, installDir);
@@ -304,12 +317,12 @@ export class DoctorCommand implements Command {
304
317
  await this.configureUnixEnv(jdkPath, binPath);
305
318
  }
306
319
  } catch (e: any) {
307
- Logger.error(`Falha na instalação: ${e.message}`);
320
+ this.logger.error(`Falha na instalação: ${e.message}`);
308
321
  }
309
322
  }
310
323
 
311
324
  private async configureWindowsEnv(jdkPath: string, binPath: string) {
312
- Logger.process("Configurando variáveis de ambiente do SISTEMA...");
325
+ this.logger.step("Configurando variáveis de ambiente do SISTEMA...");
313
326
 
314
327
  const setEnvCmd = `
315
328
  $jdk = $env:JDK_PATH;
@@ -345,20 +358,20 @@ export class DoctorCommand implements Command {
345
358
  const output = result.stdout.toString() + result.stderr.toString();
346
359
 
347
360
  if (output.includes("ACCESS_DENIED")) {
348
- Logger.error("Falha ao configurar variáveis do SISTEMA (Acesso Negado).");
349
- Logger.warn("Dica: Execute o terminal como ADMINISTRADOR para permitir esta alteração.");
350
- Logger.info("JAVA_HOME manual", jdkPath);
361
+ this.logger.error("Falha ao configurar variáveis do SISTEMA (Acesso Negado).");
362
+ this.logger.warn("Dica: Execute o terminal como ADMINISTRADOR para permitir esta alteração.");
363
+ this.logger.config("JAVA_HOME manual", jdkPath);
351
364
  } else {
352
- Logger.success(`DCEVM configurado no SISTEMA com sucesso!`);
353
- Logger.info("JAVA_HOME", jdkPath);
365
+ this.logger.success(`DCEVM configurado no SISTEMA com sucesso!`);
366
+ this.logger.config("JAVA_HOME", jdkPath);
354
367
  }
355
368
 
356
- Logger.newline();
357
- Logger.warn("IMPORTANTE: Reinicie seu terminal (ou o VS Code) para as mudanças surtirem efeito.");
369
+ this.logger.newline();
370
+ this.logger.warn("IMPORTANTE: Reinicie seu terminal (ou o VS Code) para as mudanças surtirem efeito.");
358
371
  }
359
372
 
360
373
  private async configureUnixEnv(jdkPath: string, binPath: string) {
361
- Logger.process("Configurando variáveis de ambiente...");
374
+ this.logger.step("Configurando variáveis de ambiente...");
362
375
 
363
376
  const shell = process.env.SHELL || "/bin/bash";
364
377
  let rcFile = path.join(os.homedir(), ".bashrc");
@@ -393,11 +406,11 @@ export class DoctorCommand implements Command {
393
406
 
394
407
  fs.writeFileSync(rcFile, filteredLines.join("\n") + "\n");
395
408
 
396
- Logger.success(`DCEVM configurado em ${rcFile}`);
397
- Logger.info("JAVA_HOME", jdkPath);
398
- Logger.newline();
399
- Logger.warn("IMPORTANTE: Execute 'source " + rcFile + "' ou reinicie seu terminal para aplicar permanentemente.");
400
- Logger.info("Dica", "Para esta sessão, o JAVA_HOME já foi configurado temporariamente.");
409
+ this.logger.success(`DCEVM configurado em ${rcFile}`);
410
+ this.logger.config("JAVA_HOME", jdkPath);
411
+ this.logger.newline();
412
+ this.logger.warn("IMPORTANTE: Execute 'source " + rcFile + "' ou reinicie seu terminal para aplicar permanentemente.");
413
+ this.logger.info("Dica: Para esta sessão, o JAVA_HOME já foi configurado temporariamente.");
401
414
 
402
415
  // Configura JAVA_HOME temporariamente para o processo atual
403
416
  process.env.JAVA_HOME = jdkPath;