specifica-br 1.0.2 → 1.1.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.
package/README.md CHANGED
@@ -95,13 +95,224 @@ specifica-br help --completo
95
95
 
96
96
  ### `specifica-br upgrade`
97
97
 
98
- Atualiza templates e comandos (em breve).
98
+ Atualiza a CLI para a versão mais recente do NPM.
99
99
 
100
100
  ```bash
101
101
  specifica-br upgrade
102
102
  ```
103
103
 
104
- **Nota:** Este comando está em desenvolvimento e estará disponível em uma versão futura.
104
+ #### Requisitos
105
+
106
+ - **npm instalado:** O comando npm deve estar disponível no sistema
107
+ - **Permissões:** Dependendo do sistema operacional, pode ser necessário executar com permissões elevadas
108
+
109
+ #### Instruções por Plataforma
110
+
111
+ **Windows:**
112
+
113
+ - Execute o comando normalmente
114
+ - Se receber erro de permissão, clique com botão direito no terminal/CMD e selecione "Executar como administrador"
115
+ - Alternativamente, abra PowerShell como administrador e execute o comando
116
+
117
+ **Linux:**
118
+
119
+ - Execute o comando normalmente
120
+ - Se receber erro de permissão, use `sudo`:
121
+ ```bash
122
+ sudo specifica-br upgrade
123
+ ```
124
+
125
+ **MacOS:**
126
+
127
+ - Execute o comando normalmente
128
+ - Se receber erro de permissão, use `sudo`:
129
+ ```bash
130
+ sudo specifica-br upgrade
131
+ ```
132
+
133
+ #### Exemplos
134
+
135
+ **Atualização bem-sucedida:**
136
+
137
+ ```bash
138
+ $ specifica-br upgrade
139
+
140
+ Verificando instalação do npm...
141
+
142
+ ✓ npm encontrado.
143
+
144
+ Atualizando specifica-br para a versão mais recente...
145
+ Executando: npm i -g specifica-br@latest
146
+
147
+ [output do npm]
148
+
149
+ ✓ specifica-br atualizado com sucesso!
150
+ ```
151
+
152
+ **Erro de permissão no Windows:**
153
+
154
+ ```bash
155
+ $ specifica-br upgrade
156
+
157
+ ✗ Permissão negada.
158
+ Execute como administrador (clique com botão direito > Executar como administrador)
159
+ ```
160
+
161
+ **Erro de permissão no Linux/MacOS:**
162
+
163
+ ```bash
164
+ $ specifica-br upgrade
165
+
166
+ ✗ Permissão negada.
167
+ Execute: sudo specifica-br upgrade
168
+ ```
169
+
170
+ **npm não encontrado:**
171
+
172
+ ```bash
173
+ $ specifica-br upgrade
174
+
175
+ ✗ npm não encontrado.
176
+ Instale Node.js e npm em: https://nodejs.org
177
+ ```
178
+
179
+ #### Logs
180
+
181
+ 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.
182
+
183
+ **Caminhos de Log por Plataforma:**
184
+
185
+ - **Windows:** `C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\logs\log_2026_02_18_14_30_15.txt`
186
+ - **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)
187
+
188
+ ## Sistema de Notificações de Atualização
189
+
190
+ A CLI `specifica-br` verifica automaticamente se há atualizações disponíveis no NPM durante a execução dos comandos habilitados.
191
+
192
+ ### Como Funciona
193
+
194
+ 1. Ao executar um comando habilitado (ex: `init`, `help`, `upgrade`), a CLI verifica se existe uma versão mais recente no NPM
195
+ 2. A verificação é assíncrona e não afeta o tempo de execução do comando
196
+ 3. Se uma nova versão estiver disponível, uma notificação será exibida ao final do output
197
+ 4. Funciona em Windows, Linux e MacOS
198
+
199
+ ### Notificação de Atualização
200
+
201
+ Quando uma nova versão estiver disponível, você verá uma mensagem como esta:
202
+
203
+ ```
204
+ Update disponível
205
+
206
+ 1.0.0 → 1.1.0
207
+
208
+ Run specifica-br upgrade (em algum projeto)
209
+ Run npm i -g specifica-br para atualizar
210
+ ```
211
+
212
+ ### Comandos que Exibem Notificações
213
+
214
+ Por padrão, os seguintes comandos verificam atualizações:
215
+ - `init` - Inicializa estrutura SDD
216
+ - `help` - Exibe informações de ajuda
217
+ - `upgrade` - Atualiza a CLI
218
+
219
+ **Nota:** A lista de comandos pode ser configurada editando o arquivo `settings.json`.
220
+
221
+ ### Configuração de Comandos Habilitados
222
+
223
+ Você pode configurar quais comandos da CLI devem verificar atualizações editando o arquivo de configuração.
224
+
225
+ #### Arquivo de Configuração
226
+
227
+ O arquivo `settings.json` está localizado no diretório `assets` do pacote.
228
+
229
+ **Caminho por Plataforma:**
230
+
231
+ - **Desenvolvimento:** `src/assets/settings.json` (no diretório do projeto)
232
+ - **Instalação Global:**
233
+ - **Windows:** `C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\dist\assets\settings.json`
234
+ - **Linux:** `/usr/local/lib/node_modules/specifica-br/dist/assets/settings.json`
235
+ - **MacOS:** `/usr/local/lib/node_modules/specifica-br/dist/assets/settings.json`
236
+
237
+ #### Estrutura do Arquivo
238
+
239
+ ```json
240
+ {
241
+ "enabledUpgradeCommands": ["init", "help", "upgrade"]
242
+ }
243
+ ```
244
+
245
+ #### Modificando a Configuração
246
+
247
+ **Para habilitar verificação em um comando:**
248
+
249
+ Adicione o nome do comando ao array `enabledUpgradeCommands`:
250
+
251
+ ```json
252
+ {
253
+ "enabledUpgradeCommands": ["init", "help", "upgrade", "generate"]
254
+ }
255
+ ```
256
+
257
+ **Para desabilitar verificação em um comando:**
258
+
259
+ Remova o nome do comando do array `enabledUpgradeCommands`:
260
+
261
+ ```json
262
+ {
263
+ "enabledUpgradeCommands": ["init", "help"]
264
+ }
265
+ ```
266
+
267
+ **Para desabilitar todas as verificações:**
268
+
269
+ Use um array vazio:
270
+
271
+ ```json
272
+ {
273
+ "enabledUpgradeCommands": []
274
+ }
275
+ ```
276
+
277
+ #### Editando o Arquivo de Configuração
278
+
279
+ **Windows (PowerShell):**
280
+ ```powershell
281
+ notepad "C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\dist\assets\settings.json"
282
+ ```
283
+
284
+ **Windows (CMD):**
285
+ ```cmd
286
+ notepad "C:\Users\[usuario]\AppData\Roaming\npm\node_modules\specifica-br\dist\assets\settings.json"
287
+ ```
288
+
289
+ **Linux/MacOS (Nano):**
290
+ ```bash
291
+ nano /usr/local/lib/node_modules/specifica-br/dist/assets/settings.json
292
+ ```
293
+
294
+ **Linux/MacOS (Vim):**
295
+ ```bash
296
+ vi /usr/local/lib/node_modules/specifica-br/dist/assets/settings.json
297
+ ```
298
+
299
+ **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.
300
+
301
+ #### Fallback
302
+
303
+ Se o arquivo `settings.json` não for encontrado ou estiver inválido, a CLI usará a configuração padrão:
304
+ ```json
305
+ {
306
+ "enabledUpgradeCommands": ["init", "help", "upgrade"]
307
+ }
308
+ ```
309
+
310
+ ### Compatibilidade
311
+
312
+ Este sistema funciona nativamente em todos os sistemas operacionais:
313
+ - ✅ Windows (10, 11)
314
+ - ✅ Linux (Ubuntu, Debian, Fedora, etc.)
315
+ - ✅ MacOS (todas as versões suportadas pelo Node.js)
105
316
 
