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 +241 -5
- package/dist/commands/help.js +38 -40
- package/dist/commands/init.js +67 -45
- package/dist/commands/upgrade.d.ts +0 -3
- package/dist/commands/upgrade.js +92 -21
- package/dist/index.d.ts +0 -1
- package/dist/index.js +13 -16
- package/dist/settings.json +4 -0
- package/dist/types/init.d.ts +3 -2
- package/dist/types/init.js +1 -2
- package/dist/types/settings.d.ts +9 -0
- package/dist/types/settings.js +1 -0
- package/dist/utils/file-service.d.ts +5 -2
- package/dist/utils/file-service.js +65 -98
- package/dist/utils/log-service.d.ts +7 -0
- package/dist/utils/log-service.js +48 -0
- package/dist/utils/message-formatter.d.ts +1 -1
- package/dist/utils/message-formatter.js +47 -50
- package/dist/utils/settings-service.d.ts +6 -0
- package/dist/utils/settings-service.js +26 -0
- package/dist/utils/update-notifier-middleware.d.ts +59 -0
- package/dist/utils/update-notifier-middleware.js +276 -0
- package/package.json +11 -5
package/README.md
CHANGED
|
@@ -40,9 +40,10 @@ specifica-br init
|
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
**O que faz:**
|
|
43
|
-
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
package/dist/commands/help.js
CHANGED
|
@@ -1,44 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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(
|
|
10
|
+
console.log(chalk.cyan.bold('Workflow Completo de Spec Driven Development (SDD)'));
|
|
16
11
|
console.log('');
|
|
17
|
-
console.log(
|
|
18
|
-
console.log(
|
|
19
|
-
console.log(
|
|
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(
|
|
22
|
-
console.log(
|
|
23
|
-
console.log(
|
|
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(
|
|
26
|
-
console.log(
|
|
27
|
-
console.log(
|
|
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(
|
|
30
|
-
console.log(
|
|
31
|
-
console.log(
|
|
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(
|
|
34
|
-
console.log(
|
|
35
|
-
console.log(
|
|
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(
|
|
32
|
+
console.log(chalk.cyan.bold('Benefícios do SDD:'));
|
|
38
33
|
console.log('');
|
|
39
|
-
console.log(
|
|
40
|
-
console.log(
|
|
41
|
-
console.log(
|
|
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(
|
|
55
|
-
console.log(
|
|
49
|
+
console.log(chalk.cyan.bold('Usage:'));
|
|
50
|
+
console.log(chalk.white(' specifica-br [options] [command]'));
|
|
56
51
|
console.log('');
|
|
57
|
-
console.log(
|
|
58
|
-
console.log(
|
|
59
|
-
console.log(
|
|
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(
|
|
62
|
-
console.log(
|
|
63
|
-
console.log(
|
|
64
|
-
console.log(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
74
|
+
.action(wrappedRunHelpCommand);
|
package/dist/commands/init.js
CHANGED
|
@@ -1,70 +1,92 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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: '
|
|
32
|
-
message: 'Selecione
|
|
20
|
+
name: 'directoryConvention',
|
|
21
|
+
message: 'Selecione a convenção de diretórios para comandos:',
|
|
33
22
|
choices: [
|
|
34
|
-
{ title: '
|
|
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 (!
|
|
39
|
-
|
|
28
|
+
if (!directoryConventionResponse.directoryConvention) {
|
|
29
|
+
showErrorMessage('Operação cancelada pelo usuário.');
|
|
40
30
|
process.exit(1);
|
|
41
31
|
}
|
|
42
32
|
const answers = {
|
|
43
|
-
|
|
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
|
-
|
|
48
|
-
console.log(
|
|
49
|
-
|
|
50
|
-
(
|
|
51
|
-
|
|
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
|
-
|
|
76
|
+
showErrorMessage(error.message);
|
|
61
77
|
}
|
|
62
78
|
else {
|
|
63
|
-
|
|
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
|
-
|
|
90
|
+
export const initCommand = new Command('init')
|
|
69
91
|
.description('Inicializa estrutura SDD no projeto atual')
|
|
70
|
-
.action(
|
|
92
|
+
.action(wrappedRunInitCommand);
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,24 +1,95 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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