spec-first-claude 0.6.0-beta.8 → 0.6.0-beta.9
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/bin/cli.js +13 -13
- package/lib/init.js +19 -7
- package/lib/update.js +9 -9
- package/package.json +1 -1
- package/templates/.claude/CHANGELOG.md +28 -0
package/bin/cli.js
CHANGED
|
@@ -8,19 +8,19 @@ const args = process.argv.slice(2);
|
|
|
8
8
|
const command = args[0];
|
|
9
9
|
|
|
10
10
|
function printUsage() {
|
|
11
|
-
console.log('
|
|
12
|
-
console.log(' spec-first-claude init --name=<
|
|
13
|
-
console.log(' spec-first-claude update [--target=<
|
|
11
|
+
console.log('Uso:');
|
|
12
|
+
console.log(' spec-first-claude init --name=<nome-do-projeto> [--target=<caminho>]');
|
|
13
|
+
console.log(' spec-first-claude update [--target=<caminho>] [--force]');
|
|
14
14
|
console.log('');
|
|
15
|
-
console.log('
|
|
16
|
-
console.log(' init
|
|
17
|
-
console.log(' update
|
|
18
|
-
console.log(' (
|
|
15
|
+
console.log('Comandos:');
|
|
16
|
+
console.log(' init Cria um novo projeto spec-first');
|
|
17
|
+
console.log(' update Atualiza projeto existente com arquivos novos do framework');
|
|
18
|
+
console.log(' (adiciona faltantes, atualiza commands/adapters/agents/templates)');
|
|
19
19
|
console.log('');
|
|
20
|
-
console.log('
|
|
21
|
-
console.log(' --name=<
|
|
22
|
-
console.log(' --target=<path>
|
|
23
|
-
console.log(' --force
|
|
20
|
+
console.log('Opções:');
|
|
21
|
+
console.log(' --name=<nome> Nome do projeto (obrigatório no init)');
|
|
22
|
+
console.log(' --target=<path> Diretório destino (default: ./<nome> no init, cwd no update)');
|
|
23
|
+
console.log(' --force Força atualizar TODOS arquivos, não só os do framework (cuidado)');
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
function parseArgs(args) {
|
|
@@ -40,7 +40,7 @@ if (command === 'init') {
|
|
|
40
40
|
const opts = parseArgs(args.slice(1));
|
|
41
41
|
|
|
42
42
|
if (!opts.name) {
|
|
43
|
-
console.error('
|
|
43
|
+
console.error('Erro: --name é obrigatório.\n');
|
|
44
44
|
printUsage();
|
|
45
45
|
process.exit(1);
|
|
46
46
|
}
|
|
@@ -64,7 +64,7 @@ if (command === 'init') {
|
|
|
64
64
|
} else {
|
|
65
65
|
printUsage();
|
|
66
66
|
if (command) {
|
|
67
|
-
console.error(`\
|
|
67
|
+
console.error(`\nComando desconhecido: "${command}"`);
|
|
68
68
|
}
|
|
69
69
|
process.exit(command ? 1 : 0);
|
|
70
70
|
}
|
package/lib/init.js
CHANGED
|
@@ -42,19 +42,31 @@ function init({ name, templatesDir, targetDir }) {
|
|
|
42
42
|
const dest = targetDir || path.resolve(process.cwd(), name);
|
|
43
43
|
|
|
44
44
|
const existed = fs.existsSync(dest);
|
|
45
|
-
console.log(`\n${existed ? '
|
|
45
|
+
console.log(`\n${existed ? 'Inicializando' : 'Criando'} projeto "${name}" em ${dest}\n`);
|
|
46
46
|
|
|
47
47
|
const replacements = { [PLACEHOLDER]: name };
|
|
48
48
|
copyDir(templatesDir, dest, replacements);
|
|
49
49
|
patchProjectName(dest, name);
|
|
50
50
|
|
|
51
|
-
console.log(`
|
|
52
|
-
console.log('\
|
|
51
|
+
console.log(`Pronto! Projeto "${name}" criado.`);
|
|
52
|
+
console.log('\nPróximos passos:');
|
|
53
53
|
console.log(` 1. cd ${name}`);
|
|
54
|
-
console.log(' 2.
|
|
55
|
-
console.log('
|
|
56
|
-
console.log('
|
|
57
|
-
console.log('
|
|
54
|
+
console.log(' 2. Crie uma pasta em workspace/Input/ com os insumos do seu projeto');
|
|
55
|
+
console.log(' (ex: workspace/Input/meu_app/requisitos.md)');
|
|
56
|
+
console.log('');
|
|
57
|
+
console.log(' 3. (Opcional) Configure o backend de input/output:');
|
|
58
|
+
console.log(' cp sfw.config.yml.example sfw.config.yml');
|
|
59
|
+
console.log(' Sem isso, o framework roda 100% local (sem Confluence/etc.)');
|
|
60
|
+
console.log('');
|
|
61
|
+
console.log(' 4. (Opcional, se vai usar Confluence) Prepare o ambiente ANTES de abrir o Claude:');
|
|
62
|
+
console.log(' node .claude/scripts/bootstrap-confluence.js');
|
|
63
|
+
console.log(' Valida uvx, coleta credenciais, gera .mcp.json e pré-cacheia o MCP.');
|
|
64
|
+
console.log(' Evita o ciclo "abrir Claude → faltar dep → reiniciar".');
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log(' 5. Abra o Claude Code no diretório do projeto e rode:');
|
|
67
|
+
console.log(' /sfw-start <nome-da-pasta-em-Input>');
|
|
68
|
+
console.log(' O framework detecta first-run automaticamente (cria docs/) vs feature');
|
|
69
|
+
console.log(' (atualiza docs/ via merge).');
|
|
58
70
|
console.log('');
|
|
59
71
|
}
|
|
60
72
|
|
package/lib/update.js
CHANGED
|
@@ -18,36 +18,36 @@ function update({ templatesDir, targetDir, force }) {
|
|
|
18
18
|
const dest = targetDir || process.cwd();
|
|
19
19
|
|
|
20
20
|
if (!fs.existsSync(dest)) {
|
|
21
|
-
console.error(`
|
|
22
|
-
console.error('
|
|
21
|
+
console.error(`Erro: diretório "${dest}" não existe.`);
|
|
22
|
+
console.error('Rode "spec-first-claude init --name=<nome>" primeiro pra criar o projeto.');
|
|
23
23
|
process.exit(1);
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const claudeDir = path.join(dest, '.claude');
|
|
27
27
|
if (!fs.existsSync(claudeDir)) {
|
|
28
|
-
console.error('
|
|
29
|
-
console.error('
|
|
28
|
+
console.error('Erro: não é um projeto spec-first (pasta .claude/ não encontrada).');
|
|
29
|
+
console.error('Rode "spec-first-claude init --name=<nome>" primeiro.');
|
|
30
30
|
process.exit(1);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
console.log(`\
|
|
33
|
+
console.log(`\nAtualizando projeto em ${dest}\n`);
|
|
34
34
|
|
|
35
35
|
const stats = { added: [], updated: [], skipped: 0 };
|
|
36
36
|
syncDir(templatesDir, dest, force, stats, dest);
|
|
37
37
|
|
|
38
38
|
console.log('');
|
|
39
39
|
if (stats.added.length > 0) {
|
|
40
|
-
console.log(`
|
|
40
|
+
console.log(`Adicionados (${stats.added.length}):`);
|
|
41
41
|
for (const f of stats.added) console.log(` + ${f}`);
|
|
42
42
|
}
|
|
43
43
|
if (stats.updated.length > 0) {
|
|
44
|
-
console.log(`
|
|
44
|
+
console.log(`Atualizados (${stats.updated.length}):`);
|
|
45
45
|
for (const f of stats.updated) console.log(` ~ ${f}`);
|
|
46
46
|
}
|
|
47
47
|
if (stats.added.length === 0 && stats.updated.length === 0) {
|
|
48
|
-
console.log('
|
|
48
|
+
console.log('Já está atualizado — nenhum arquivo novo pra adicionar.');
|
|
49
49
|
} else {
|
|
50
|
-
console.log(`\n${stats.added.length}
|
|
50
|
+
console.log(`\n${stats.added.length} adicionado(s), ${stats.updated.length} atualizado(s), ${stats.skipped} inalterado(s)`);
|
|
51
51
|
}
|
|
52
52
|
console.log('');
|
|
53
53
|
}
|
package/package.json
CHANGED
|
@@ -8,6 +8,34 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## 0.6.0-beta.9 (2026-04-13)
|
|
12
|
+
|
|
13
|
+
### CLI em pt-BR + dica de bootstrap-confluence no init
|
|
14
|
+
|
|
15
|
+
Mensagens do CLI (`init` e `update`) traduzidas para pt-BR — usuário final é o público.
|
|
16
|
+
|
|
17
|
+
Mensagem do `init` reescrita para deixar **explícito o passo opcional de pré-setup
|
|
18
|
+
do Confluence**:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Pronto! Projeto "X" criado.
|
|
22
|
+
|
|
23
|
+
Próximos passos:
|
|
24
|
+
1. cd X
|
|
25
|
+
2. Crie uma pasta em workspace/Input/ com os insumos do seu projeto
|
|
26
|
+
3. (Opcional) Configure o backend de input/output:
|
|
27
|
+
cp sfw.config.yml.example sfw.config.yml
|
|
28
|
+
4. (Opcional, se vai usar Confluence) Prepare o ambiente ANTES de abrir o Claude:
|
|
29
|
+
node .claude/scripts/bootstrap-confluence.js
|
|
30
|
+
5. Abra o Claude Code e rode: /sfw-start <nome-da-pasta>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
O passo 4 era invisível antes — só aparecia inline na "Dica" do skill `/mcp`.
|
|
34
|
+
Agora aparece logo no fim do `init`, no momento exato em que o usuário vai decidir
|
|
35
|
+
se prepara o Confluence ou não.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
11
39
|
## 0.6.0-beta.8 (2026-04-13)
|
|
12
40
|
|
|
13
41
|
### Novo: `bootstrap-confluence.js` (opcional, pré-Claude)
|