synapos 2.5.0 → 2.6.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/.synapos/.manifest.json +2 -2
- package/.synapos/VERSION +1 -1
- package/.synapos/core/orchestrator.md +94 -94
- package/bin/synapos.js +7 -22
- package/package.json +1 -1
package/.synapos/.manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"framework": {
|
|
3
3
|
"name": "synapos",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.6.1",
|
|
5
5
|
"released_at": "2026-04-03"
|
|
6
6
|
},
|
|
7
7
|
"best_practices": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"core": {
|
|
27
|
-
"orchestrator": "1.
|
|
27
|
+
"orchestrator": "1.6.1",
|
|
28
28
|
"pipeline_runner": "2.3.0",
|
|
29
29
|
"gate_system": "1.5.0",
|
|
30
30
|
"model_adapter": "1.1.0",
|
package/.synapos/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.6.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: synapos-orchestrator
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.6.1
|
|
4
4
|
description: Meta-orquestrador do Synapos Framework — ponto de entrada universal multi-IDE
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -311,17 +311,42 @@ Construa a lista interna de squads ativos.
|
|
|
311
311
|
|
|
312
312
|
---
|
|
313
313
|
|
|
314
|
+
## PASSO 3.5 — VERIFICAR SQUAD TEMPLATES
|
|
315
|
+
|
|
316
|
+
Verifique se existem subdiretórios em `.synapos/squad-templates/` (ignorar `.gitkeep`).
|
|
317
|
+
|
|
318
|
+
Armazene como `[HAS_TEMPLATES]` (true / false).
|
|
319
|
+
|
|
320
|
+
**Se `[HAS_TEMPLATES]` = false:**
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
AskUserQuestion({
|
|
324
|
+
question: "⚠️ Nenhum squad template instalado.\n\nSem templates não é possível criar squads.\n\nInstale templates com:\n npx synapos add <template>",
|
|
325
|
+
options: [
|
|
326
|
+
{ label: "Encerrar", description: "Fechar o orquestrador" }
|
|
327
|
+
]
|
|
328
|
+
})
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**Pare a execução.** Não continue para PASSO 4.
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
314
335
|
## PASSO 4 — MENU PRINCIPAL
|
|
315
336
|
|
|
316
|
-
**Se existem squads**,
|
|
337
|
+
**Se existem squads**, monte o menu com AskUserQuestion.
|
|
338
|
+
|
|
339
|
+
Regra para a opção "Criar novo squad":
|
|
340
|
+
- **Inclua** `{ label: "✨ Criar novo squad", description: "Montar um novo squad do zero" }` **apenas se** `[HAS_TEMPLATES]` = true.
|
|
341
|
+
- **Se** `[HAS_TEMPLATES]` = false, **não inclua** essa opção e adicione um aviso no `question`: `"\n\n⚠️ Criação de squads indisponível — nenhum template instalado. Execute: npx synapos add <template>"`.
|
|
317
342
|
|
|
318
343
|
```
|
|
319
344
|
AskUserQuestion({
|
|
320
|
-
question: "Olá, {nome do usuário}! Qual squad você quer trabalhar?",
|
|
345
|
+
question: "Olá, {nome do usuário}! Qual squad você quer trabalhar?{aviso se sem templates}",
|
|
321
346
|
options: [
|
|
322
347
|
{ label: "🟢 {slug}", description: "{domain} · {description} (ativo)" },
|
|
323
348
|
{ label: "🟡 {slug}", description: "{domain} · {description} (pausado)" },
|
|
324
|
-
|
|
349
|
+
// ✨ Criar novo squad — incluir SOMENTE se [HAS_TEMPLATES] = true
|
|
325
350
|
]
|
|
326
351
|
})
|
|
327
352
|
```
|
|
@@ -331,12 +356,16 @@ AskUserQuestion({
|
|
|
331
356
|
- 🟡 paused — pausado, pode retomar
|
|
332
357
|
- ✅ completed — entregue
|
|
333
358
|
|
|
334
|
-
**Se não existem squads** → vá direto para PASSO 5.
|
|
359
|
+
**Se não existem squads e `[HAS_TEMPLATES]` = true** → vá direto para PASSO 5.
|
|
360
|
+
|
|
361
|
+
**Se não existem squads e `[HAS_TEMPLATES]` = false** → já foi tratado no PASSO 3.5. Este passo nunca será alcançado nesse estado.
|
|
335
362
|
|
|
336
363
|
---
|
|
337
364
|
|
|
338
365
|
## PASSO 5 — SELEÇÃO DE DOMÍNIO
|
|
339
366
|
|
|
367
|
+
> **Pré-condição:** `[HAS_TEMPLATES]` = true (garantido pelo PASSO 3.5).
|
|
368
|
+
|
|
340
369
|
Liste os subdiretórios em `.synapos/squad-templates/` e leia `template.yaml` para cada um.
|
|
341
370
|
|
|
342
371
|
Monte as opções para AskUserQuestion:
|
|
@@ -352,16 +381,10 @@ AskUserQuestion({
|
|
|
352
381
|
})
|
|
353
382
|
```
|
|
354
383
|
|
|
355
|
-
**
|
|
384
|
+
**Roteamento obrigatório — execute apenas UM dos caminhos abaixo:**
|
|
356
385
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
question: "Nenhum squad template instalado.\n\nInstale templates com: npx synapos",
|
|
360
|
-
options: [
|
|
361
|
-
{ label: "Voltar", description: "Voltar ao menu" }
|
|
362
|
-
]
|
|
363
|
-
})
|
|
364
|
-
```
|
|
386
|
+
- Se o usuário selecionou um template existente → **vá para PASSO 6**. Não execute SQUAD CUSTOMIZADO.
|
|
387
|
+
- Se o usuário selecionou "✨ Customizado" → **vá para SQUAD CUSTOMIZADO**. Não execute PASSO 6.
|
|
365
388
|
|
|
366
389
|
---
|
|
367
390
|
|
|
@@ -464,46 +487,6 @@ AskUserQuestion({
|
|
|
464
487
|
})
|
|
465
488
|
```
|
|
466
489
|
|
|
467
|
-
Seção 6.5 — Feature Session (SELEÇÃO INTERATIVA)
|
|
468
|
-
|
|
469
|
-
**Use AskUserQuestion:**
|
|
470
|
-
|
|
471
|
-
```
|
|
472
|
-
AskUserQuestion({
|
|
473
|
-
question: "Este squad trabalha em qual feature?",
|
|
474
|
-
options: [
|
|
475
|
-
{ label: "📂 Session existente", description: "Selecionar feature já criada" },
|
|
476
|
-
{ label: "✨ Nova feature", description: "Criar nova feature session" }
|
|
477
|
-
]
|
|
478
|
-
})
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
**Se "Session existente":**
|
|
482
|
-
Liste as pastas em `docs/.squads/sessions/` com AskUserQuestion:
|
|
483
|
-
|
|
484
|
-
```
|
|
485
|
-
AskUserQuestion({
|
|
486
|
-
question: "Selecione a feature session:",
|
|
487
|
-
options: [
|
|
488
|
-
{ label: "{feature-slug}", description: "{descrição do state.json}" },
|
|
489
|
-
{ label: "{feature-slug}", description: "{descrição}" }
|
|
490
|
-
]
|
|
491
|
-
})
|
|
492
|
-
```
|
|
493
|
-
|
|
494
|
-
**Se "Nova feature":**
|
|
495
|
-
|
|
496
|
-
```
|
|
497
|
-
AskUserQuestion({
|
|
498
|
-
question: "Qual é o nome/slug da nova feature?",
|
|
499
|
-
options: [
|
|
500
|
-
{ label: "Vou informar", description: "Ex: auth-module, feat/pagamentos" }
|
|
501
|
-
]
|
|
502
|
-
})
|
|
503
|
-
```
|
|
504
|
-
|
|
505
|
-
`{feature-slug}` = lowercase, espaços → hífens, sem caracteres especiais.
|
|
506
|
-
|
|
507
490
|
---
|
|
508
491
|
|
|
509
492
|
## PASSO 7 — CRIAR SQUAD
|
|
@@ -544,8 +527,8 @@ mode: {alta | economico | solo}
|
|
|
544
527
|
execution_mode: {bootstrap | standard | strict} # determinado pelo Mode Decision System no PASSO 2
|
|
545
528
|
doc_score: {0-100} # score de documentação no momento da criação
|
|
546
529
|
created_at: {YYYY-MM-DD}
|
|
547
|
-
feature:
|
|
548
|
-
session:
|
|
530
|
+
feature: "" # preenchido no PASSO 7.5
|
|
531
|
+
session: "" # preenchido no PASSO 7.5
|
|
549
532
|
agents:
|
|
550
533
|
- {id do agent 1}
|
|
551
534
|
- {id do agent 2}
|
|
@@ -558,7 +541,7 @@ project_context:
|
|
|
558
541
|
docs_business: docs/business/
|
|
559
542
|
docs_tech: docs/tech/
|
|
560
543
|
docs_context: docs/tech-context/
|
|
561
|
-
session:
|
|
544
|
+
session: "" # preenchido no PASSO 7.5
|
|
562
545
|
```
|
|
563
546
|
|
|
564
547
|
### 7.3 — Inicializar project-learnings.md (se não existir)
|
|
@@ -576,6 +559,57 @@ Verifique se `docs/_memory/project-learnings.md` existe. Se não existir, crie:
|
|
|
576
559
|
|
|
577
560
|
---
|
|
578
561
|
|
|
562
|
+
## PASSO 7.5 — FEATURE SESSION
|
|
563
|
+
|
|
564
|
+
> **Executar apenas após o squad ter sido criado (arquivos do PASSO 7 já gravados).**
|
|
565
|
+
|
|
566
|
+
**Use AskUserQuestion:**
|
|
567
|
+
|
|
568
|
+
```
|
|
569
|
+
AskUserQuestion({
|
|
570
|
+
question: "Squad {squad-slug} criado! 🎉\n\nAgora, em qual feature este squad vai trabalhar?",
|
|
571
|
+
options: [
|
|
572
|
+
{ label: "📂 Session existente", description: "Selecionar feature já criada" },
|
|
573
|
+
{ label: "✨ Nova feature", description: "Criar nova feature session" }
|
|
574
|
+
]
|
|
575
|
+
})
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
**Se "Session existente":**
|
|
579
|
+
Liste as pastas em `docs/.squads/sessions/` com AskUserQuestion:
|
|
580
|
+
|
|
581
|
+
```
|
|
582
|
+
AskUserQuestion({
|
|
583
|
+
question: "Selecione a feature session:",
|
|
584
|
+
options: [
|
|
585
|
+
{ label: "{feature-slug}", description: "{descrição do state.json}" },
|
|
586
|
+
{ label: "{feature-slug}", description: "{descrição}" }
|
|
587
|
+
]
|
|
588
|
+
})
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
**Se "Nova feature":**
|
|
592
|
+
|
|
593
|
+
```
|
|
594
|
+
AskUserQuestion({
|
|
595
|
+
question: "Qual é o nome/slug da nova feature?",
|
|
596
|
+
options: [
|
|
597
|
+
{ label: "Vou informar", description: "Ex: auth-module, feat/pagamentos" }
|
|
598
|
+
]
|
|
599
|
+
})
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
`{feature-slug}` = lowercase, espaços → hífens, sem caracteres especiais.
|
|
603
|
+
|
|
604
|
+
Após obter o `{feature-slug}`, atualize o campo `feature` e `session` no `squad.yaml` já criado:
|
|
605
|
+
|
|
606
|
+
```yaml
|
|
607
|
+
feature: {feature-slug}
|
|
608
|
+
session: docs/.squads/sessions/{feature-slug}/
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
---
|
|
612
|
+
|
|
579
613
|
## PASSO 8 — ATIVAR SQUAD
|
|
580
614
|
|
|
581
615
|
### 8.1 — Resumo e Confirmação
|
|
@@ -716,51 +750,17 @@ AskUserQuestion({
|
|
|
716
750
|
|
|
717
751
|
Aguarde a seleção do usuário.
|
|
718
752
|
|
|
719
|
-
**Se `status` é `"completed"`, `"discarded"` ou não existe entrada para este squad** → menu padrão:
|
|
720
|
-
|
|
721
|
-
```
|
|
722
|
-
Squad {squad-slug} carregado.
|
|
723
|
-
Feature: {feature-slug}
|
|
724
|
-
Session: docs/.squads/sessions/{feature-slug}/
|
|
725
|
-
|
|
726
|
-
Squads que já trabalharam nesta feature:
|
|
727
|
-
{lista de state.squads com status e completed_at}
|
|
728
|
-
|
|
729
|
-
O que você quer fazer?
|
|
730
|
-
|
|
731
|
-
- 🔄 Nova execução deste squad (manter contexto da session)
|
|
732
|
-
- 🧠 Ver memória da feature
|
|
733
|
-
- 📂 Ver arquivos da session
|
|
734
|
-
- ⏸️ Pausar / arquivar squad
|
|
735
|
-
```
|
|
736
|
-
|
|
737
|
-
Aguarde a seleção do usuário.
|
|
738
|
-
|
|
739
753
|
5. Siga a escolha do usuário e execute via `.synapos/core/pipeline-runner.md`.
|
|
740
754
|
|
|
741
755
|
---
|
|
742
756
|
|
|
743
757
|
## SQUAD CUSTOMIZADO
|
|
744
758
|
|
|
745
|
-
Quando o usuário escolhe
|
|
759
|
+
Quando o usuário escolhe "✨ Customizado" no PASSO 5.
|
|
746
760
|
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
```
|
|
750
|
-
AskUserQuestion({
|
|
751
|
-
question: "Qual é o objetivo deste squad customizado?",
|
|
752
|
-
options: [
|
|
753
|
-
{ label: "Backend API", description: "Foco em endpoints e lógica de servidor" },
|
|
754
|
-
{ label: "Frontend Web", description: "Foco em UI e experiência do usuário" },
|
|
755
|
-
{ label: "Fullstack", description: "Frontend + Backend juntos" },
|
|
756
|
-
{ label: "Mobile", description: "App iOS/Android" },
|
|
757
|
-
{ label: "DevOps/Infra", description: "Infraestrutura e pipelines" },
|
|
758
|
-
{ label: "Outro", description: "Vou descrever o objetivo" }
|
|
759
|
-
]
|
|
760
|
-
})
|
|
761
|
-
```
|
|
761
|
+
> O domínio já foi identificado como "customizado" — não pergunte novamente. Siga diretamente para a configuração abaixo.
|
|
762
762
|
|
|
763
|
-
|
|
763
|
+
1. Leia `.synapos/squad-templates/` e liste todos os agents disponíveis com AskUserQuestion (multi-select)
|
|
764
764
|
|
|
765
765
|
3. **Seleção de pipeline:**
|
|
766
766
|
|
package/bin/synapos.js
CHANGED
|
@@ -31,7 +31,7 @@ const PACKAGE_DIR = path.join(__dirname, '..');
|
|
|
31
31
|
const VERSION = (() => {
|
|
32
32
|
try {
|
|
33
33
|
return JSON.parse(fs.readFileSync(path.join(PACKAGE_DIR, 'package.json'), 'utf8')).version;
|
|
34
|
-
} catch { return '2.
|
|
34
|
+
} catch { return '2.6.1'; }
|
|
35
35
|
})();
|
|
36
36
|
|
|
37
37
|
// Squad definitions — value = folder name in squad-templates/
|
|
@@ -162,8 +162,8 @@ ${bold('OPÇÕES')}
|
|
|
162
162
|
-h, --help Exibe esta ajuda
|
|
163
163
|
|
|
164
164
|
${bold('EXEMPLOS')}
|
|
165
|
-
npx synapos
|
|
166
|
-
npx synapos front Instala squad Frontend
|
|
165
|
+
npx synapos Instala todos os squads + seleciona IDE
|
|
166
|
+
npx synapos front Instala só o squad Frontend
|
|
167
167
|
npx synapos front back Instala Frontend + Backend
|
|
168
168
|
npx synapos front back devops Instala múltiplos squads
|
|
169
169
|
`);
|
|
@@ -180,7 +180,7 @@ ${bold('EXEMPLOS')}
|
|
|
180
180
|
process.exit(1);
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
// ── 1. Resolver squads via args ou
|
|
183
|
+
// ── 1. Resolver squads via args ou instalar todos por padrão ─────────────────
|
|
184
184
|
let selectedSquadIds = [];
|
|
185
185
|
|
|
186
186
|
if (args.length > 0) {
|
|
@@ -194,24 +194,9 @@ ${bold('EXEMPLOS')}
|
|
|
194
194
|
info(`Squads selecionados via argumento: ${selectedSquadIds.join(', ')}`);
|
|
195
195
|
nl();
|
|
196
196
|
} else {
|
|
197
|
-
//
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
name: 'selected',
|
|
201
|
-
message: 'Quais squads você quer instalar?',
|
|
202
|
-
choices: SQUADS.map(s => ({
|
|
203
|
-
title: s.title,
|
|
204
|
-
value: s.value,
|
|
205
|
-
description: s.description,
|
|
206
|
-
selected: false,
|
|
207
|
-
})),
|
|
208
|
-
hint: '- Espaço para selecionar, Enter para confirmar',
|
|
209
|
-
instructions: false,
|
|
210
|
-
min: 1,
|
|
211
|
-
}, { onCancel: () => { nl(); process.exit(0); } });
|
|
212
|
-
|
|
213
|
-
if (!selected || selected.length === 0) process.exit(0);
|
|
214
|
-
selectedSquadIds = selected;
|
|
197
|
+
// Instalar todos os squads disponíveis
|
|
198
|
+
selectedSquadIds = SQUADS.map(s => s.value);
|
|
199
|
+
info(`Instalando todos os squads disponíveis (${selectedSquadIds.length})`);
|
|
215
200
|
nl();
|
|
216
201
|
}
|
|
217
202
|
|
package/package.json
CHANGED