web-architect-cli 1.0.6 → 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 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 install -g web-architect-cli@latest
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
- | **Comando** | **Ação** |
199
- | --------------- | --------------------------------------------------- |
200
- | `npm start` | Inicia o monitoramento. Altera arquivo -> Gera ZIP. |
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,10 +1,10 @@
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
- }
7
+ } catch (e) {}
8
8
  }
9
9
 
10
10
  const fs = require('fs');
@@ -18,7 +18,129 @@ const rl = readline.createInterface({
18
18
  });
19
19
 
20
20
  // ==========================================
21
- // CONTEÚDOS PARA O MODELO HTML5
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 = `*.zip\n.DS_Store\n`;
138
- const CONTEUDO_GITIGNORE_JAVA = `out/\n.idea/workspace.xml\n.idea/usage.statistics.xml\n*.iws\n.DS_Store\n`;
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 DOS MODELOS
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: { "build": "node build.js", "start": "node build.js" },
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/Backend) ---
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).\n\n## Estrutura\n- **doc/**: Documentação.\n- **src/**: Scripts de Banco.`);
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 (Estrutura IntelliJ Nativa) ---
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! Abra a pasta '${nomeProjeto}' diretamente no IntelliJ.`);
296
- console.log(`ℹ️ Certifique-se de que a biblioteca global 'libs-java' esteja configurada no seu IntelliJ.`);
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "web-architect-cli",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -10,7 +10,7 @@
10
10
  "archiver": "^7.0.0"
11
11
  },
12
12
  "scripts": {
13
- "postinstall": "node -e \"if (process.platform === 'win32') require('child_process').execSync('setup_windows.bat', { stdio: 'inherit' })\""
13
+ "test": "echo \"Error: no test specified\" && exit 1"
14
14
  },
15
15
  "repository": {
16
16
  "type": "git",
@@ -1,14 +0,0 @@
1
- @echo off
2
- ECHO.
3
- ECHO ==================================================
4
- ECHO CONFIGURANDO AMBIENTE WEB ARCHITECT (WINDOWS)
5
- ECHO ==================================================
6
- ECHO.
7
-
8
- REM 1. Configura a pagina de codigo para UTF-8 (Corrige emojis)
9
- chcp 65001 >nul
10
-
11
- REM 2. Mensagem de sucesso
12
- ECHO [OK] Configuracao de codificacao aplicada.
13
- ECHO [OK] O comando 'web-arch' esta pronto para uso.
14
- ECHO.