edusquads-cli 0.2.1 → 0.2.2

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.
@@ -87,10 +87,14 @@ Operar squads multiagente no Claude Code com comportamento semelhante ao OpenSqu
87
87
  - Toda saída deve conter critério de qualidade.
88
88
 
89
89
  ## Memória do usuário (obrigatório)
90
- ### Arquivo
91
- - `_edusquads/memoria/USUARIO-ATIVO.md`
90
+ ### Arquivos
91
+ - ativo: `_edusquads/memoria/USUARIO-ATIVO.md`
92
+ - modelo: `_edusquads/memoria/USUARIO-MODELO.md`
93
+ - perfis: `_edusquads/memoria/usuarios/<slug>.md`
92
94
 
93
95
  ### Campos críticos
96
+ - nome preferido
97
+ - projeto/negócio
94
98
  - nicho
95
99
  - público-alvo
96
100
  - objetivo principal
@@ -99,9 +103,19 @@ Operar squads multiagente no Claude Code com comportamento semelhante ao OpenSqu
99
103
 
100
104
  ### Fluxo de memória
101
105
  1. Ler memória ativa.
102
- 2. Se campo crítico faltar, perguntar objetivamente (1-3 perguntas curtas).
103
- 3. Atualizar o arquivo de memória com os novos dados.
104
- 4. então propor plano de squads.
106
+ 2. Se campo crítico faltar, iniciar onboarding de briefing completo.
107
+ 3. Salvar briefing no perfil individual (`usuarios/<slug>.md`).
108
+ 4. Atualizar `USUARIO-ATIVO.md` com o briefing coletado.
109
+ 5. Só então propor plano de squads.
110
+
111
+ ### Roteiro de briefing obrigatório
112
+ 1. identidade da pessoa (nome, papel)
113
+ 2. negócio/oferta principal
114
+ 3. público-alvo e nicho
115
+ 4. objetivo principal (30-90 dias)
116
+ 5. canais e formato preferido
117
+ 6. restrições (tempo, equipe, orçamento)
118
+ 7. stack, ativos e dados disponíveis
105
119
 
106
120
  ## Modo de comando `/edusquads`
107
121
  Interpretar intenção do usuário por subcomando semântico.
@@ -110,9 +124,11 @@ Interpretar intenção do usuário por subcomando semântico.
110
124
  - Diagnóstico rápido e sugestão do próximo passo.
111
125
 
112
126
  ### `/edusquads init`
113
- - Inicializa memória do usuário.
114
- - Coleta dados críticos.
115
- - Define ponto de partida do sistema.
127
+ - Inicia onboarding do usuário.
128
+ - Coleta briefing completo e salva perfil + usuário ativo.
129
+
130
+ ### `/edusquads onboarding`
131
+ - Força nova coleta de briefing para troca/atualização de usuário.
116
132
 
117
133
  ### `/edusquads status`
118
134
  - Resume estado atual: memória, squads sugeridos, artefatos-chave.
package/README.md CHANGED
@@ -29,8 +29,13 @@ npx edusquads-cli install --ide claude,codex,opencode,kilocode,antigravity
29
29
  npx edusquads-cli install --ide all
30
30
  npx edusquads-cli install --force
31
31
  npx edusquads-cli install --dry-run
32
+ npx edusquads-cli install --skip-onboarding
32
33
  ```
33
34
 
35
+ Após instalar, o CLI pergunta no terminal se a pessoa quer preencher o briefing na hora.
36
+ Se aceitar, ele executa onboarding e grava a memória automaticamente.
37
+
38
+
34
39
  Depois da instalação, abra o projeto no Claude Code e use:
35
40
 
36
41
  - `/edusquads`
@@ -43,7 +48,7 @@ Como o Claude Code suporta skills em `.claude/skills/<nome>/SKILL.md`, a skill `
43
48
  - `especialistas/`: biblioteca de fundamentos por especialista
44
49
  - `squads/`: definição dos squads e agentes oficiais
