specifica-br 1.0.3 → 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 +213 -2
- 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
|
@@ -95,13 +95,224 @@ specifica-br help --completo
|
|
|
95
95
|
|
|
96
96
|
### `specifica-br upgrade`
|
|
97
97
|
|
|
98
|
-
Atualiza
|
|
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
|
-
|
|
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
|
|
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
package/dist/index.js
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
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(
|
|
20
|
-
program.addCommand(
|
|
21
|
-
program.addCommand(
|
|
16
|
+
program.addCommand(initCommand);
|
|
17
|
+
program.addCommand(helpCommand);
|
|
18
|
+
program.addCommand(upgradeCommand);
|
|
22
19
|
program.parse(process.argv);
|
package/dist/types/init.d.ts
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* Representa as escolhas do usuário durante o fluxo interativo.
|
|
4
4
|
*/
|
|
5
5
|
export interface InitAnswers {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
directoryConvention: 'opencode' | 'specifica-br';
|
|
7
|
+
tool?: string;
|
|
8
|
+
model?: string;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Interface para configuração de templates.
|
package/dist/types/init.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|