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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "framework": {
3
3
  "name": "synapos",
4
- "version": "2.5.0",
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.5.0",
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.5.0
1
+ 2.6.1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: synapos-orchestrator
3
- version: 1.5.0
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**, use AskUserQuestion:
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
- { label: "✨ Criar novo squad", description: "Montar um novo squad do zero" }
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
- **Se nenhum template for encontrado:** use AskUserQuestion para informar:
384
+ **Roteamento obrigatório execute apenas UM dos caminhos abaixo:**
356
385
 
357
- ```
358
- AskUserQuestion({
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: {feature-slug}
548
- session: docs/.squads/sessions/{feature-slug}/
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: docs/.squads/sessions/{feature-slug}/
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 squad customizado:
759
+ Quando o usuário escolhe "✨ Customizado" no PASSO 5.
746
760
 
747
- 1. **Pergunte o domínio/objetivo com AskUserQuestion:**
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
- 2. Leia `.synapos/squad-templates/` e liste todos os agents disponíveis com AskUserQuestion (multi-select)
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.5.0'; }
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 Seleção interativa de squads
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 seleção interativa ────────────────────────
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
- // Seleção interativa
198
- const { selected } = await prompts({
199
- type: 'multiselect',
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synapos",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "description": "Synapos Framework — AI agent orchestration for multi-IDE development",
5
5
  "keywords": ["ai", "agents", "claude", "cursor", "framework", "orchestration", "llm"],
6
6
  "author": "",