45
50
  - `pesquisa/web/`: sínteses com fontes públicas
46
- - `_edusquads/memoria/`: memória operacional do usuário
51
+ - `_edusquads/memoria/`: memória operacional do usuário (ativo + perfis em `usuarios/`)
47
52
  - `_edusquads/runs/`: histórico de execuções do `/edusquads`
48
53
  - `_edusquads/browser_profile/`: sessão local de navegação (Playwright)
49
54
  - `_edusquads/evidencias/`: evidências de investigação web
@@ -1,42 +1,40 @@
1
1
  # Memória do Usuário Ativo
2
2
 
3
3
  ## Identidade
4
- - Nome preferido: não informado
5
- - Projeto/negócio: EduSquads
6
- - Papel do usuário: arquiteto/produto do framework
4
+ - Nome preferido:
5
+ - Projeto/negócio:
6
+ - Papel do usuário:
7
7
 
8
8
  ## Estado atual
9
- - Nicho principal: framework de squads de IA para Claude Code
10
- - Público-alvo: equipes, creators e operadores que querem executar pipelines multiagente
11
- - Oferta principal: sistema `/edusquads` com squads interligados e memória operacional
12
- - Maturidade da operação (inicial/intermediária/avançada): intermediária (arquitetura já estruturada)
9
+ - Nicho principal:
10
+ - Público-alvo:
11
+ - Oferta principal:
12
+ - Maturidade da operação (inicial/intermediária/avançada):
13
13
 
14
14
  ## Objetivos em andamento
15
- - Objetivo principal (30-90 dias): paridade funcional base com OpenSquad no Claude via `/edusquads`
16
- - Objetivo secundário: consolidar integração entre squads e catálogo operacional
17
- - KPI principal: capacidade de iniciar objetivo e receber plano/execução multi-squad com memória aplicada
15
+ - Objetivo principal (30-90 dias):
16
+ - Objetivo secundário:
17
+ - KPI principal:
18
18
 
19
19
  ## Preferências
20
- - Canais prioritários: não informado
21
- - Estilo de comunicação: direto, prático, em PT-BR
22
- - Formato de entrega preferido: estrutura operacional com arquivos e comandos
20
+ - Canais prioritários:
21
+ - Estilo de comunicação:
22
+ - Formato de entrega preferido:
23
23
 
24
24
  ## Restrições
25
- - Tempo disponível: não informado
26
- - Equipe disponível: não informado
27
- - Orçamento aproximado: não informado
28
- - Limites operacionais: manter padrão de fundamento por especialista e comando único `/edusquads`
25
+ - Tempo disponível:
26
+ - Equipe disponível:
27
+ - Orçamento aproximado:
28
+ - Limites operacionais:
29
29
 
30
30
  ## Stack e ativos
31
- - Ferramentas atuais: Claude Code + skills locais
32
- - Ativos existentes (lista/email/site/perfis): base de squads, agentes, especialistas e matrizes já criada neste repositório
33
- - Dados disponíveis: documentação interna do projeto + pesquisas web registradas
31
+ - Ferramentas atuais:
32
+ - Ativos existentes (lista/email/site/perfis):
33
+ - Dados disponíveis:
34
34
 
35
35
  ## Histórico de decisões
36
- - [x] comando principal adotado: `/edusquads`
37
- - [x] estrutura oficial: 16 squads e 160 agentes
38
- - [x] memória ativa do usuário em `_edusquads/memoria/USUARIO-ATIVO.md`
36
+ - [ ]
39
37
 
40
38
  ## Última atualização
41
- - Data: 2026-04-11
42
- - Origem da atualização: consolidação automática a partir da conversa atual
39
+ - Data:
40
+ - Origem da atualização:
@@ -6,7 +6,10 @@
6
6
 
7
7
  ## Subcomandos semânticos (via args)
8
8
  - `/edusquads init`
