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.
- package/.claude/skills/edusquads/SKILL.md +24 -8
- package/README.md +6 -1
- package/_edusquads/memoria/USUARIO-ATIVO.md +23 -25
- package/base/comandos/edusquads-comandos.md +11 -4
- package/base/protocolo-memoria-usuario.md +30 -25
- package/base/scripts/__pycache__/edusquads_onboarding_memoria.cpython-312.pyc +0 -0
- package/base/scripts/edusquads_onboarding_memoria.py +132 -0
- package/bin/edusquads.js +37 -0
- package/package.json +1 -1
|
@@ -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
|
-
###
|
|
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,
|
|
103
|
-
3.
|
|
104
|
-
4.
|
|
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
|
-
-
|
|
114
|
-
- Coleta
|
|
115
|
-
|
|
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:
|
|
5
|
-
- Projeto/negócio:
|
|
6
|
-
- Papel do usuário:
|
|
4
|
+
- Nome preferido:
|
|
5
|
+
- Projeto/negócio:
|
|
6
|
+
- Papel do usuário:
|
|
7
7
|
|
|
8
8
|
## Estado atual
|
|
9
|
-
- Nicho principal:
|
|
10
|
-
- Público-alvo:
|
|
11
|
-
- Oferta principal:
|
|
12
|
-
- Maturidade da operação (inicial/intermediária/avançada):
|
|
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):
|
|
16
|
-
- Objetivo secundário:
|
|
17
|
-
- KPI principal:
|
|
15
|
+
- Objetivo principal (30-90 dias):
|
|
16
|
+
- Objetivo secundário:
|
|
17
|
+
- KPI principal:
|
|
18
18
|
|
|
19
19
|
## Preferências
|
|
20
|
-
- Canais prioritários:
|
|
21
|
-
- Estilo de comunicação:
|
|
22
|
-
- Formato de entrega preferido:
|
|
20
|
+
- Canais prioritários:
|
|
21
|
+
- Estilo de comunicação:
|
|
22
|
+
- Formato de entrega preferido:
|
|
23
23
|
|
|
24
24
|
## Restrições
|
|
25
|
-
- Tempo disponível:
|
|
26
|
-
- Equipe disponível:
|
|
27
|
-
- Orçamento aproximado:
|
|
28
|
-
- Limites operacionais:
|
|
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:
|
|
32
|
-
- Ativos existentes (lista/email/site/perfis):
|
|
33
|
-
- Dados disponíveis:
|
|
31
|
+
- Ferramentas atuais:
|
|
32
|
+
- Ativos existentes (lista/email/site/perfis):
|
|
33
|
+
- Dados disponíveis:
|
|
34
34
|
|
|
35
35
|
## Histórico de decisões
|
|
36
|
-
- [
|
|
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:
|
|
42
|
-
- Origem da atualização:
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
|
4
|
+
Manter uma memória operacional da pessoa usuária para personalizar a atuação dos squads no comando `/edusquads`.
|
|
5
5
|
|
|
6
|
-
##
|
|
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
|
|
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,
|
|
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");
|