specifica-br 1.0.3 → 1.1.1

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
@@ -40,9 +40,10 @@ specifica-br init
40
40
  ```
41
41
 
42
42
  **O que faz:**
43
- - Cria os diretórios `.opencode/commands` e `specs/templates`
43
+ - Permite selecionar a convenção de diretórios (OpenCode ou Specifica-BR)
44
+ - Cria os diretórios de comandos e templates baseados na seleção
45
+ - Se OpenCode for selecionado, guia na escolha da ferramenta e modelo de IA
44
46
  - Copia os arquivos de templates necessários
45
- - Guia você na seleção da ferramenta e modelo de IA
46
47
  - Exibe informações sobre o workflow SDD
47
48
 
48
49
  **Exemplo de uso:**
@@ -50,6 +51,10 @@ specifica-br init
50
51
  $ specifica-br init
51
52
  Inicializando estrutura Spec Driven Development...
52
53
 
54
+ Selecione a convenção de diretórios para comandos:
55
+ ❯ Recomendado (OpenCode)
56
+ Agnóstico (Specifica-BR)
57
+
53
58
  Selecione a ferramenta de IA:
54
59
  ❯ OpenCode
55
60
 
@@ -95,13 +100,224 @@ specifica-br help --completo
95
100
 
96
101
  ### `specifica-br upgrade`
97
102
 
98
- Atualiza templates e comandos (em breve).
103
+ Atualiza a CLI para a versão mais recente do NPM.
99
104
 
100
105
  ```bash
101
106
  specifica-br upgrade