9
- - inicializa memória do usuário e contexto do projeto
9
+ - inicia onboarding e coleta briefing completo da pessoa usuária
10
+ - salva perfil em `_edusquads/memoria/usuarios/` e atualiza `USUARIO-ATIVO.md`
11
+ - `/edusquads onboarding`
12
+ - força nova coleta de briefing para troca/atualização de usuário
10
13
  - `/edusquads status`
11
14
  - resume estado dos squads, memória e artefatos
12
15
  - `/edusquads memoria`
@@ -28,13 +31,18 @@
28
31
  - inicia fluxo de autenticação manual para sessão Playwright
29
32
  - `/edusquads revogar-sessoes`
30
33
  - remove sessão local persistida em `_edusquads/browser_profile/`
34
+ - `/edusquads estruturar-coleta <run_id>`
35
+ - converte coleta bruta em sinais estruturados por plataforma
36
+ - usa `python base/scripts/edusquads_estruturar_coleta.py`
31
37
  - `/edusquads concluir-investigacao <run_id>`
32
38
  - preenche síntese/extrações automaticamente e fecha run
33
39
  - usa `python base/scripts/edusquads_concluir_investigacao.py`
34
40
 
35
41
  ## Regras
36
42
  - todos os subcomandos usam `_edusquads/memoria/USUARIO-ATIVO.md`
37
- - se memória crítica estiver vazia, coletar antes de executar o plano
43
+ - onboarding é obrigatório quando memória crítica estiver vazia
44
+ - onboarding pode ser executado por `base/scripts/edusquads_onboarding_memoria.py`
45
+ - onboarding deve salvar perfil em `_edusquads/memoria/usuarios/` e atualizar `USUARIO-ATIVO.md`
38
46
  - cada execução relevante deve gerar/atualizar um run em `_edusquads/runs/`
39
47
  - toda investigação web deve seguir `base/protocolo-playwright-edusquads.md`
40
48
  - toda investigação web deve aplicar o playbook da plataforma em `base/playbooks/investigacao/`
@@ -42,5 +50,4 @@
42
50
  - para estruturar coleta, usar `base/scripts/edusquads_estruturar_coleta.py`
43
51
  - para fechar investigação, usar `base/scripts/edusquads_concluir_investigacao.py`
44
52
  - nunca persistir sessão sem consentimento explícito
45
- - decisões relevantes devem ser registradas na seção de histórico da memória e no run ativo
46
- ões relevantes devem ser registradas na seção de histórico da memória e no run ativo
53
+ - decisões relevantes devem ser registradas na memória e no run ativo
@@ -1,27 +1,17 @@
1
1
  # Protocolo de Memória do Usuário (EduSquads)
2
2
 
3
3
  ## Objetivo
4
- Manter uma memória operacional do usuário para personalizar a atuação dos squads no comando `/edusquads`.
4
+ Manter uma memória operacional da pessoa usuária para personalizar a atuação dos squads no comando `/edusquads`.
5
5
 
6
- ## Arquivo ativo
7
- - `_edusquads/memoria/USUARIO-ATIVO.md`
6
+ ## Arquivos de memória
7
+ - ativo: `_edusquads/memoria/USUARIO-ATIVO.md`
8
+ - modelo: `_edusquads/memoria/USUARIO-MODELO.md`
9
+ - perfis por pessoa: `_edusquads/memoria/usuarios/<slug>.md`
8
10
 
9
11
  ## Quando coletar memória
10
12
  1. Primeira execução do `/edusquads` no projeto
11
13
  2. Quando o usuário pedir atualização de contexto pessoal/profissional
12
- 3. Quando houver mudança relevante de nicho, objetivo ou estilo
13
-
14
- ## Campos mínimos
15
- - nome preferido
16
- - projeto/negócio principal
17
- - nicho
18
- - público-alvo
19
- - objetivos atuais
20
- - canais prioritários
21
- - stack/ferramentas
22
- - restrições (tempo, orçamento, equipe)
23
- - estilo de comunicação preferido
24
- - decisões já tomadas
14
+ 3. Quando houver troca de usuário ou mudança relevante de nicho/objetivo/estilo
25
15
 
