web-architect-cli 1.0.7 → 1.0.8
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 +58 -11
- package/bin/index.js +163 -19
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
1
|
# 🏗️ Web Architect CLI
|
|
4
2
|
|
|
5
3
|
O **Web Architect CLI** é uma ferramenta de linha de comando desenvolvida para padronizar e acelerar a criação de projetos no ecossistema **Sankhya**.
|
|
@@ -16,12 +14,26 @@ Com um único comando, você pode gerar:
|
|
|
16
14
|
|
|
17
15
|
Para utilizar a ferramenta em qualquer lugar do seu sistema, instale globalmente via npm:
|
|
18
16
|
|
|
19
|
-
```bashnpm
|
|
17
|
+
```bashnpm
|
|
20
18
|
npm install -g web-architect-cli@latest
|
|
21
19
|
```
|
|
22
20
|
|
|
23
21
|
**Requisito:** É necessário ter o [Node.js](https://nodejs.org/) instalado.
|
|
24
22
|
|
|
23
|
+
### ⚠️ Usuários Windows (Erro de Permissão)
|
|
24
|
+
|
|
25
|
+
O Windows bloqueia scripts por padrão. Se ao instalar ou executar o comando você receber o erro em vermelho:
|
|
26
|
+
|
|
27
|
+
> *"cannot be loaded because running scripts is disabled on this system"*
|
|
28
|
+
|
|
29
|
+
Execute o comando abaixo no seu terminal **antes** de usar a ferramenta. Isso libera o uso de scripts **apenas nesta janela** (seguro):
|
|
30
|
+
|
|
31
|
+
PowerShell
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Set-ExecutionPolicy Bypass -Scope Process
|
|
35
|
+
```
|
|
36
|
+
|
|
25
37
|
## 🚀 Como Utilizar
|
|
26
38
|
|
|
27
39
|
Abra o terminal na pasta onde deseja criar o projeto e execute:
|
|
@@ -141,8 +153,6 @@ meu-evento-java/
|
|
|
141
153
|
|
|
142
154
|
## 💡 Casos de Uso (Workflows)
|
|
143
155
|
|
|
144
|
-
|
|
145
|
-
|
|
146
156
|
Aqui estão os cenários comuns onde o **Web Architect CLI** brilha:
|
|
147
157
|
|
|
148
158
|
### Caso A: Início Rápido de Dashboards (HTML/JSP)
|
|
@@ -191,13 +201,50 @@ Ao usar o comando `web-arch`, todos os projetos seguem a mesma árvore:
|
|
|
191
201
|
|
|
192
202
|
Isso facilita a manutenção cruzada: qualquer desenvolvedor sabe onde encontrar o código.
|
|
193
203
|
|
|
194
|
-
## 🛠 Comandos do Projeto (Scripts)
|
|
195
204
|
|
|
196
|
-
Dentro da pasta do projeto criado, você pode usar:
|
|
197
205
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
| `npm run build` | Gera o ZIP apenas uma vez e encerra. |
|
|
206
|
+
## 🤖 Assistente de Commit (Git)
|
|
207
|
+
|
|
208
|
+
Todos os projetos gerados (Web, Banco ou Java) já vêm configurados com um script de **Commit Semântico**. Isso garante que o histórico do seu projeto fique padronizado e profissional.
|
|
202
209
|
|
|
203
210
|
|
|
211
|
+
|
|
212
|
+
**Como usar:** Em vez de digitar os comandos do Git manualmente, basta rodar na raiz do projeto:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
npm run commit
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**O assistente interativo irá:**
|
|
219
|
+
|
|
220
|
+
1. Perguntar o **tipo** de alteração:
|
|
221
|
+
|
|
222
|
+
- `feat`: Nova funcionalidade.
|
|
223
|
+
|
|
224
|
+
- `fix`: Correção de bugs.
|
|
225
|
+
|
|
226
|
+
- `docs`: Alteração em documentação.
|
|
227
|
+
|
|
228
|
+
- `style`: Formatação, CSS, espaços.
|
|
229
|
+
|
|
230
|
+
- `refactor`: Melhoria de código sem mudar funcionalidade.
|
|
231
|
+
|
|
232
|
+
- `chore`: Alterações de build, configs, etc.
|
|
233
|
+
|
|
234
|
+
2. Pedir a **mensagem** do commit.
|
|
235
|
+
|
|
236
|
+
3. Executar automaticamente `git add .` e `git commit -m "tipo: mensagem"`.
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
## 🛠 Comandos do Projeto (Scripts)
|
|
243
|
+
|
|
244
|
+
Dentro da pasta do projeto criado, você pode usar:
|
|
245
|
+
|
|
246
|
+
| Comando | Ação |
|
|
247
|
+
|:---------------- |:-------------------------------------------------------------------------- |
|
|
248
|
+
| `npm run commit` | **(Todos)** Abre o assistente para realizar commits padronizados. |
|
|
249
|
+
| `npm start` | **(Web)** Inicia o modo Watch. Altera arquivo -> Gera ZIP automaticamente. |
|
|
250
|
+
| `npm run build` | **(Web)** Gera o ZIP do projeto uma única vez e encerra. |
|
package/bin/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
|
|
3
4
|
if (process.platform === "win32") {
|
|
4
5
|
try {
|
|
5
6
|
require("child_process").execSync("chcp 65001", { stdio: 'ignore' });
|
|
6
|
-
} catch (e) {
|
|
7
|
-
|
|
8
|
-
}
|
|
7
|
+
} catch (e) {}
|
|
9
8
|
}
|
|
9
|
+
|
|
10
10
|
const fs = require('fs');
|
|
11
11
|
const path = require('path');
|
|
12
12
|
const { execSync } = require('child_process');
|
|
@@ -18,7 +18,129 @@ const rl = readline.createInterface({
|
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
// ==========================================
|
|
21
|
-
//
|
|
21
|
+
// 1. SCRIPT DE COMMIT INTELIGENTE
|
|
22
|
+
// ==========================================
|
|
23
|
+
const CONTEUDO_COMMIT_JS = `const { execSync } = require('child_process');
|
|
24
|
+
const readline = require('readline');
|
|
25
|
+
|
|
26
|
+
const rl = readline.createInterface({
|
|
27
|
+
input: process.stdin,
|
|
28
|
+
output: process.stdout
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
console.clear();
|
|
32
|
+
console.log('=============================================');
|
|
33
|
+
console.log(' 🤖 SMART COMMIT - ANÁLISE DINÂMICA');
|
|
34
|
+
console.log('=============================================');
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
// 1. Pega os arquivos alterados (git status --porcelain)
|
|
38
|
+
const statusOutput = execSync('git status --porcelain').toString();
|
|
39
|
+
|
|
40
|
+
if (!statusOutput.trim()) {
|
|
41
|
+
console.log('⚠️ Nenhuma alteração detectada para commitar.');
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// 2. Processa a lista de arquivos
|
|
46
|
+
const linhas = statusOutput.split('\\n').filter(l => l.trim());
|
|
47
|
+
const arquivos = linhas.map(l => {
|
|
48
|
+
const tipo = l.substring(0, 2).trim();
|
|
49
|
+
const arquivo = l.substring(3).trim();
|
|
50
|
+
return { tipo, arquivo };
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const qtd = arquivos.length;
|
|
54
|
+
const nomesArquivos = arquivos.map(a => a.arquivo).join(', ');
|
|
55
|
+
|
|
56
|
+
// Separa título e corpo se for muito longo
|
|
57
|
+
let tituloSugerido = '';
|
|
58
|
+
let corpoSugerido = '';
|
|
59
|
+
|
|
60
|
+
if (qtd === 1) {
|
|
61
|
+
tituloSugerido = \`altera \${arquivos[0].arquivo}\`;
|
|
62
|
+
} else if (qtd <= 3) {
|
|
63
|
+
tituloSugerido = \`altera \${nomesArquivos}\`;
|
|
64
|
+
} else {
|
|
65
|
+
tituloSugerido = \`atualiza \${qtd} arquivos do projeto\`;
|
|
66
|
+
corpoSugerido = arquivos.map(a => \`- [\${a.tipo}] \${a.arquivo}\`).join('\\n');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
console.log(\`\\n📂 Alterações detectadas: \${qtd} arquivo(s)\`);
|
|
70
|
+
arquivos.forEach(a => console.log(\` \${a.tipo === '??' ? '➕' : '📝'} \${a.arquivo}\`));
|
|
71
|
+
console.log('---------------------------------------------');
|
|
72
|
+
|
|
73
|
+
console.log('Escolha o tipo de alteração:');
|
|
74
|
+
console.log(' [1] feat (Nova funcionalidade)');
|
|
75
|
+
console.log(' [2] fix (Correção de bug)');
|
|
76
|
+
console.log(' [3] style (Visual/Formatação)');
|
|
77
|
+
console.log(' [4] refactor (Melhoria de código)');
|
|
78
|
+
console.log(' [5] chore (Configs/Build)');
|
|
79
|
+
|
|
80
|
+
rl.question('\\n👉 Tipo (1-5): ', (tipoOpcao) => {
|
|
81
|
+
const mapTipos = { '1': 'feat', '2': 'fix', '3': 'style', '4': 'refactor', '5': 'chore' };
|
|
82
|
+
const tipo = mapTipos[tipoOpcao.trim()] || 'feat';
|
|
83
|
+
|
|
84
|
+
console.log('\\n---------------------------------------------');
|
|
85
|
+
console.log('📝 OPÇÕES DE MENSAGEM:');
|
|
86
|
+
console.log(\` [1] Automática (Resumida): "\${tipo}: \${tituloSugerido}"\`);
|
|
87
|
+
|
|
88
|
+
if (corpoSugerido) {
|
|
89
|
+
console.log(\` [2] Automática (Detalhada): "\${tipo}: \${tituloSugerido} (+ lista de arquivos na descrição)"\`);
|
|
90
|
+
} else {
|
|
91
|
+
console.log(\` [2] (Opção igual a 1 pois são poucos arquivos)\`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log(' [3] Manual (Digitar sua própria mensagem)');
|
|
95
|
+
|
|
96
|
+
rl.question('\\n👉 Escolha (1-3): ', (msgOpcao) => {
|
|
97
|
+
let comandoGit = '';
|
|
98
|
+
|
|
99
|
+
if (msgOpcao.trim() === '3') {
|
|
100
|
+
rl.question('✍️ Digite a mensagem: ', (manualMsg) => {
|
|
101
|
+
executarCommit(tipo, manualMsg, '');
|
|
102
|
+
});
|
|
103
|
+
} else if (msgOpcao.trim() === '2' && corpoSugerido) {
|
|
104
|
+
// Commit com Título + Corpo (Description)
|
|
105
|
+
executarCommit(tipo, tituloSugerido, corpoSugerido);
|
|
106
|
+
} else {
|
|
107
|
+
// Commit Simples
|
|
108
|
+
executarCommit(tipo, tituloSugerido, '');
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
} catch (e) {
|
|
114
|
+
console.error('Erro ao ler status do git:', e.message);
|
|
115
|
+
rl.close();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function executarCommit(tipo, titulo, corpo) {
|
|
119
|
+
const msgFinal = \`\${tipo}: \${titulo}\`;
|
|
120
|
+
|
|
121
|
+
console.log('\\n⏳ Executando git add .');
|
|
122
|
+
execSync('git add .');
|
|
123
|
+
|
|
124
|
+
console.log(\`⏳ Commitando: "\${msgFinal}"\`);
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
// Se tiver corpo, usamos -m duas vezes ou uma string multilinha
|
|
128
|
+
if (corpo) {
|
|
129
|
+
// Estratégia segura para multiline no terminal
|
|
130
|
+
execSync(\`git commit -m "\${msgFinal}" -m "\${corpo}"\`, { stdio: 'inherit' });
|
|
131
|
+
} else {
|
|
132
|
+
execSync(\`git commit -m "\${msgFinal}"\`, { stdio: 'inherit' });
|
|
133
|
+
}
|
|
134
|
+
console.log('✅ Commit realizado com sucesso!');
|
|
135
|
+
} catch (err) {
|
|
136
|
+
console.error('❌ Erro no commit.');
|
|
137
|
+
}
|
|
138
|
+
rl.close();
|
|
139
|
+
}
|
|
140
|
+
`;
|
|
141
|
+
|
|
142
|
+
// ==========================================
|
|
143
|
+
// 2. CONTEÚDOS HTML5
|
|
22
144
|
// ==========================================
|
|
23
145
|
const CONTEUDO_INDEX_JSP = `<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored ="false"%>
|
|
24
146
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
@@ -34,7 +156,6 @@ const CONTEUDO_INDEX_JSP = `<%@ page language="java" contentType="text/html; cha
|
|
|
34
156
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
|
35
157
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
|
|
36
158
|
<link rel="stylesheet" href="\${BASE_FOLDER}/src/assets/css/style.css">
|
|
37
|
-
|
|
38
159
|
<script type="module" src="https://cdn.jsdelivr.net/npm/@jtandrelevicius/utils-js-library@latest/index.js"></script>
|
|
39
160
|
<snk:load/>
|
|
40
161
|
</head>
|
|
@@ -131,11 +252,11 @@ if (CONFIG.MODO_AUTOMATICO) {
|
|
|
131
252
|
`;
|
|
132
253
|
|
|
133
254
|
// ==========================================
|
|
134
|
-
// UTILITÁRIOS GERAIS
|
|
255
|
+
// 3. UTILITÁRIOS GERAIS
|
|
135
256
|
// ==========================================
|
|
136
257
|
const CONTEUDO_GITIGNORE_HTML = `node_modules/\n*.zip\n.DS_Store\n`;
|
|
137
|
-
const CONTEUDO_GITIGNORE_GERAL =
|
|
138
|
-
const CONTEUDO_GITIGNORE_JAVA = `
|
|
258
|
+
const CONTEUDO_GITIGNORE_GERAL = `node_modules/\n*.zip\n.DS_Store\n`;
|
|
259
|
+
const CONTEUDO_GITIGNORE_JAVA = `node_modules/\nout/\n.idea/workspace.xml\n.idea/usage.statistics.xml\n*.iws\n.DS_Store\n`;
|
|
139
260
|
const CONTEUDO_GITATTRIBUTES = `* text=auto`;
|
|
140
261
|
|
|
141
262
|
const logPasso = (emoji, msg) => console.log(`${emoji} ${msg}`);
|
|
@@ -153,7 +274,7 @@ function criarArquivo(caminho, conteudo) {
|
|
|
153
274
|
}
|
|
154
275
|
|
|
155
276
|
// ==========================================
|
|
156
|
-
// FUNÇÕES DE CRIAÇÃO
|
|
277
|
+
// 4. FUNÇÕES DE CRIAÇÃO
|
|
157
278
|
// ==========================================
|
|
158
279
|
|
|
159
280
|
// --- MODELO 1: HTML5 (Web) ---
|
|
@@ -174,6 +295,7 @@ function criarProjetoHTML5(raiz, nomeProjeto) {
|
|
|
174
295
|
criarArquivo(path.join(raiz, 'index.jsp'), CONTEUDO_INDEX_JSP);
|
|
175
296
|
criarArquivo(path.join(raiz, 'index.html'), CONTEUDO_INDEX_HTML);
|
|
176
297
|
criarArquivo(path.join(raiz, 'build.js'), CONTEUDO_BUILD_JS);
|
|
298
|
+
criarArquivo(path.join(raiz, 'commit.js'), CONTEUDO_COMMIT_JS);
|
|
177
299
|
criarArquivo(path.join(raiz, '.gitignore'), CONTEUDO_GITIGNORE_HTML);
|
|
178
300
|
criarArquivo(path.join(raiz, '.gitattributes'), CONTEUDO_GITATTRIBUTES);
|
|
179
301
|
criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto Web (HTML5/JSP) gerado automaticamente.`);
|
|
@@ -183,7 +305,11 @@ function criarProjetoHTML5(raiz, nomeProjeto) {
|
|
|
183
305
|
version: "1.0.0",
|
|
184
306
|
description: "",
|
|
185
307
|
main: "src/main.js",
|
|
186
|
-
scripts: {
|
|
308
|
+
scripts: {
|
|
309
|
+
"build": "node build.js",
|
|
310
|
+
"start": "node build.js",
|
|
311
|
+
"commit": "node commit.js"
|
|
312
|
+
},
|
|
187
313
|
author: "",
|
|
188
314
|
license: "ISC"
|
|
189
315
|
};
|
|
@@ -207,7 +333,7 @@ function criarProjetoHTML5(raiz, nomeProjeto) {
|
|
|
207
333
|
} catch (e) { console.error('Erro na configuração:', e.message); }
|
|
208
334
|
}
|
|
209
335
|
|
|
210
|
-
// --- MODELO 2: PERSONALIZACAO (Banco
|
|
336
|
+
// --- MODELO 2: PERSONALIZACAO (Banco) ---
|
|
211
337
|
function criarProjetoPersonalizacao(raiz, nomeProjeto) {
|
|
212
338
|
const pastas = [
|
|
213
339
|
'doc',
|
|
@@ -223,9 +349,19 @@ function criarProjetoPersonalizacao(raiz, nomeProjeto) {
|
|
|
223
349
|
|
|
224
350
|
pastas.forEach(p => criarPasta(path.join(raiz, p)));
|
|
225
351
|
|
|
352
|
+
criarArquivo(path.join(raiz, 'commit.js'), CONTEUDO_COMMIT_JS);
|
|
226
353
|
criarArquivo(path.join(raiz, '.gitattributes'), CONTEUDO_GITATTRIBUTES);
|
|
227
354
|
criarArquivo(path.join(raiz, '.gitignore'), CONTEUDO_GITIGNORE_GERAL);
|
|
228
|
-
criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto de Personalização (Banco de Dados/PLSQL)
|
|
355
|
+
criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto de Personalização (Banco de Dados/PLSQL).`);
|
|
356
|
+
|
|
357
|
+
const packageJson = {
|
|
358
|
+
name: nomeProjeto,
|
|
359
|
+
version: "1.0.0",
|
|
360
|
+
scripts: {
|
|
361
|
+
"commit": "node commit.js"
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
criarArquivo(path.join(raiz, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
229
365
|
|
|
230
366
|
console.log(`\n⚙️ CONFIGURANDO AMBIENTE DE PERSONALIZAÇÃO...`);
|
|
231
367
|
try {
|
|
@@ -234,7 +370,7 @@ function criarProjetoPersonalizacao(raiz, nomeProjeto) {
|
|
|
234
370
|
} catch (e) { console.error('Erro no git init:', e.message); }
|
|
235
371
|
}
|
|
236
372
|
|
|
237
|
-
// --- MODELO 3: JAVA (
|
|
373
|
+
// --- MODELO 3: JAVA (IntelliJ) ---
|
|
238
374
|
function criarProjetoJava(raiz, nomeProjeto) {
|
|
239
375
|
const nomePacote = nomeProjeto.replace(/-/g, '').toLowerCase();
|
|
240
376
|
const basePath = `src/br/com/sankhya/${nomePacote}`;
|
|
@@ -253,9 +389,19 @@ function criarProjetoJava(raiz, nomeProjeto) {
|
|
|
253
389
|
|
|
254
390
|
pastas.forEach(p => criarPasta(path.join(raiz, p)));
|
|
255
391
|
|
|
392
|
+
criarArquivo(path.join(raiz, 'commit.js'), CONTEUDO_COMMIT_JS);
|
|
256
393
|
criarArquivo(path.join(raiz, '.gitignore'), CONTEUDO_GITIGNORE_JAVA);
|
|
257
394
|
criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto Java Sankhya (IntelliJ Nativo).`);
|
|
258
395
|
|
|
396
|
+
const packageJson = {
|
|
397
|
+
name: nomeProjeto,
|
|
398
|
+
version: "1.0.0",
|
|
399
|
+
scripts: {
|
|
400
|
+
"commit": "node commit.js"
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
criarArquivo(path.join(raiz, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
404
|
+
|
|
259
405
|
const modulesXml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
260
406
|
<project version="4">
|
|
261
407
|
<component name="ProjectModuleManager">
|
|
@@ -292,13 +438,13 @@ function criarProjetoJava(raiz, nomeProjeto) {
|
|
|
292
438
|
try {
|
|
293
439
|
logPasso('Git', 'Inicializando repositório...');
|
|
294
440
|
execSync('git init', { cwd: raiz, stdio: 'inherit' });
|
|
295
|
-
console.log(`\n✅ SUCESSO
|
|
296
|
-
console.log(`ℹ️
|
|
441
|
+
console.log(`\n✅ SUCESSO!`);
|
|
442
|
+
console.log(`ℹ️ Para commitar, use: npm run commit`);
|
|
297
443
|
} catch (e) { console.error(e.message); }
|
|
298
444
|
}
|
|
299
445
|
|
|
300
446
|
// ==========================================
|
|
301
|
-
// MENU PRINCIPAL
|
|
447
|
+
// 5. MENU PRINCIPAL
|
|
302
448
|
// ==========================================
|
|
303
449
|
function iniciar() {
|
|
304
450
|
console.clear();
|
|
@@ -312,7 +458,6 @@ function iniciar() {
|
|
|
312
458
|
console.log('===================================================');
|
|
313
459
|
|
|
314
460
|
rl.question('👉 Escolha uma opção (1-3): ', (opcao) => {
|
|
315
|
-
|
|
316
461
|
if (!['1', '2', '3'].includes(opcao.trim())) {
|
|
317
462
|
console.log('❌ Opção inválida.');
|
|
318
463
|
rl.close();
|
|
@@ -346,10 +491,9 @@ function iniciar() {
|
|
|
346
491
|
break;
|
|
347
492
|
case '3':
|
|
348
493
|
criarProjetoJava(raiz, nomeProjeto);
|
|
349
|
-
console.log(`\n✅ PROJETO JAVA CRIADO
|
|
494
|
+
console.log(`\n✅ PROJETO JAVA CRIADO! Rode 'cd ${nomeProjeto}'.`);
|
|
350
495
|
break;
|
|
351
496
|
}
|
|
352
|
-
|
|
353
497
|
rl.close();
|
|
354
498
|
});
|
|
355
499
|
});
|