102
107
  ```
103
108
 
104
- **Nota:** Este comando está em desenvolvimento e estará disponível em uma versão futura.
109
+ #### Requisitos
110
+
111
+ - **npm instalado:** O comando npm deve estar disponível no sistema
112
+ - **Permissões:** Dependendo do sistema operacional, pode ser necessário executar com permissões elevadas
113
+
114
+ #### Instruções por Plataforma
115
+
116
+ **Windows:**
117
+
118
+ - Execute o comando normalmente
119
+ - Se receber erro de permissão, clique com botão direito no terminal/CMD e selecione "Executar como administrador"
120
+ - Alternativamente, abra PowerShell como administrador e execute o comando
121
+
122
+ **Linux:**
123
+
124
+ - Execute o comando normalmente
125
+ - Se receber erro de permissão, use `sudo`:
126
+ ```bash
127
+ sudo specifica-br upgrade
128
+ ```
129
+
130
+ **MacOS:**
131
+
132
+ - Execute o comando normalmente
133
+ - Se receber erro de permissão, use `sudo`:
134
+ ```bash
135
+ sudo specifica-br upgrade
136
+ ```
137
+
138
+ #### Exemplos
139
+
140
+ **Atualização bem-sucedida:**
141
+
142
+ ```bash
143
+ $ specifica-br upgrade
144
+
145
+ Verificando instalação do npm...
146
+
147
+ ✓ npm encontrado.
148
+
149
+ Atualizando specifica-br para a versão mais recente...
150
+ Executando: npm i -g specifica-br@latest
151
+
152
+ [output do npm]
153
+
154
+ ✓ specifica-br atualizado com sucesso!
155
+ ```
156
+
157
+ **Erro de permissão no Windows:**
158
+
159
+ ```bash
160
+ $ specifica-br upgrade
161
+
162
+ ✗ Permissão negada.
163
+ Execute como administrador (clique com botão direito > Executar como administrador)
164
+ ```
165
+
166
+ **Erro de permissão no Linux/MacOS:**
167
+
168
+ ```bash
169
+ $ specifica-br upgrade
170
+
171
+ ✗ Permissão negada.
172
+ Execute: sudo specifica-br upgrade
173
+ ```
174
+
175
+ **npm não encontrado:**
176
+
177
+ ```bash
178
+ $ specifica-br upgrade
179
+
180
+ ✗ npm não encontrado.
181
+ Instale Node.js e npm em: https://nodejs.org
182
+ ```
183
+
184
+ #### Logs
185
+
186
+ Em caso de erro, um log detalhado será gerado no diretório `/logs` do pacote, com formato `log_yyyy_MM_dd_hh_mm_ss.txt`. O caminho completo do log será exibido na mensagem de erro.
187
+
188
+ **Caminhos de Log por Plataforma:**
189
+
190
+ - **Windows:** `C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\logs\log_2026_02_18_14_30_15.txt`
191
+ - **Linux/MacOS:** `/usr/local/lib/node_modules/specifica-br/logs/log_2026_02_18_14_30_15.txt` (ou caminho semelhante, dependendo da instalação)
192
+
193
+ ## Sistema de Notificações de Atualização
194
+
195
+ A CLI `specifica-br` verifica automaticamente se há atualizações disponíveis no NPM durante a execução dos comandos habilitados.
196
+
197
+ ### Como Funciona
198
+
199
+ 1. Ao executar um comando habilitado (ex: `init`, `help`, `upgrade`), a CLI verifica se existe uma versão mais recente no NPM
200
+ 2. A verificação é assíncrona e não afeta o tempo de execução do comando
201
+ 3. Se uma nova versão estiver disponível, uma notificação será exibida ao final do output
202
+ 4. Funciona em Windows, Linux e MacOS
203
+
204
+ ### Notificação de Atualização
205
+
206
+ Quando uma nova versão estiver disponível, você verá uma mensagem como esta:
207
+
208
+ ```
209
+ Update disponível
210
+
211
+ 1.0.0 → 1.1.0
212
+
213
+ Run specifica-br upgrade (em algum projeto)
214
+ Run npm i -g specifica-br para atualizar
215
+ ```
216
+
217
+ ### Comandos que Exibem Notificações
218
+
219
+ Por padrão, os seguintes comandos verificam atualizações:
220
+ - `init` - Inicializa estrutura SDD
221
+ - `help` - Exibe informações de ajuda
222
+ - `upgrade` - Atualiza a CLI
223
+
224
+ **Nota:** A lista de comandos pode ser configurada editando o arquivo `settings.json`.
225
+
226
+ ### Configuração de Comandos Habilitados
227
+
228
+ Você pode configurar quais comandos da CLI devem verificar atualizações editando o arquivo de configuração.
229
+
230
+ #### Arquivo de Configuração
231
+
232
+ O arquivo `settings.json` está localizado no diretório `assets` do pacote.
233
+
234
+ **Caminho por Plataforma:**
235
+
236
+ - **Desenvolvimento:** `src/assets/settings.json` (no diretório do projeto)
237
+ - **Instalação Global:**
238
+ - **Windows:** `C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\dist\assets\settings.json`
239
+ - **Linux:** `/usr/local/lib/node_modules/specifica-br/dist/assets/settings.json`
240
+ - **MacOS:** `/usr/local/lib/node_modules/specifica-br/dist/assets/settings.json`
241
+
242
+ #### Estrutura do Arquivo
243
+
244
+ ```json
245
+ {
246
+ "enabledUpgradeCommands": ["init", "help", "upgrade"]
247
+ }
248
+ ```
249
+
250
+ #### Modificando a Configuração
251
+
252
+ **Para habilitar verificação em um comando:**
253
+
254
+ Adicione o nome do comando ao array `enabledUpgradeCommands`:
255
+
256
+ ```json
257
+ {
258
+ "enabledUpgradeCommands": ["init", "help", "upgrade", "generate"]
259
+ }
260
+ ```
261
+
262
+ **Para desabilitar verificação em um comando:**
263
+
264
+ Remova o nome do comando do array `enabledUpgradeCommands`:
265
+
266
+ ```json
267
+ {
268
+ "enabledUpgradeCommands": ["init", "help"]
269
+ }
270
+ ```
271
+
272
+ **Para desabilitar todas as verificações:**
273
+
274
+ Use um array vazio:
275
+
276
+ ```json
277
+ {
278
+ "enabledUpgradeCommands": []
279
+ }
280
+ ```
281
+
282
+ #### Editando o Arquivo de Configuração
283
+
284
+ **Windows (PowerShell):**
285
+ ```powershell
286
+ notepad "C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\dist\assets\settings.json"
287
+ ```
288
+
289
+ **Windows (CMD):**
290
+ ```cmd
291
+ notepad "C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\dist\assets\settings.json"
292
+ ```
293
+
294
+ **Linux/MacOS (Nano):**
295
+ ```bash
296
+ nano /usr/local/lib/node_modules/specifica-br/dist/assets/settings.json
297
+ ```
298
+
299
+ **Linux/MacOS (Vim):**
300
+ ```bash
301
+ vi /usr/local/lib/node_modules/specifica-br/dist/assets/settings.json
302
+ ```
303
+
304
+ **Nota:** Dependendo de como o npm está configurado, o caminho de instalação pode variar. Execute `npm root -g` para verificar o caminho global de node_modules no seu sistema.
305
+
306
+ #### Fallback
307
+
308
+ Se o arquivo `settings.json` não for encontrado ou estiver inválido, a CLI usará a configuração padrão:
309
+ ```json
310
+ {
311
+ "enabledUpgradeCommands": ["init", "help", "upgrade"]
312
+ }
313
+ ```
314
+
315
+ ### Compatibilidade
316
+
317
+ Este sistema funciona nativamente em todos os sistemas operacionais:
318
+ - ✅ Windows (10, 11)
319
+ - ✅ Linux (Ubuntu, Debian, Fedora, etc.)
320
+ - ✅ MacOS (todas as versões suportadas pelo Node.js)
105
321
 
106
322
  ## Workflow SDD Completo
107
323
 
@@ -149,7 +365,9 @@ Implementa cada tarefa individualmente seguindo a especificação.
149
365
 
150
366
  ## Estrutura do Projeto
151
367
 
152
- Após executar `specifica-br init`, a estrutura do projeto será:
368
+ Após executar `specifica-br init`, a estrutura do projeto depende da convenção selecionada:
369
+
370
+ **Se opção 1 (OpenCode) for selecionada:**
153
371
 
154
372
  ```