26
16
  ## Princípios
27
17
  - coletar apenas dados úteis para execução
@@ -29,22 +19,37 @@ Manter uma memória operacional do usuário para personalizar a atuação dos sq
29
19
  - separar fato de inferência
30
20
  - nunca registrar segredos/token/senhas na memória
31
21
 
32
- ## Formato de atualização
33
- Sempre atualizar por bloco:
34
- 1. `## Estado atual`
35
- 2. `## Objetivos em andamento`
36
- 3. `## Preferências`
37
- 4. `## Restrições`
38
- 5. `## Histórico de decisões`
39
-
40
22
  ## Regras de uso no comando
41
23
  - antes de planejar squads, ler `USUARIO-ATIVO.md`
42
- - se campos críticos estiverem vazios, perguntar objetivamente
24
+ - se campos críticos estiverem vazios, executar onboarding (briefing completo)
25
+ - salvar briefing no perfil individual e atualizar o usuário ativo
43
26
  - toda recomendação deve refletir esse contexto
44
27
 
45
28
  ## Campos críticos (não seguir sem isso)
29
+ - nome preferido
30
+ - projeto/negócio
46
31
  - nicho
47
32
  - público-alvo
48
33
  - objetivo principal
49
34
  - canal principal
50
35
  - oferta principal (ou hipótese de oferta)