106
317
  ## Workflow SDD Completo
107
318
 
@@ -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 {};
package/dist/index.js CHANGED
@@ -1,22 +1,19 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const commander_1 = require("commander");
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
- const path_1 = __importDefault(require("path"));
10
- const init_1 = require("./commands/init");
11
- const help_1 = require("./commands/help");
12
- const upgrade_1 = require("./commands/upgrade");
13
- const packageJson = JSON.parse(fs_extra_1.default.readFileSync(path_1.default.join(__dirname, '..', 'package.json'), 'utf-8'));
14
- const program = new commander_1.Command();
2
+ import { Command } from 'commander';
3
+ import fs from 'fs-extra';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { initCommand } from './commands/init.js';
7
+ import { helpCommand } from './commands/help.js';
8
+ import { upgradeCommand } from './commands/upgrade.js';
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8'));
11
+ const program = new Command();
15
12
  program
16
13
  .name('specifica-br')
17
14
  .description('Ferramenta de automação para desenvolvimento guiado por especificações (Spec Driven Development - SDD) com IA. Otimizado para o ecossistema brasileiro.')
18
15
  .version(packageJson.version);
19
- program.addCommand(init_1.initCommand);
20
- program.addCommand(help_1.helpCommand);
21
- program.addCommand(upgrade_1.upgradeCommand);
16
+ program.addCommand(initCommand);
17
+ program.addCommand(helpCommand);
18
+ program.addCommand(upgradeCommand);
22
19
  program.parse(process.argv);
@@ -0,0 +1,4 @@
1
+ {
2
+ "enabledUpgradeCommands": ["init", "upgrade"],
3
+ "versionCheckTimeoutMs": 1500
4
+ }
@@ -3,8 +3,9 @@
3
3
  * Representa as escolhas do usuário durante o fluxo interativo.
4
4
  */
5
5
  export interface InitAnswers {
6
- tool: string;
7
- model: string;
6
+ directoryConvention: 'opencode' | 'specifica-br';
7
+ tool?: string;
8
+ model?: string;
8
9
  }
9
10
  /**
10
11
  * Interface para configuração de templates.
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};