155
373
  seu-projeto/
@@ -167,6 +385,24 @@ seu-projeto/
167
385
  └── tasks-template.md
168
386
  ```
169
387
 
388
+ **Se opção 2 (Specifica-BR) for selecionada:**
389
+
390
+ ```
391
+ seu-projeto/
392
+ ├── specifica-br/
393
+ │ └── commands/
394
+ │ ├── gerar-prd.md
395
+ │ ├── gerar-techspec.md
396
+ │ ├── gerar-tasks.md
397
+ │ └── executar-task.md
398
+ └── specs/
399
+ └── templates/
400
+ ├── prd-template.md
401
+ ├── techspec-template.md
402
+ ├── task-template.md
403
+ └── tasks-template.md
404
+ ```
405
+
170
406
  ## Opções Globais
171
407
 
172
408
  - `-V, --version`: Exibe o número da versão
@@ -1,44 +1,39 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.helpCommand = void 0;
7
- const commander_1 = require("commander");
8
- const chalk_1 = __importDefault(require("chalk"));
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { updateNotifierMiddleware } from '../utils/update-notifier-middleware.js';
9
4
  /**
10
5
  * Exibe o workflow completo de Spec Driven Development (SDD).
11
6
  * Mostra o fluxo detalhado desde a inicialização até a execução de tarefas.
12
7
  */
13
8
  function showCompleteHelp() {
14
9
  console.log('');
15
- console.log(chalk_1.default.cyan.bold('Workflow Completo de Spec Driven Development (SDD)'));
10
+ console.log(chalk.cyan.bold('Workflow Completo de Spec Driven Development (SDD)'));
16
11
  console.log('');
17
- console.log(chalk_1.default.yellow('1. Inicialização:'));
18
- console.log(chalk_1.default.white(' $ specifica init'));
19
- console.log(chalk_1.default.gray(' Cria estrutura de diretórios e templates no projeto.'));
12
+ console.log(chalk.yellow('1. Inicialização:'));
13
+ console.log(chalk.white(' $ specifica init'));
14
+ console.log(chalk.gray(' Cria estrutura de diretórios e templates no projeto.'));
20
15
  console.log('');
21
- console.log(chalk_1.default.yellow('2. Geração de PRD:'));
22
- console.log(chalk_1.default.white(' /gerar-prd [sua ideia]'));
23
- console.log(chalk_1.default.gray(' Define requisitos funcionais e regras de negócio da feature.'));
16
+ console.log(chalk.yellow('2. Geração de PRD:'));
17
+ console.log(chalk.white(' /gerar-prd [sua ideia]'));
18
+ console.log(chalk.gray(' Define requisitos funcionais e regras de negócio da feature.'));
24
19
  console.log('');
25
- console.log(chalk_1.default.yellow('3. Geração de Tech Spec:'));
26
- console.log(chalk_1.default.white(' /gerar-techspec [caminho do prd]'));
27
- console.log(chalk_1.default.gray(' Define arquitetura técnica, componentes e plano de implementação.'));
20
+ console.log(chalk.yellow('3. Geração de Tech Spec:'));
21
+ console.log(chalk.white(' /gerar-techspec [caminho do prd]'));
22
+ console.log(chalk.gray(' Define arquitetura técnica, componentes e plano de implementação.'));
28
23
  console.log('');
29
- console.log(chalk_1.default.yellow('4. Geração de Tarefas:'));
30
- console.log(chalk_1.default.white(' /gerar-tasks [caminho do prd] [caminho do tech spec]'));
31
- console.log(chalk_1.default.gray(' Decompõe o plano técnico em tarefas executáveis.'));
24
+ console.log(chalk.yellow('4. Geração de Tarefas:'));
25
+ console.log(chalk.white(' /gerar-tasks [caminho do prd] [caminho do tech spec]'));
26
+ console.log(chalk.gray(' Decompõe o plano técnico em tarefas executáveis.'));
32
27
  console.log('');
33
- console.log(chalk_1.default.yellow('5. Execução de Tarefas:'));
34
- console.log(chalk_1.default.white(' /executar-task [caminho da task] [prd] [tech spec]'));
35
- console.log(chalk_1.default.gray(' Implementa cada tarefa individualmente seguindo a especificação.'));
28
+ console.log(chalk.yellow('5. Execução de Tarefas:'));
29
+ console.log(chalk.white(' /executar-task [caminho da task] [prd] [tech spec]'));
30
+ console.log(chalk.gray(' Implementa cada tarefa individualmente seguindo a especificação.'));
36
31
  console.log('');
37
- console.log(chalk_1.default.cyan.bold('Benefícios do SDD:'));
32
+ console.log(chalk.cyan.bold('Benefícios do SDD:'));
38
33
  console.log('');
39
- console.log(chalk_1.default.white(' • Documentação antes do código'));
40
- console.log(chalk_1.default.white(' • Redução de retrabalho'));
41
- console.log(chalk_1.default.white(' • Comunicação alinhada entre times'));
34
+ console.log(chalk.white(' • Documentação antes do código'));
35
+ console.log(chalk.white(' • Redução de retrabalho'));
36
+ console.log(chalk.white(' • Comunicação alinhada entre times'));
42
37
  console.log('');
43
38
  }
44
39
  /**
@@ -51,26 +46,29 @@ function runHelpCommand(options) {
51
46
  }
52
47
  else {
53
48
  console.log('');
54
- console.log(chalk_1.default.cyan.bold('Usage:'));
55
- console.log(chalk_1.default.white(' specifica-br [options] [command]'));
49
+ console.log(chalk.cyan.bold('Usage:'));
50
+ console.log(chalk.white(' specifica-br [options] [command]'));
56
51
  console.log('');
57
- console.log(chalk_1.default.cyan.bold('Options:'));
58
- console.log(chalk_1.default.white(' -V, --version output the version number'));
59
- console.log(chalk_1.default.white(' -h, --help display help for command'));
52
+ console.log(chalk.cyan.bold('Options:'));
53
+ console.log(chalk.white(' -V, --version output the version number'));
54
+ console.log(chalk.white(' -h, --help display help for command'));
60
55
  console.log('');
61
- console.log(chalk_1.default.cyan.bold('Commands:'));
62
- console.log(chalk_1.default.white(' init Inicializa estrutura SDD no projeto atual'));
63
- console.log(chalk_1.default.white(' help [command] display help for command'));
64
- console.log(chalk_1.default.white(' upgrade Atualiza templates e comandos (em breve)'));
56
+ console.log(chalk.cyan.bold('Commands:'));
57
+ console.log(chalk.white(' init Inicializa estrutura SDD no projeto atual'));
58
+ console.log(chalk.white(' help [command] display help for command'));
59
+ console.log(chalk.white(' upgrade Atualiza templates e comandos (em breve)'));
65
60
  console.log('');
66
- console.log(chalk_1.default.gray('Para ajuda detalhada, use: specifica-br help --completo'));
61
+ console.log(chalk.gray('Para ajuda detalhada, use: specifica-br help --completo'));
67
62
  console.log('');
68
63
  }
69
64
  }
65
+ async function wrappedRunHelpCommand(options) {
66
+ await updateNotifierMiddleware.wrap('help', async () => { runHelpCommand(options); });
67
+ }
70
68
  /**
71
69
  * Exporta o comando help configurado para uso no Commander.js.
72
70
  */
73
- exports.helpCommand = new commander_1.Command('help')
71
+ export const helpCommand = new Command('help')
74
72
  .description('Exibe ajuda dos comandos disponíveis')
75
73
  .option('--completo', 'Exibe ajuda detalhada com workflow completo')
76
- .action(runHelpCommand);
74
+ .action(wrappedRunHelpCommand);
@@ -1,70 +1,92 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.initCommand = void 0;
7
- const commander_1 = require("commander");
8
- const prompts_1 = __importDefault(require("prompts"));
9
- const file_service_1 = require("../utils/file-service");
10
- const message_formatter_1 = require("../utils/message-formatter");
1
+ import { Command } from 'commander';
2
+ import prompts from 'prompts';
3
+ import { FileService } from '../utils/file-service.js';
4
+ import { showSuccessMessage, showMissionMessage, showErrorMessage, showInfoMessage } from '../utils/message-formatter.js';
5
+ import { updateNotifierMiddleware } from '../utils/update-notifier-middleware.js';
11
6
  async function runInitCommand() {
12
7
  console.log('');
13
8
  console.log('Inicializando estrutura Spec Driven Development...');
14
9
  console.log('');
10
+ const handleSigInt = () => {
11
+ console.log('');
12
+ showErrorMessage('Operação cancelada pelo usuário.');
13
+ process.exit(1);
14
+ };
15
+ const fileService = new FileService();
15
16
  try {
16
- const toolResponse = await (0, prompts_1.default)({
17
- type: 'select',
18
- name: 'tool',
19
- message: 'Selecione a ferramenta de IA:',
20
- choices: [
21
- { title: 'OpenCode', value: 'opencode' }
22
- ],
23
- initial: 0
24
- });
25
- if (!toolResponse.tool) {
26
- (0, message_formatter_1.showErrorMessage)('Operação cancelada pelo usuário.');
27
- process.exit(1);
28
- }
29
- const modelResponse = await (0, prompts_1.default)({
17
+ process.on('SIGINT', handleSigInt);
18
+ const directoryConventionResponse = await prompts({
30
19
  type: 'select',
31
- name: 'model',
32
- message: 'Selecione o modelo de IA:',
20
+ name: 'directoryConvention',
21
+ message: 'Selecione a convenção de diretórios para comandos:',
33
22
  choices: [
34
- { title: 'GLM 4.7', value: 'glm-4.7' }
23
+ { title: 'Recomendado (OpenCode)', value: 'opencode', description: 'Cria diretório .opencode/commands/ para uso com OpenCode' },
24
+ { title: 'Agnóstico (Specifica-BR)', value: 'specifica-br', description: 'Cria diretório specifica-br/commands/ para uso em qualquer IDE/IA' }
35
25
  ],
36
26
  initial: 0
37
27
  });
38
- if (!modelResponse.model) {
39
- (0, message_formatter_1.showErrorMessage)('Operação cancelada pelo usuário.');
28
+ if (!directoryConventionResponse.directoryConvention) {
29
+ showErrorMessage('Operação cancelada pelo usuário.');
40
30
  process.exit(1);
41
31
  }
42
32
  const answers = {
43
- tool: toolResponse.tool,
44
- model: modelResponse.model
33
+ directoryConvention: directoryConventionResponse.directoryConvention
45
34
  };
35
+ if (answers.directoryConvention === 'opencode') {
36
+ const toolResponse = await prompts({
37
+ type: 'select',
38
+ name: 'tool',
39
+ message: 'Selecione a ferramenta de IA:',
40
+ choices: [
41
+ { title: 'OpenCode', value: 'opencode' }
42
+ ],
43
+ initial: 0
44
+ });
45
+ if (!toolResponse.tool) {
46
+ showErrorMessage('Operação cancelada pelo usuário.');
47
+ process.exit(1);
48
+ }
49
+ const modelResponse = await prompts({
50
+ type: 'select',
51
+ name: 'model',
52
+ message: 'Selecione o modelo de IA:',
53
+ choices: [
54
+ { title: 'GLM 4.7', value: 'glm-4.7' }
55
+ ],
56
+ initial: 0
57
+ });
58
+ if (!modelResponse.model) {
59
+ showErrorMessage('Operação cancelada pelo usuário.');
60
+ process.exit(1);
61
+ }
62
+ answers.tool = toolResponse.tool;
63
+ answers.model = modelResponse.model;
64
+ console.log('');
65
+ showInfoMessage(`Ferramenta: ${answers.tool} | Modelo: ${answers.model}`);
66
+ }
46
67
  console.log('');
47
- (0, message_formatter_1.showInfoMessage)(`Ferramenta: ${answers.tool} | Modelo: ${answers.model}`);
48
- console.log('');
49
- (0, message_formatter_1.showInfoMessage)('Criando estrutura de diretórios...');
50
- (0, file_service_1.createDirectories)();
51
- console.log('');
52
- (0, message_formatter_1.showInfoMessage)('Copiando arquivos de templates...');
53
- (0, file_service_1.copyTemplates)();
54
- (0, message_formatter_1.showSuccessMessage)();
55
- (0, message_formatter_1.showMissionMessage)();
56
- process.exit(0);
68
+ showInfoMessage('Criando estrutura de diretórios...');
69
+ console.log(`• Convenção selecionada: ${answers.directoryConvention}`);
70
+ await fileService.createStructure(answers.directoryConvention);
71
+ showSuccessMessage(answers.directoryConvention);
72
+ showMissionMessage();
57
73
  }
58
74
  catch (error) {
59
75
  if (error instanceof Error) {
60
- (0, message_formatter_1.showErrorMessage)(error.message);
76
+ showErrorMessage(error.message);
61
77
  }
62
78
  else {
63
- (0, message_formatter_1.showErrorMessage)('Erro desconhecido ao executar comando init.');
79
+ showErrorMessage('Erro desconhecido ao executar comando init.');
64
80
  }
65
81
  process.exit(1);
66
82
  }
83
+ finally {
84
+ process.off('SIGINT', handleSigInt);
85
+ }
86
+ }
87
+ async function wrappedRunInitCommand() {
88
+ await updateNotifierMiddleware.wrap('init', runInitCommand);
67
89
  }
68
- exports.initCommand = new commander_1.Command('init')
90
+ export const initCommand = new Command('init')
69
91
  .description('Inicializa estrutura SDD no projeto atual')
70
- .action(runInitCommand);
92
+ .action(wrappedRunInitCommand);
@@ -1,5 +1,2 @@
1
1
  import { Command } from 'commander';
2
- /**
3
- * Exporta o comando upgrade configurado para uso no Commander.js.
4
- */
5
2
  export declare const upgradeCommand: Command;
@@ -1,24 +1,95 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.upgradeCommand = void 0;
7
- const commander_1 = require("commander");
8
- const chalk_1 = __importDefault(require("chalk"));
9
- /**
10
- * Função principal do comando upgrade.
11
- * Exibe mensagem informativa sobre o comando em desenvolvimento.
12
- */
13
- function runUpgradeCommand() {
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { exec } from 'child_process';
4
+ import { promisify } from 'util';
5
+ import { platform } from 'os';
6
+ import { logService } from '../utils/log-service.js';
7
+ import { updateNotifierMiddleware } from '../utils/update-notifier-middleware.js';
8
+ const execAsync = promisify(exec);
9
+ function isWindows() {
10
+ return platform() === 'win32';
11
+ }
12
+ async function checkNpmInstalled() {
13
+ try {
14
+ await execAsync('npm --version');
15
+ return true;
16
+ }
17
+ catch (error) {
18
+ return false;
19
+ }
20
+ }
21
+ async function runUpgradeCommand() {
22
+ console.log('');
23
+ console.log(chalk.cyan('Verificando instalação do npm...'));
14
24
  console.log('');
15
- console.log(chalk_1.default.yellow('Comando em desenvolvimento.'));
16
- console.log(chalk_1.default.gray('Em breve você poderá atualizar templates e comandos automaticamente.'));
25
+ const npmInstalled = await checkNpmInstalled();
26
+ if (!npmInstalled) {
27
+ console.log('');
28
+ console.log(chalk.red('✗ npm não encontrado.'));
29
+ console.log(chalk.yellow('Instale Node.js e npm em: https://nodejs.org'));
30
+ console.log('');
31
+ process.exit(1);
32
+ }
33
+ console.log(chalk.green('✓ npm encontrado.'));
17
34
  console.log('');
35
+ console.log(chalk.cyan('Atualizando specifica-br para a versão mais recente...'));
36
+ console.log(chalk.gray('Executando: npm i -g specifica-br@latest'));
37
+ console.log('');
38
+ try {
39
+ const { stdout, stderr } = await execAsync('npm i -g specifica-br@latest', {
40
+ maxBuffer: 1024 * 1024 * 10,
41
+ shell: true
42
+ });
43
+ if (stdout) {
44
+ console.log(stdout);
45
+ }
46
+ if (stderr) {
47
+ console.log(chalk.yellow(stderr));
48
+ }
49
+ console.log('');
50
+ console.log(chalk.green('✓ specifica-br atualizado com sucesso!'));
51
+ console.log('');
52
+ }
53
+ catch (error) {
54
+ if (error instanceof Error) {
55
+ const errorMessage = error.message;
56
+ if (errorMessage.includes('EACCES') || errorMessage.includes('EPERM')) {
57
+ console.log('');
58
+ console.log(chalk.red('✗ Permissão negada.'));
59
+ if (isWindows()) {
60
+ console.log(chalk.yellow('Execute como administrador (clique com botão direito > Executar como administrador)'));
61
+ }
62
+ else {
63
+ console.log(chalk.yellow('Execute: sudo specifica-br upgrade'));
64
+ }
65
+ console.log('');
66
+ process.exit(1);
67
+ }
68
+ console.log('');
69
+ console.log(chalk.red('✗ Erro ao atualizar specifica-br.'));
70
+ const logPath = await logService.logError(error, 'UpgradeCommand');
71
+ console.log(chalk.yellow(`Log detalhado salvo em: ${logPath}`));
72
+ console.log('');
73
+ console.log(chalk.cyan('Tente executar manualmente:'));
74
+ console.log(chalk.gray(' npm i -g specifica-br@latest'));
75
+ if (isWindows()) {
76
+ console.log(chalk.gray(' (Execute como administrador se necessário)'));
77
+ }
78
+ else {
79
+ console.log(chalk.gray(' (Use sudo se necessário)'));
80
+ }
81
+ console.log('');
82
+ process.exit(1);
83
+ }
84
+ console.log('');
85
+ console.log(chalk.red('✗ Erro desconhecido ao executar upgrade.'));
86
+ console.log('');
87
+ process.exit(1);
88
+ }
89
+ }
90
+ async function wrappedRunUpgradeCommand() {
91
+ await updateNotifierMiddleware.wrap('upgrade', runUpgradeCommand);
18
92
  }
19
- /**
20
- * Exporta o comando upgrade configurado para uso no Commander.js.
21
- */
22
- exports.upgradeCommand = new commander_1.Command('upgrade')
23
- .description('Atualiza templates e comandos (em breve)')
24
- .action(runUpgradeCommand);
93
+ export const upgradeCommand = new Command('upgrade')
94
+ .description('Atualiza a CLI para a versão mais recente do NPM')
95
+ .action(wrappedRunUpgradeCommand);
package/dist/index.d.ts CHANGED
@@ -1,2 +1 @@
1
- #!/usr/bin/env node
2
1
  export {};