36
+
37
+ ## Roteiro obrigatório de briefing (onboarding)
38
+ 1. Quem é a pessoa e qual papel dela no projeto
39
+ 2. Qual é o negócio/oferta principal
40
+ 3. Quem é o público-alvo e qual nicho
41
+ 4. Qual é o objetivo principal nos próximos 30-90 dias
42
+ 5. Quais canais e formatos de entrega priorizar
43
+ 6. Quais restrições de tempo/equipe/orçamento existem
44
+ 7. Quais ferramentas, ativos e dados já existem
45
+
46
+ ## Formato de atualização
47
+ Sempre atualizar por bloco:
48
+ 1. `## Identidade`
49
+ 2. `## Estado atual`
50
+ 3. `## Objetivos em andamento`
51
+ 4. `## Preferências`
52
+ 5. `## Restrições`
53
+ 6. `## Stack e ativos`
54
+ 7. `## Histórico de decisões`
55
+ 8. `## Última atualização`
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Onboarding de memória do EduSquads.
4
+
5
+ Coleta briefing completo no terminal e salva em:
6
+ - _edusquads/memoria/USUARIO-ATIVO.md
7
+ - _edusquads/memoria/usuarios/<slug>.md
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import argparse
13
+ import datetime as dt
14
+ import re
15
+ from pathlib import Path
16
+
17
+
18
+ def ask(prompt: str, required: bool = True) -> str:
19
+ while True:
20
+ value = input(f"{prompt}: ").strip()
21
+ if value or not required:
22
+ return value
23
+ print("Campo obrigatório. Preencha para continuar.")
24
+
25
+
26
+ def slugify(text: str) -> str:
27
+ t = text.strip().lower()
28
+ t = re.sub(r"[^a-z0-9\s-]", "", t)
29
+ t = re.sub(r"\s+", "-", t)
30
+ t = re.sub(r"-+", "-", t)
31
+ return t or "usuario"
32
+
33
+
34
+ def render_memory(data: dict, source: str) -> str:
35
+ today = dt.date.today().isoformat()
36
+ return f"""# Memória do Usuário Ativo
37
+
38
+ ## Identidade
39
+ - Nome preferido: {data['nome']}
40
+ - Projeto/negócio: {data['projeto']}
41
+ - Papel do usuário: {data['papel']}
42
+
43
+ ## Estado atual
44
+ - Nicho principal: {data['nicho']}
45
+ - Público-alvo: {data['publico']}
46
+ - Oferta principal: {data['oferta']}
47
+ - Maturidade da operação (inicial/intermediária/avançada): {data['maturidade']}
48
+
49
+ ## Objetivos em andamento
50
+ - Objetivo principal (30-90 dias): {data['objetivo_principal']}
51
+ - Objetivo secundário: {data['objetivo_secundario']}
52
+ - KPI principal: {data['kpi']}
53
+
54
+ ## Preferências
55
+ - Canais prioritários: {data['canais']}
56
+ - Estilo de comunicação: {data['estilo']}
57
+ - Formato de entrega preferido: {data['formato_entrega']}
58
+
59
+ ## Restrições
60
+ - Tempo disponível: {data['tempo']}
61
+ - Equipe disponível: {data['equipe']}
62
+ - Orçamento aproximado: {data['orcamento']}
63
+ - Limites operacionais: {data['limites']}
64
+
65
+ ## Stack e ativos
66
+ - Ferramentas atuais: {data['ferramentas']}
67
+ - Ativos existentes (lista/email/site/perfis): {data['ativos']}
68
+ - Dados disponíveis: {data['dados']}
69
+
70
+ ## Histórico de decisões
71
+ - [x] briefing inicial coletado no onboarding
72
+
73
+ ## Última atualização
74
+ - Data: {today}
75
+ - Origem da atualização: {source}
76
+ """
77
+
78
+
79
+ def main() -> int:
80
+ parser = argparse.ArgumentParser(description="Onboarding de memória EduSquads")
81
+ parser.add_argument("--target", default=".", help="Diretório do projeto")
82
+ args = parser.parse_args()
83
+
84
+ root = Path(args.target).resolve()
85
+ mem_dir = root / "_edusquads" / "memoria"
86
+ users_dir = mem_dir / "usuarios"
87
+ mem_dir.mkdir(parents=True, exist_ok=True)
88
+ users_dir.mkdir(parents=True, exist_ok=True)
89
+
90
+ print("\n=== Onboarding EduSquads: briefing do usuário ===\n")
91
+ print("Preencha de forma objetiva. Isso será usado para personalizar os squads.\n")
92
+
93
+ data = {
94
+ "nome": ask("Nome preferido"),
95
+ "projeto": ask("Projeto/negócio"),
96
+ "papel": ask("Papel do usuário (ex: fundador, gestor, creator)"),
97
+ "nicho": ask("Nicho principal"),
98
+ "publico": ask("Público-alvo"),
99
+ "oferta": ask("Oferta principal (produto/serviço)", required=False) or "não informado",
100
+ "maturidade": ask("Maturidade da operação (inicial/intermediária/avançada)"),
101
+ "objetivo_principal": ask("Objetivo principal (30-90 dias)"),
102
+ "objetivo_secundario": ask("Objetivo secundário", required=False) or "não informado",
103
+ "kpi": ask("KPI principal", required=False) or "não informado",
104
+ "canais": ask("Canais prioritários", required=False) or "não informado",
105
+ "estilo": ask("Estilo de comunicação preferido", required=False) or "não informado",
106
+ "formato_entrega": ask("Formato de entrega preferido", required=False) or "não informado",
107
+ "tempo": ask("Tempo disponível", required=False) or "não informado",
108
+ "equipe": ask("Equipe disponível", required=False) or "não informado",
109
+ "orcamento": ask("Orçamento aproximado", required=False) or "não informado",
110
+ "limites": ask("Limites operacionais", required=False) or "não informado",
111
+ "ferramentas": ask("Ferramentas atuais", required=False) or "não informado",
112
+ "ativos": ask("Ativos existentes (lista/email/site/perfis)", required=False) or "não informado",
113
+ "dados": ask("Dados disponíveis", required=False) or "não informado",
114
+ }
115
+
116
+ content = render_memory(data, source="onboarding-interativo")
117
+
118
+ active_path = mem_dir / "USUARIO-ATIVO.md"
119
+ active_path.write_text(content, encoding="utf-8")
120
+
121
+ slug = slugify(data["nome"])
122
+ profile_path = users_dir / f"{slug}.md"
123
+ profile_path.write_text(content, encoding="utf-8")
124
+
125
+ print("\n✅ Briefing salvo com sucesso:")
126
+ print(f"- ativo: {active_path}")
127
+ print(f"- perfil: {profile_path}")
128
+ return 0
129
+
130
+
131
+ if __name__ == "__main__":
132
+ raise SystemExit(main())
package/bin/edusquads.js CHANGED
@@ -3,11 +3,13 @@
3
3
  const fs = require("fs");
