spec-first-copilot 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/.github/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-copilot init --name=<
|
|
13
|
-
console.log(' spec-first-copilot update [--target=<
|
|
11
|
+
console.log('Uso:');
|
|
12
|
+
console.log(' spec-first-copilot init --name=<nome-do-projeto> [--target=<caminho>]');
|
|
13
|
+
console.log(' spec-first-copilot 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 skills/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 VS Code:');
|
|
62
|
+
console.log(' node .github/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 Copilot → faltar dep → reiniciar VS Code".');
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log(' 5. Abra o VS Code com Copilot Chat e rode:');
|
|
67
|
+
console.log(' /sf-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
|
@@ -20,36 +20,36 @@ function update({ templatesDir, targetDir, force }) {
|
|
|
20
20
|
const dest = targetDir || process.cwd();
|
|
21
21
|
|
|
22
22
|
if (!fs.existsSync(dest)) {
|
|
23
|
-
console.error(`
|
|
24
|
-
console.error('
|
|
23
|
+
console.error(`Erro: diretório "${dest}" não existe.`);
|
|
24
|
+
console.error('Rode "spec-first-copilot init --name=<nome>" primeiro pra criar o projeto.');
|
|
25
25
|
process.exit(1);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
const githubDir = path.join(dest, '.github');
|
|
29
29
|
if (!fs.existsSync(githubDir)) {
|
|
30
|
-
console.error('
|
|
31
|
-
console.error('
|
|
30
|
+
console.error('Erro: não é um projeto spec-first (pasta .github/ não encontrada).');
|
|
31
|
+
console.error('Rode "spec-first-copilot init --name=<nome>" primeiro.');
|
|
32
32
|
process.exit(1);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
console.log(`\
|
|
35
|
+
console.log(`\nAtualizando projeto em ${dest}\n`);
|
|
36
36
|
|
|
37
37
|
const stats = { added: [], updated: [], skipped: 0 };
|
|
38
38
|
syncDir(templatesDir, dest, force, stats, dest);
|
|
39
39
|
|
|
40
40
|
console.log('');
|
|
41
41
|
if (stats.added.length > 0) {
|
|
42
|
-
console.log(`
|
|
42
|
+
console.log(`Adicionados (${stats.added.length}):`);
|
|
43
43
|
for (const f of stats.added) console.log(` + ${f}`);
|
|
44
44
|
}
|
|
45
45
|
if (stats.updated.length > 0) {
|
|
46
|
-
console.log(`
|
|
46
|
+
console.log(`Atualizados (${stats.updated.length}):`);
|
|
47
47
|
for (const f of stats.updated) console.log(` ~ ${f}`);
|
|
48
48
|
}
|
|
49
49
|
if (stats.added.length === 0 && stats.updated.length === 0) {
|
|
50
|
-
console.log('
|
|
50
|
+
console.log('Já está atualizado — nenhum arquivo novo pra adicionar.');
|
|
51
51
|
} else {
|
|
52
|
-
console.log(`\n${stats.added.length}
|
|
52
|
+
console.log(`\n${stats.added.length} adicionado(s), ${stats.updated.length} atualizado(s), ${stats.skipped} inalterado(s)`);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
console.log('');
|
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 VS Code:
|
|
29
|
+
node .github/scripts/bootstrap-confluence.js
|
|
30
|
+
5. Abra o VS Code com Copilot Chat e rode: /sf-start <nome-da-pasta>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
O passo 4 era invisível antes — só aparecia inline na "Dica" do skill `/sf-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é-Copilot)
|