@archznn/xavva 3.1.3 → 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 +33 -31
  9. package/src/commands/DeployCommand.ts +252 -229
  10. package/src/commands/DepsCommand.ts +174 -174
  11. package/src/commands/DockerCommand.ts +14 -14
  12. package/src/commands/DoctorCommand.ts +252 -239
  13. package/src/commands/EncodingCommand.ts +19 -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 +6 -6
  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 +4 -4
  26. package/src/commands/TomcatCommand.ts +219 -100
  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 +11 -3
  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,44 +1,62 @@
1
1
  import type { Command } from "./Command";
2
2
  import type { AppConfig, CLIArguments } from "../types/config";
3
- import { EmbeddedTomcatService } from "../services/EmbeddedTomcatService";
4
- import { Logger } from "../utils/ui";
3
+ import { Logger, C } from "../utils/ui";
4
+ // TomcatManagerService será implementado em fase futura
5
+ import { TomcatInstallerService } from "../services/tomcat";
5
6
  import path from "path";
6
7
  import fs from "fs";
7
8
 
8
9
  export class TomcatCommand implements Command {
10
+ private installer = new TomcatInstallerService();
11
+
9
12
  private showHelp(): void {
10
13
  Logger.section("Tomcat Command");
11
- Logger.log(`${Logger.C.bold}Usage:${Logger.C.reset} xavva tomcat <action> [options]`);
14
+ Logger.log(`${C.bold}Usage:${C.reset} xavva tomcat <action> [options]`);
15
+ Logger.newline();
16
+ Logger.log(`${C.bold}Actions:${C.reset}`);
17
+ Logger.log(` ${C.primary}list${C.reset} List available Tomcat versions`);
18
+ Logger.log(` ${C.primary}installed${C.reset} List installed versions`);
19
+ Logger.log(` ${C.primary}install${C.reset} Install a version`);
20
+ Logger.log(` ${C.primary}use${C.reset} Set version for this project`);
21
+ Logger.log(` ${C.primary}uninstall${C.reset} Remove a version`);
22
+ Logger.log(` ${C.primary}status${C.reset} Show current configuration`);
23
+ Logger.log(` ${C.primary}backup${C.reset} Manage backups`);
24
+ Logger.log(` ${C.primary}cache${C.reset} Manage download cache`);
25
+ Logger.log(` ${C.primary}mirrors${C.reset} Test and select mirrors`);
12
26
  Logger.newline();
13
- Logger.log(`${Logger.C.bold}Actions:${Logger.C.reset}`);
14
- Logger.log(` ${Logger.C.primary}list${Logger.C.reset} List available Tomcat versions`);
15
- Logger.log(` ${Logger.C.primary}installed${Logger.C.reset} List installed versions`);
16
- Logger.log(` ${Logger.C.primary}install${Logger.C.reset} Install a version`);
17
- Logger.log(` ${Logger.C.primary}use${Logger.C.reset} Set version for this project`);
18
- Logger.log(` ${Logger.C.primary}uninstall${Logger.C.reset} Remove a version`);
19
- Logger.log(` ${Logger.C.primary}status${Logger.C.reset} Show current configuration`);
27
+ Logger.log(`${C.bold}Install Options:${C.reset}`);
28
+ Logger.log(` ${C.primary}--mirror${C.reset} <name> Use specific mirror (or 'auto')`);
29
+ Logger.log(` ${C.primary}--no-checksum${C.reset} Skip checksum verification`);
30
+ Logger.log(` ${C.primary}--no-cache${C.reset} Don't use download cache`);
31
+ Logger.log(` ${C.primary}--no-backup${C.reset} Skip backup if exists`);
32
+ Logger.log(` ${C.primary}--silent${C.reset} Silent mode (CI/CD)`);
33
+ Logger.log(` ${C.primary}--timeout${C.reset} <sec> Download timeout (default: 300)`);
34
+ Logger.log(` ${C.primary}--retries${C.reset} <n> Retry attempts (default: 3)`);
35
+ Logger.log(` ${C.primary}--force${C.reset} Force reinstallation`);
36
+ Logger.log(` ${C.primary}--parallel${C.reset} Install multiple versions`);
20
37
  Logger.newline();
21
- Logger.log(`${Logger.C.bold}Examples:${Logger.C.reset}`);
38
+ Logger.log(`${C.bold}Examples:${C.reset}`);
22
39
  Logger.log(` xavva tomcat list`);
23
- Logger.log(` xavva tomcat install 9.0.115`);
40
+ Logger.log(` xavva tomcat install 10.1.52`);
41
+ Logger.log(` xavva tomcat install 9.0.115 --mirror auto`);
42
+ Logger.log(` xavva tomcat install 10.1.52 9.0.115 --parallel`);
24
43
  Logger.log(` xavva tomcat use 10.1.52`);
25
- Logger.log(` xavva tomcat status`);
44
+ Logger.log(` xavva tomcat backup list`);
45
+ Logger.log(` xavva tomcat cache stats`);
46
+ Logger.log(` xavva tomcat mirrors test`);
26
47
  }
27
48
 
28
49
  async execute(config: AppConfig, args?: CLIArguments, positionals?: string[]): Promise<void> {
29
- // Mostra help se solicitado
30
50
  if (args?.help) {
31
51
  this.showHelp();
32
52
  return;
33
53
  }
34
54
 
35
- // A ação vem como positional após "tomcat" (ex: xavva tomcat list)
36
55
  const tomcatIndex = positionals?.indexOf("tomcat") ?? -1;
37
56
  const action = positionals && tomcatIndex >= 0 && positionals[tomcatIndex + 1]
38
57
  ? positionals[tomcatIndex + 1]
39
58
  : "status";
40
59
 
41
- // Argumentos extras após a ação (ex: xavva tomcat install 9.0.115)
42
60
  const extraArgs = positionals && tomcatIndex >= 0 ? positionals.slice(tomcatIndex + 2) : [];
43
61
 
44
62
  switch (action) {
@@ -46,10 +64,10 @@ export class TomcatCommand implements Command {
46
64
  await this.handleInstall(config, args, extraArgs);
47
65
  break;
48
66
  case "list":
49
- this.handleList();
67
+ await this.handleList();
50
68
  break;
51
69
  case "installed":
52
- this.handleInstalled();
70
+ await this.handleInstalled();
53
71
  break;
54
72
  case "use":
55
73
  await this.handleUse(config, args, extraArgs);
@@ -57,61 +75,98 @@ export class TomcatCommand implements Command {
57
75
  case "uninstall":
58
76
  await this.handleUninstall(config, args, extraArgs);
59
77
  break;
78
+ case "backup":
79
+ await this.handleBackup(extraArgs);
80
+ break;
81
+ case "cache":
82
+ await this.handleCache(extraArgs);
83
+ break;
84
+ case "mirrors":
85
+ await this.handleMirrors(extraArgs);
86
+ break;
60
87
  case "status":
61
- await this.handleStatus(config);
88
+ Logger.info("Status", "Tomcat manager avançado em desenvolvimento");
62
89
  break;
63
90
  default:
64
91
  Logger.error(`Ação desconhecida: ${action}`);
65
- Logger.info("Ações disponíveis", "install, list, installed, use, uninstall, status");
92
+ Logger.info("Ações disponíveis", "install, list, installed, use, uninstall, backup, cache, mirrors, status");
66
93
  }
67
94
  }
68
95
 
69
96
  private async handleInstall(config: AppConfig, args?: CLIArguments, extraArgs: string[] = []): Promise<void> {
70
- // Versão pode vir de: flag --tomcat-version, argumento posicional, config, ou padrão
71
- const version = args?.["tomcat-version"] || extraArgs[0] || config.tomcat.version || "10.1.52";
72
-
73
- // Detectar webapp path
74
- const webappPath = config.project.buildTool === "maven"
75
- ? path.join(process.cwd(), "src", "main", "webapp")
76
- : path.join(process.cwd(), "src", "main", "webapp");
77
-
78
- const service = new EmbeddedTomcatService({
79
- version,
80
- port: config.tomcat.port,
81
- webappPath
82
- });
83
-
84
- if (service.checkInstallation()) {
85
- Logger.info("Tomcat", `Versão ${version} está instalada`);
86
- const info = service.getInfo();
87
- Logger.config("Local", info.home);
88
- return;
97
+ // Verifica modo paralelo
98
+ const isParallel = args?.parallel || extraArgs.includes("--parallel");
99
+
100
+ // Coleta versões para instalar
101
+ let versions: string[] = [];
102
+
103
+ // Versão via flag
104
+ if (args?.["tomcat-version"]) {
105
+ versions.push(args["tomcat-version"]);
106
+ }
107
+
108
+ // Versões via args extras (remove flags)
109
+ const versionArgs = extraArgs.filter(arg => !arg.startsWith("--"));
110
+ versions.push(...versionArgs);
111
+
112
+ // Se nenhuma versão especificada, usa padrão ou config
113
+ if (versions.length === 0) {
114
+ versions.push(config.tomcat.version || "10.1.52");
89
115
  }
90
116
 
91
- const installed = await service.install();
92
- if (installed) {
93
- Logger.success(`Tomcat ${version} instalado com sucesso!`);
117
+ // Remove duplicatas
118
+ versions = [...new Set(versions)];
119
+
120
+ const installOptions = {
121
+ version: versions[0], // Será sobrescrito no loop/paralelo
122
+ mirror: args?.["tomcat-mirror"] as string | undefined,
123
+ verifyChecksum: !args?.["no-checksum"] && !extraArgs.includes("--no-checksum"),
124
+ useCache: !args?.["no-cache"] && !extraArgs.includes("--no-cache"),
125
+ backup: !args?.["no-backup"] && !extraArgs.includes("--no-backup"),
126
+ silent: args?.silent || extraArgs.includes("--silent"),
127
+ timeout: parseInt(args?.timeout as string || "300"),
128
+ retries: parseInt(args?.retries as string || "3"),
129
+ force: args?.force || extraArgs.includes("--force"),
130
+ projectPath: process.cwd()
131
+ };
132
+
133
+ if (isParallel && versions.length > 1) {
134
+ await this.installer.installParallel(versions, installOptions);
94
135
  } else {
95
- Logger.error("Falha na instalação");
136
+ for (const version of versions) {
137
+ const result = await this.installer.install({
138
+ ...installOptions,
139
+ version
140
+ });
141
+
142
+ if (!result.success) {
143
+ Logger.error(`Falha ao instalar ${version}: ${result.error}`);
144
+ }
145
+ }
96
146
  }
97
147
  }
98
148
 
99
- private handleList(): void {
100
- Logger.section("Versões Disponíveis para Download");
101
- const versions = EmbeddedTomcatService.getAvailableVersions();
149
+ private async handleList(): Promise<void> {
150
+ Logger.section("Versões Disponíveis");
102
151
 
103
- for (const version of versions) {
104
- Logger.log(` ${Logger.C.primary}•${Logger.C.reset} ${version}`);
105
- }
152
+ const versions = ["11.0.6", "10.1.52", "10.0.27", "9.0.96", "8.5.100"];
106
153
 
154
+ Logger.log(`${C.bold}Recomendadas:${C.reset}`);
155
+ Logger.log(` ${C.success}✓${C.reset} 10.1.52 - Jakarta EE 10, Servlet 6.0`);
156
+ Logger.log(` ${C.success}✓${C.reset} 9.0.96 - Java EE 8, Servlet 4.0 (mais estável)`);
107
157
  Logger.newline();
108
- Logger.info("Versão padrão", "10.1.52");
158
+
159
+ Logger.log(`${C.bold}Outras versões:${C.reset}`);
160
+ Logger.log(` ${C.primary}•${C.reset} 11.0.6 - Jakarta EE 11, requer Java 21`);
161
+ Logger.log(` ${C.primary}•${C.reset} 10.0.27 - Jakarta EE 9 (legado)`);
162
+ Logger.log(` ${C.primary}•${C.reset} 8.5.100 - Java EE 7 (legado)`);
109
163
  Logger.newline();
164
+
110
165
  Logger.info("Dica", "Use 'xavva tomcat installed' para ver versões já instaladas");
111
166
  }
112
167
 
113
- private handleInstalled(): void {
114
- const installed = EmbeddedTomcatService.listInstalledVersions();
168
+ private async handleInstalled(): Promise<void> {
169
+ const installed = await this.installer.listInstalled();
115
170
 
116
171
  Logger.section("Versões Instaladas");
117
172
 
@@ -122,7 +177,9 @@ export class TomcatCommand implements Command {
122
177
  }
123
178
 
124
179
  for (const version of installed) {
125
- Logger.log(` ${Logger.C.success}✓${Logger.C.reset} ${version}`);
180
+ const sizeMB = (version.size / 1024 / 1024).toFixed(1);
181
+ Logger.log(` ${C.success}✓${C.reset} ${C.bold}${version.version}${C.reset} (${sizeMB} MB)`);
182
+ Logger.log(` ${C.gray}Local:${C.reset} ${version.home}`);
126
183
  }
127
184
 
128
185
  Logger.newline();
@@ -135,37 +192,28 @@ export class TomcatCommand implements Command {
135
192
  if (!version) {
136
193
  Logger.error("Versão não especificada");
137
194
  Logger.info("Uso", "xavva tomcat use <version>");
138
- Logger.info("Exemplo", "xavva tomcat use 9.0.115");
195
+ Logger.info("Exemplo", "xavva tomcat use 10.1.52");
139
196
  Logger.newline();
140
- Logger.info("Versões instaladas", "");
141
- this.handleInstalled();
197
+ await this.handleInstalled();
142
198
  return;
143
199
  }
144
200
 
145
- // Verifica se a versão está instalada
146
- const service = new EmbeddedTomcatService({
147
- version,
148
- port: config.tomcat.port,
149
- webappPath: "."
150
- });
151
-
152
- if (!service.checkInstallation()) {
201
+ if (!this.installer.isInstalled(version)) {
153
202
  Logger.warn(`Tomcat ${version} não está instalado`);
154
203
  Logger.newline();
155
204
  Logger.info("Opções", "");
156
- Logger.log(` ${Logger.C.primary}1.${Logger.C.reset} Instalar agora: xavva tomcat install ${version}`);
157
- Logger.log(` ${Logger.C.primary}2.${Logger.C.reset} Ver instaladas: xavva tomcat installed`);
205
+ Logger.log(` ${C.primary}1.${C.reset} Instalar agora: xavva tomcat install ${version}`);
206
+ Logger.log(` ${C.primary}2.${C.reset} Ver instaladas: xavva tomcat installed`);
158
207
  return;
159
208
  }
160
209
 
161
- // Salva a versão no xavva.json do projeto
162
210
  await this.saveTomcatVersion(version);
163
211
 
164
212
  Logger.success(`Tomcat ${version} configurado para este projeto!`);
165
213
  Logger.newline();
166
214
  Logger.info("Próximos comandos", "");
167
- Logger.log(` ${Logger.C.primary}•${Logger.C.reset} xavva dev # Iniciar desenvolvimento`);
168
- Logger.log(` ${Logger.C.primary}•${Logger.C.reset} xavva deploy # Fazer deploy`);
215
+ Logger.log(` ${C.primary}•${C.reset} xavva dev # Iniciar desenvolvimento`);
216
+ Logger.log(` ${C.primary}•${C.reset} xavva deploy # Fazer deploy`);
169
217
  }
170
218
 
171
219
  private async saveTomcatVersion(version: string): Promise<void> {
@@ -188,47 +236,118 @@ export class TomcatCommand implements Command {
188
236
  }
189
237
 
190
238
  private async handleUninstall(config: AppConfig, args?: CLIArguments, extraArgs: string[] = []): Promise<void> {
191
- // Versão pode vir de: flag --tomcat-version, argumento posicional, config, ou padrão
192
- const version = args?.["tomcat-version"] || extraArgs[0] || config.tomcat.version || "10.1.52";
239
+ const version = args?.["tomcat-version"] || extraArgs[0] || config.tomcat.version;
193
240
 
194
- const service = new EmbeddedTomcatService({
195
- version,
196
- port: config.tomcat.port,
197
- webappPath: "."
198
- });
241
+ if (!version) {
242
+ Logger.error("Versão não especificada");
243
+ Logger.info("Uso", "xavva tomcat uninstall <version>");
244
+ return;
245
+ }
199
246
 
200
- if (!service.checkInstallation()) {
247
+ if (!this.installer.isInstalled(version)) {
201
248
  Logger.warn(`Tomcat ${version} não está instalado`);
202
249
  return;
203
250
  }
204
251
 
205
252
  Logger.step(`Removendo Tomcat ${version}...`);
206
- await service.uninstall();
207
- Logger.success("Removido com sucesso!");
253
+ await this.installer.uninstall(version);
208
254
  }
209
255
 
210
- private async handleStatus(config: AppConfig): Promise<void> {
211
- Logger.section("Status do Tomcat");
212
-
213
- if (config.tomcat.embedded) {
214
- Logger.config("Modo", "Embutido");
215
- Logger.config("Versão", config.tomcat.version || "10.1.52");
216
- Logger.config("Porta", String(config.tomcat.port));
217
- Logger.config("Home", config.tomcat.path);
218
- } else {
219
- Logger.config("Modo", "Externo");
220
- Logger.config("CATALINA_HOME", config.tomcat.path);
221
- Logger.config("Porta", String(config.tomcat.port));
256
+ private async handleBackup(extraArgs: string[] = []): Promise<void> {
257
+ const subAction = extraArgs[0] || "list";
258
+
259
+ switch (subAction) {
260
+ case "list": {
261
+ const version = extraArgs[1];
262
+ const backups = await this.installer.listBackups(version);
263
+
264
+ Logger.section("Backups Disponíveis");
265
+
266
+ if (backups.length === 0) {
267
+ Logger.warn("Nenhum backup encontrado");
268
+ return;
269
+ }
270
+
271
+ for (const backup of backups) {
272
+ const sizeMB = (backup.size / 1024 / 1024).toFixed(1);
273
+ const date = backup.timestamp.toLocaleString();
274
+ Logger.log(` ${C.primary}•${C.reset} ${backup.version} - ${date} (${sizeMB} MB)`);
275
+ }
276
+ break;
277
+ }
278
+ case "restore": {
279
+ const version = extraArgs[1];
280
+ if (!version) {
281
+ Logger.error("Versão não especificada");
282
+ Logger.info("Uso", "xavva tomcat backup restore <version>");
283
+ return;
284
+ }
285
+
286
+ const success = await this.installer.restoreBackup(version);
287
+ if (success) {
288
+ Logger.success(`Backup de ${version} restaurado!`);
289
+ } else {
290
+ Logger.error("Falha ao restaurar backup");
291
+ }
292
+ break;
293
+ }
294
+ default:
295
+ Logger.error(`Ação de backup desconhecida: ${subAction}`);
296
+ Logger.info("Ações", "list, restore");
222
297
  }
223
-
224
- // Verificar se está rodando
225
- const netstat = Bun.spawnSync(["cmd", "/c", `netstat -ano | findstr :${config.tomcat.port}`]);
226
- const output = await new Response(netstat.stdout).text();
227
-
228
- if (output.trim()) {
229
- Logger.config("Status", `${Logger.C.success}Rodando${Logger.C.reset}`);
230
- } else {
231
- Logger.config("Status", `${Logger.C.warning}Parado${Logger.C.reset}`);
298
+ }
299
+
300
+ private async handleCache(extraArgs: string[] = []): Promise<void> {
301
+ const subAction = extraArgs[0] || "stats";
302
+
303
+ switch (subAction) {
304
+ case "stats": {
305
+ const stats = await this.installer.getCacheStats();
306
+ const sizeMB = (stats.size / 1024 / 1024).toFixed(1);
307
+
308
+ Logger.section("Estatísticas do Cache");
309
+ Logger.log(` ${C.primary}•${C.reset} Arquivos: ${stats.files}`);
310
+ Logger.log(` ${C.primary}•${C.reset} Tamanho: ${sizeMB} MB`);
311
+ break;
312
+ }
313
+ case "clear":
314
+ await this.installer.clearCache();
315
+ Logger.success("Cache limpo!");
316
+ break;
317
+ default:
318
+ Logger.error(`Ação de cache desconhecida: ${subAction}`);
319
+ Logger.info("Ações", "stats, clear");
320
+ }
321
+ }
322
+
323
+ private async handleMirrors(extraArgs: string[] = []): Promise<void> {
324
+ const { TomcatMirrorManager } = await import("../services/tomcat");
325
+ const manager = new TomcatMirrorManager();
326
+
327
+ const subAction = extraArgs[0] || "list";
328
+
329
+ switch (subAction) {
330
+ case "list": {
331
+ const mirrors = manager.getMirrors();
332
+ Logger.section("Mirrors Disponíveis");
333
+ for (const mirror of mirrors) {
334
+ Logger.log(` ${C.primary}•${C.reset} ${mirror.name} (${mirror.region})`);
335
+ }
336
+ break;
337
+ }
338
+ case "test": {
339
+ Logger.section("Testando Mirrors");
340
+ const tested = await manager.testAllMirrors();
341
+
342
+ for (const mirror of tested.slice(0, 5)) {
343
+ const color = mirror.latency < 200 ? C.success : mirror.latency < 500 ? C.warning : C.error;
344
+ Logger.log(` ${color}•${C.reset} ${mirror.name}: ${mirror.latency}ms`);
345
+ }
346
+ break;
347
+ }
348
+ default:
349
+ Logger.error(`Ação desconhecida: ${subAction}`);
350
+ Logger.info("Ações", "list, test");
232
351
  }
233
352
  }
234
353
  }
@@ -1,14 +1,18 @@
1
1
  /**
2
- * Configurações centralizadas de versões
3
- * Evita hardcoding espalhado pelo código
2
+ * Configurações centralizadas de versões e constantes
3
+ * Fonte única da verdade para todo o XAVVA CLI
4
4
  */
5
5
 
6
+ // ============================================
7
+ // VERSÕES
8
+ // ============================================
9
+
6
10
  export const VERSIONS = {
7
11
  // Versões padrão do Tomcat
8
12
  TOMCAT: {
9
13
  DEFAULT: "10.1.52",
10
14
  AVAILABLE: {
11
- "10.1.52": { sha512: "" },
15
+ "10.1.52": { sha512: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" },
12
16
  "9.0.115": { sha512: "" },
13
17
  "11.0.18": { sha512: "" },
14
18
  },
@@ -20,15 +24,113 @@ export const VERSIONS = {
20
24
  URL: "https://github.com/HotswapProjects/HotswapAgent/releases/download/RELEASE-{version}/hotswap-agent-{version}.jar",
21
25
  },
22
26
 
23
- // Configurações padrão
24
- DEFAULTS: {
25
- TOMCAT_PORT: 8080,
26
- DEBUG_PORT: 5005,
27
- DEBOUNCE_MS: 300,
28
- COOLING_MS: 1000,
27
+ // Requisitos
28
+ JDK: {
29
+ MIN: "11",
30
+ RECOMMENDED: "17",
29
31
  },
30
32
  } as const;
31
33
 
34
+ // ============================================
35
+ // PORTAS PADRÃO
36
+ // ============================================
37
+
38
+ export const PORTS = {
39
+ DEFAULT_TOMCAT: 8080,
40
+ DEFAULT_DEBUG: 5005,
41
+ } as const;
42
+
43
+ // ============================================
44
+ // TIMEOUTS (ms)
45
+ // ============================================
46
+
47
+ export const TIMEOUTS = {
48
+ SHUTDOWN: 5000,
49
+ DEBOUNCE: 300,
50
+ COOLING: 1000,
51
+ WATCHER_DEBOUNCE: 1500,
52
+ BROWSER_OPEN: 800,
53
+ DEPLOY_HEALTH_CHECK: 1500,
54
+ HOTSWAP: 500,
55
+ TOMCAT_CLEAN_RETRY: 50,
56
+ } as const;
57
+
58
+ // ============================================
59
+ // LIMITES E TAMANHOS
60
+ // ============================================
61
+
62
+ export const LIMITS = {
63
+ MAX_LOG_SCROLLBUFFER: 1000,
64
+ MAX_BUILD_ERRORS_SHOWN: 15,
65
+ MAX_HISTORY_ITEMS: 10,
66
+ MAX_DUPLICATE_LOGS: 5,
67
+ RATE_LIMIT_WINDOW_MS: 5000,
68
+ JAR_INTEGRITY_BUFFER_SIZE: 1024,
69
+ JAR_MIN_VALID_SIZE: 1000,
70
+ ZIP_EOCD_SIGNATURE_SIZE: 4,
71
+ } as const;
72
+
73
+ // ============================================
74
+ // DASHBOARD
75
+ // ============================================
76
+
77
+ export const DASHBOARD = {
78
+ REFRESH_INTERVAL_MS: 1000,
79
+ LOG_SLICE_LINES: 1000,
80
+ } as const;
81
+
82
+ // ============================================
83
+ // BUILD
84
+ // ============================================
85
+
86
+ export const BUILD = {
87
+ MAVEN_PARALLEL_THREADS: "1C",
88
+ JVM_MEMORY_OPTS: "-Xms512m -Xmx1024m -XX:+UseParallelGC",
89
+ GRADLE_MEMORY_OPTS: "-Xmx1024m -Dorg.gradle.daemon=true",
90
+ } as const;
91
+
92
+ // ============================================
93
+ // EXIT CODES
94
+ // ============================================
95
+
96
+ export const EXIT_CODES = {
97
+ SUCCESS: 0,
98
+ GENERIC_ERROR: 1,
99
+ INVALID_COMMAND: 2,
100
+ BUILD_FAILED: 3,
101
+ DEPLOY_FAILED: 4,
102
+ TOMCAT_ERROR: 5,
103
+ PROJECT_ERROR: 6,
104
+ AUDIT_ERROR: 7,
105
+ NETWORK_ERROR: 8,
106
+ FILESYSTEM_ERROR: 9,
107
+ COMMAND_ERROR: 10,
108
+ SIGINT: 130,
109
+ } as const;
110
+
111
+ // ============================================
112
+ // ARQUIVOS E DIRETÓRIOS
113
+ // ============================================
114
+
115
+ export const PATHS = {
116
+ JAVA_FILE_PATTERN: "**/*.java",
117
+ WAR_EXTENSION: ".war",
118
+ JAR_EXTENSION: ".jar",
119
+ XAVVA_DIR: ".xavva",
120
+ TARGET_DIR: "target",
121
+ BUILD_DIR: "build",
122
+ WEBAPP_DIR: "webapps",
123
+ } as const;
124
+
125
+ // ============================================
126
+ // CACHE
127
+ // ============================================
128
+
129
+ export const CACHE = {
130
+ MAX_AGE_MS: 24 * 60 * 60 * 1000,
131
+ VERSION: 1,
132
+ } as const;
133
+
32
134
  // Type helpers
33
135
  export type TomcatVersion = keyof typeof VERSIONS.TOMCAT.AVAILABLE;
34
136