4
4
  const path = require("path");
5
5
  const readline = require("readline");
6
+ const { spawnSync } = require("child_process");
6
7
 
7
8
  const args = process.argv.slice(2);
8
9
  const command = args.find((a) => !a.startsWith("-")) || "install";
9
10
  const force = args.includes("--force");
10
11
  const dryRun = args.includes("--dry-run");
12
+ const skipOnboarding = args.includes("--skip-onboarding");
11
13
  const targetArgIndex = args.findIndex((a) => a === "--target");
12
14
  const targetDir =
13
15
  targetArgIndex >= 0 && args[targetArgIndex + 1]
@@ -56,6 +58,7 @@ Opções:
56
58
  Se omitido, o CLI pergunta no terminal.
57
59
  --force Sobrescreve arquivos existentes
58
60
  --dry-run Simula instalação sem gravar arquivos
61
+ --skip-onboarding Não pergunta briefing após instalar
59
62
  `);
60
63
  }
61
64
 
@@ -165,6 +168,34 @@ function ask(promptText) {
165
168
  });
166
169
  }
167
170
 
171
+ async function askOnboarding() {
172
+ if (skipOnboarding || dryRun) return false;
173
+ if (!process.stdin.isTTY || !process.stdout.isTTY) return false;
174
+ const ans = (await ask("Deseja fazer agora o briefing do usuário? (s/N): ")).trim().toLowerCase();
175
+ return ["s", "sim", "y", "yes"].includes(ans);
176
+ }
177
+
178
+ function runOnboarding(target) {
179
+ const script = path.join(target, "base", "scripts", "edusquads_onboarding_memoria.py");
180
+ if (!fs.existsSync(script)) {
181
+ console.log("\n⚠️ Script de onboarding não encontrado. Pule e rode manualmente depois.");
182
+ return;
183
+ }
184
+
185
+ const pyCmd = process.platform === "win32" ? "python" : "python3";
186
+ const r = spawnSync(pyCmd, [script, "--target", target], {
187
+ stdio: "inherit",
188
+ cwd: target,
189
+ env: process.env,
190
+ });
191
+
192
+ if (r.status !== 0) {
193
+ console.log("\n⚠️ Não foi possível concluir o onboarding automaticamente.");
194
+ console.log("Rode manualmente:");
195
+ console.log(` ${pyCmd} base/scripts/edusquads_onboarding_memoria.py --target ${target}`);
196
+ }
197
+ }
198
+
168
199
  async function resolveIdes() {
169
200
  if (ideArg) return parseIdes(ideArg);
170
201
 
@@ -247,6 +278,12 @@ async function install() {
247
278
  console.log(`Arquivos ignorados (já existiam): ${report.skipped}`);
248
279
  console.log(`.gitignore atualizado: ${gitignoreChanged ? "sim" : "não"}`);
249
280
 
281
+ const doOnboarding = await askOnboarding();
282
+ if (doOnboarding) {
283
+ console.log("\nIniciando onboarding de briefing...\n");
284
+ runOnboarding(targetDir);
285
+ }
286
+
250
287
  console.log("\nComandos esperados por IDE (após abrir o projeto na IDE):");
251
288
  for (const ide of ides) {
252
289
  if (ide === "claude") console.log("- Claude Code: /edusquads");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edusquads-cli",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Instalador do framework EduSquads para Claude Code via npx.",
5
5
  "bin": {
6
6
  "edusquads": "bin/edusquads.js"