@nimbuslab/cli 0.10.1 → 0.12.0
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/dist/index.js +264 -1
- package/package.json +1 -1
- package/src/commands/lola.ts +303 -0
package/dist/index.js
CHANGED
|
@@ -150,7 +150,7 @@ var require_src = __commonJS((exports, module) => {
|
|
|
150
150
|
var require_package = __commonJS((exports, module) => {
|
|
151
151
|
module.exports = {
|
|
152
152
|
name: "@nimbuslab/cli",
|
|
153
|
-
version: "0.
|
|
153
|
+
version: "0.12.0",
|
|
154
154
|
description: "CLI para criar projetos nimbuslab",
|
|
155
155
|
type: "module",
|
|
156
156
|
bin: {
|
|
@@ -2471,10 +2471,269 @@ ${message}
|
|
|
2471
2471
|
console.log(import_picocolors6.default.green(" Sugestao enviada! Hugo vai revisar."));
|
|
2472
2472
|
console.log();
|
|
2473
2473
|
}
|
|
2474
|
+
var PROFILES = {
|
|
2475
|
+
millennial: {
|
|
2476
|
+
label: "Millennial",
|
|
2477
|
+
hint: "Nerd 90s/2000s, DBZ, Matrix, MSN",
|
|
2478
|
+
emoji: ""
|
|
2479
|
+
},
|
|
2480
|
+
genz: {
|
|
2481
|
+
label: "Gen Z",
|
|
2482
|
+
hint: "Direto, girias atuais, slay",
|
|
2483
|
+
emoji: ""
|
|
2484
|
+
},
|
|
2485
|
+
profissional: {
|
|
2486
|
+
label: "Profissional",
|
|
2487
|
+
hint: "100% tecnico, sem referencias",
|
|
2488
|
+
emoji: ""
|
|
2489
|
+
},
|
|
2490
|
+
nerd: {
|
|
2491
|
+
label: "Nerd",
|
|
2492
|
+
hint: "Star Trek, vim jokes, deep tech",
|
|
2493
|
+
emoji: ""
|
|
2494
|
+
},
|
|
2495
|
+
chill: {
|
|
2496
|
+
label: "Chill",
|
|
2497
|
+
hint: "Relaxado, vibes cafe, positivo",
|
|
2498
|
+
emoji: ""
|
|
2499
|
+
}
|
|
2500
|
+
};
|
|
2501
|
+
async function onboardDev() {
|
|
2502
|
+
console.log();
|
|
2503
|
+
console.log(import_picocolors6.default.cyan(" Lola - Onboarding"));
|
|
2504
|
+
console.log(import_picocolors6.default.dim(" ================="));
|
|
2505
|
+
console.log();
|
|
2506
|
+
if (!existsSync2(LOLA_DIR)) {
|
|
2507
|
+
console.log(import_picocolors6.default.yellow(" Lola nao instalada. Instalando primeiro..."));
|
|
2508
|
+
console.log();
|
|
2509
|
+
await installLola();
|
|
2510
|
+
console.log();
|
|
2511
|
+
}
|
|
2512
|
+
const gitUser = Bun.spawnSync(["git", "config", "user.name"], { stdout: "pipe" });
|
|
2513
|
+
const defaultName = gitUser.stdout.toString().trim() || "";
|
|
2514
|
+
Ie(import_picocolors6.default.bgCyan(import_picocolors6.default.black(" Bem-vindo a nimbuslab! ")));
|
|
2515
|
+
const devName = await he({
|
|
2516
|
+
message: "Qual seu nome?",
|
|
2517
|
+
placeholder: "Seu nome",
|
|
2518
|
+
initialValue: defaultName,
|
|
2519
|
+
validate: (v2) => v2 ? undefined : "Nome e obrigatorio"
|
|
2520
|
+
});
|
|
2521
|
+
if (pD(devName)) {
|
|
2522
|
+
xe("Onboarding cancelado");
|
|
2523
|
+
process.exit(0);
|
|
2524
|
+
}
|
|
2525
|
+
const profile = await ve({
|
|
2526
|
+
message: "Qual perfil da Lola voce prefere?",
|
|
2527
|
+
options: Object.entries(PROFILES).map(([value, { label, hint }]) => ({
|
|
2528
|
+
value,
|
|
2529
|
+
label,
|
|
2530
|
+
hint
|
|
2531
|
+
}))
|
|
2532
|
+
});
|
|
2533
|
+
if (pD(profile)) {
|
|
2534
|
+
xe("Onboarding cancelado");
|
|
2535
|
+
process.exit(0);
|
|
2536
|
+
}
|
|
2537
|
+
const claudeDir = join3(process.env.HOME || "~", ".claude");
|
|
2538
|
+
await Bun.$`mkdir -p ${claudeDir}`;
|
|
2539
|
+
const content = `# User Memory
|
|
2540
|
+
|
|
2541
|
+
Memoria persistente para sessoes Claude Code
|
|
2542
|
+
|
|
2543
|
+
---
|
|
2544
|
+
|
|
2545
|
+
## Dev
|
|
2546
|
+
|
|
2547
|
+
**Nome:** ${devName}
|
|
2548
|
+
**Maquina:** ${process.env.HOSTNAME || "local"}
|
|
2549
|
+
**Onboarding:** ${new Date().toISOString().split("T")[0]}
|
|
2550
|
+
|
|
2551
|
+
---
|
|
2552
|
+
|
|
2553
|
+
## Configuracoes da Lola
|
|
2554
|
+
|
|
2555
|
+
\`\`\`
|
|
2556
|
+
lola_profile: ${profile}
|
|
2557
|
+
\`\`\`
|
|
2558
|
+
|
|
2559
|
+
---
|
|
2560
|
+
|
|
2561
|
+
## Ultima Sessao
|
|
2562
|
+
|
|
2563
|
+
(sera preenchido automaticamente)
|
|
2564
|
+
|
|
2565
|
+
---
|
|
2566
|
+
`;
|
|
2567
|
+
await Bun.write(USER_MEMORY, content);
|
|
2568
|
+
Se(import_picocolors6.default.green("Onboarding concluido!"));
|
|
2569
|
+
console.log();
|
|
2570
|
+
console.log(import_picocolors6.default.bold(" Resumo:"));
|
|
2571
|
+
console.log(import_picocolors6.default.dim(" Nome: ") + import_picocolors6.default.white(devName));
|
|
2572
|
+
console.log(import_picocolors6.default.dim(" Perfil: ") + import_picocolors6.default.white(PROFILES[profile].label));
|
|
2573
|
+
console.log();
|
|
2574
|
+
console.log(import_picocolors6.default.bold(" Proximos passos:"));
|
|
2575
|
+
console.log(import_picocolors6.default.dim(" 1. ") + import_picocolors6.default.white("lola") + import_picocolors6.default.dim(" - Iniciar sessao com a Lola"));
|
|
2576
|
+
console.log(import_picocolors6.default.dim(" 2. ") + import_picocolors6.default.white("nimbus create meu-projeto --fast") + import_picocolors6.default.dim(" - Criar projeto"));
|
|
2577
|
+
console.log(import_picocolors6.default.dim(" 3. ") + import_picocolors6.default.white('lola suggest "sua ideia"') + import_picocolors6.default.dim(" - Sugerir melhoria"));
|
|
2578
|
+
console.log();
|
|
2579
|
+
console.log(import_picocolors6.default.dim(" Docs: ~/.lola/README.md"));
|
|
2580
|
+
console.log();
|
|
2581
|
+
}
|
|
2582
|
+
var QUIZ_QUESTIONS = [
|
|
2583
|
+
{
|
|
2584
|
+
question: "Quais sao os 4 valores da nimbuslab?",
|
|
2585
|
+
options: [
|
|
2586
|
+
{ value: "a", label: "Velocidade, Qualidade, Preco, Entrega" },
|
|
2587
|
+
{ value: "b", label: "Cocriacao, Inovacao, Evolucao, Humanizacao" },
|
|
2588
|
+
{ value: "c", label: "Codigo, Design, Marketing, Vendas" },
|
|
2589
|
+
{ value: "d", label: "Agil, Lean, Scrum, Kanban" }
|
|
2590
|
+
],
|
|
2591
|
+
correct: "b",
|
|
2592
|
+
explanation: "Cocriacao (construimos junto), Inovacao (buscamos o novo), Evolucao (aprendizado continuo), Humanizacao (tecnologia a servico das pessoas)."
|
|
2593
|
+
},
|
|
2594
|
+
{
|
|
2595
|
+
question: "Quais sao os 4 pilares da filosofia fast?",
|
|
2596
|
+
options: [
|
|
2597
|
+
{ value: "a", label: "Analise, Planejamento, Execucao, Documentacao" },
|
|
2598
|
+
{ value: "b", label: "Design, Codigo, Teste, Deploy" },
|
|
2599
|
+
{ value: "c", label: "Briefing, Prototipo, Desenvolvimento, Lancamento" },
|
|
2600
|
+
{ value: "d", label: "Discovery, Definition, Development, Delivery" }
|
|
2601
|
+
],
|
|
2602
|
+
correct: "a",
|
|
2603
|
+
explanation: "Filosofia fast: 1. Analise (entender), 2. Planejamento (definir caminho), 3. Execucao (implementar), 4. Documentacao (registrar)."
|
|
2604
|
+
},
|
|
2605
|
+
{
|
|
2606
|
+
question: "Qual package manager a nimbuslab usa como padrao?",
|
|
2607
|
+
options: [
|
|
2608
|
+
{ value: "a", label: "npm" },
|
|
2609
|
+
{ value: "b", label: "yarn" },
|
|
2610
|
+
{ value: "c", label: "pnpm" },
|
|
2611
|
+
{ value: "d", label: "bun" }
|
|
2612
|
+
],
|
|
2613
|
+
correct: "d",
|
|
2614
|
+
explanation: "Bun e o package manager padrao. Mais rapido e com menos dependencias."
|
|
2615
|
+
},
|
|
2616
|
+
{
|
|
2617
|
+
question: "Qual o estilo padrao do shadcn/ui na nimbuslab?",
|
|
2618
|
+
options: [
|
|
2619
|
+
{ value: "a", label: "new-york" },
|
|
2620
|
+
{ value: "b", label: "default" },
|
|
2621
|
+
{ value: "c", label: "minimal" },
|
|
2622
|
+
{ value: "d", label: "custom" }
|
|
2623
|
+
],
|
|
2624
|
+
correct: "b",
|
|
2625
|
+
explanation: "Usamos o estilo 'default' do shadcn/ui. Nunca 'new-york'."
|
|
2626
|
+
},
|
|
2627
|
+
{
|
|
2628
|
+
question: "Em projetos externos (stealth mode), a Lola deve:",
|
|
2629
|
+
options: [
|
|
2630
|
+
{ value: "a", label: "Sempre mencionar a nimbuslab nos commits" },
|
|
2631
|
+
{ value: "b", label: "Usar assinatura 'Co-authored-by: Lola'" },
|
|
2632
|
+
{ value: "c", label: "Nunca mencionar nimbuslab, Lola ou IA" },
|
|
2633
|
+
{ value: "d", label: "Adicionar badge da nimbuslab no README" }
|
|
2634
|
+
],
|
|
2635
|
+
correct: "c",
|
|
2636
|
+
explanation: "Stealth mode: commits sem mencao a nimbuslab/Lola/IA. O cliente nao precisa saber dos bastidores."
|
|
2637
|
+
},
|
|
2638
|
+
{
|
|
2639
|
+
question: "Qual a versao minima do Next.js usada na stack nimbuslab?",
|
|
2640
|
+
options: [
|
|
2641
|
+
{ value: "a", label: "Next.js 13" },
|
|
2642
|
+
{ value: "b", label: "Next.js 14" },
|
|
2643
|
+
{ value: "c", label: "Next.js 15" },
|
|
2644
|
+
{ value: "d", label: "Next.js 16" }
|
|
2645
|
+
],
|
|
2646
|
+
correct: "d",
|
|
2647
|
+
explanation: "Stack atual: Next.js 16+ com App Router e Turbopack."
|
|
2648
|
+
},
|
|
2649
|
+
{
|
|
2650
|
+
question: "Quem pode aprovar e mergear mudancas no repositorio da Lola?",
|
|
2651
|
+
options: [
|
|
2652
|
+
{ value: "a", label: "Qualquer dev da nimbuslab" },
|
|
2653
|
+
{ value: "b", label: "Apenas o Hugo" },
|
|
2654
|
+
{ value: "c", label: "Qualquer pessoa com acesso ao repo" },
|
|
2655
|
+
{ value: "d", label: "A propria Lola via automacao" }
|
|
2656
|
+
],
|
|
2657
|
+
correct: "b",
|
|
2658
|
+
explanation: "Apenas o Hugo pode aprovar e mergear. Devs sugerem via 'lola suggest', Hugo revisa."
|
|
2659
|
+
},
|
|
2660
|
+
{
|
|
2661
|
+
question: "Em commits da nimbuslab, qual o idioma correto?",
|
|
2662
|
+
options: [
|
|
2663
|
+
{ value: "a", label: "Ingles" },
|
|
2664
|
+
{ value: "b", label: "Portugues (BR)" },
|
|
2665
|
+
{ value: "c", label: "Depende do projeto" },
|
|
2666
|
+
{ value: "d", label: "Spanglish" }
|
|
2667
|
+
],
|
|
2668
|
+
correct: "b",
|
|
2669
|
+
explanation: "Commits e PRs em Portugues (BR). Codigo e comentarios em Ingles."
|
|
2670
|
+
}
|
|
2671
|
+
];
|
|
2672
|
+
async function runQuiz() {
|
|
2673
|
+
console.log();
|
|
2674
|
+
console.log(import_picocolors6.default.cyan(" Quiz nimbuslab"));
|
|
2675
|
+
console.log(import_picocolors6.default.dim(" =============="));
|
|
2676
|
+
console.log();
|
|
2677
|
+
console.log(import_picocolors6.default.dim(" Teste seus conhecimentos sobre a nimbuslab!"));
|
|
2678
|
+
console.log(import_picocolors6.default.dim(" 8 perguntas sobre valores, filosofia e stack."));
|
|
2679
|
+
console.log();
|
|
2680
|
+
let score = 0;
|
|
2681
|
+
const results = [];
|
|
2682
|
+
for (let i = 0;i < QUIZ_QUESTIONS.length; i++) {
|
|
2683
|
+
const q2 = QUIZ_QUESTIONS[i];
|
|
2684
|
+
const answer = await ve({
|
|
2685
|
+
message: `${i + 1}. ${q2.question}`,
|
|
2686
|
+
options: q2.options
|
|
2687
|
+
});
|
|
2688
|
+
if (pD(answer)) {
|
|
2689
|
+
xe("Quiz cancelado");
|
|
2690
|
+
process.exit(0);
|
|
2691
|
+
}
|
|
2692
|
+
const isCorrect = answer === q2.correct;
|
|
2693
|
+
if (isCorrect) {
|
|
2694
|
+
score++;
|
|
2695
|
+
console.log(import_picocolors6.default.green(" Correto!"));
|
|
2696
|
+
} else {
|
|
2697
|
+
console.log(import_picocolors6.default.red(" Incorreto."));
|
|
2698
|
+
}
|
|
2699
|
+
console.log(import_picocolors6.default.dim(` ${q2.explanation}`));
|
|
2700
|
+
console.log();
|
|
2701
|
+
results.push({
|
|
2702
|
+
question: q2.question,
|
|
2703
|
+
correct: isCorrect,
|
|
2704
|
+
explanation: q2.explanation
|
|
2705
|
+
});
|
|
2706
|
+
}
|
|
2707
|
+
const percentage = Math.round(score / QUIZ_QUESTIONS.length * 100);
|
|
2708
|
+
const passed = percentage >= 75;
|
|
2709
|
+
console.log(import_picocolors6.default.bold(" Resultado:"));
|
|
2710
|
+
console.log();
|
|
2711
|
+
if (passed) {
|
|
2712
|
+
console.log(import_picocolors6.default.green(` ${score}/${QUIZ_QUESTIONS.length} (${percentage}%) - Aprovado!`));
|
|
2713
|
+
console.log();
|
|
2714
|
+
if (percentage === 100) {
|
|
2715
|
+
console.log(import_picocolors6.default.cyan(" Perfeito! Voce conhece bem a nimbuslab."));
|
|
2716
|
+
} else {
|
|
2717
|
+
console.log(import_picocolors6.default.cyan(" Muito bem! Voce esta pronto para trabalhar."));
|
|
2718
|
+
}
|
|
2719
|
+
} else {
|
|
2720
|
+
console.log(import_picocolors6.default.yellow(` ${score}/${QUIZ_QUESTIONS.length} (${percentage}%) - Precisa revisar`));
|
|
2721
|
+
console.log();
|
|
2722
|
+
console.log(import_picocolors6.default.dim(" Revise os conceitos em:"));
|
|
2723
|
+
console.log(import_picocolors6.default.dim(" ~/.lola/core/values.md"));
|
|
2724
|
+
console.log(import_picocolors6.default.dim(" ~/.lola/core/philosophy.md"));
|
|
2725
|
+
console.log(import_picocolors6.default.dim(" ~/.lola/modules/stack.md"));
|
|
2726
|
+
}
|
|
2727
|
+
console.log();
|
|
2728
|
+
}
|
|
2474
2729
|
async function lola(args) {
|
|
2475
2730
|
const subcommand = args[0];
|
|
2476
2731
|
if (!subcommand || subcommand === "install" || subcommand === "sync") {
|
|
2477
2732
|
await installLola();
|
|
2733
|
+
} else if (subcommand === "onboard") {
|
|
2734
|
+
await onboardDev();
|
|
2735
|
+
} else if (subcommand === "quiz") {
|
|
2736
|
+
await runQuiz();
|
|
2478
2737
|
} else if (subcommand === "suggest") {
|
|
2479
2738
|
const message = args.slice(1).join(" ");
|
|
2480
2739
|
await suggestImprovement(message);
|
|
@@ -2495,11 +2754,15 @@ function showLolaHelp() {
|
|
|
2495
2754
|
console.log(import_picocolors6.default.bold(" Subcomandos:"));
|
|
2496
2755
|
console.log(import_picocolors6.default.dim(" install ") + import_picocolors6.default.white("Instalar/atualizar Lola"));
|
|
2497
2756
|
console.log(import_picocolors6.default.dim(" sync ") + import_picocolors6.default.white("Alias para install"));
|
|
2757
|
+
console.log(import_picocolors6.default.dim(" onboard ") + import_picocolors6.default.white("Configurar perfil (novos devs)"));
|
|
2758
|
+
console.log(import_picocolors6.default.dim(" quiz ") + import_picocolors6.default.white("Quiz sobre a nimbuslab"));
|
|
2498
2759
|
console.log(import_picocolors6.default.dim(' suggest "msg" ') + import_picocolors6.default.white("Sugerir melhoria (cria issue)"));
|
|
2499
2760
|
console.log(import_picocolors6.default.dim(" help ") + import_picocolors6.default.white("Mostrar esta ajuda"));
|
|
2500
2761
|
console.log();
|
|
2501
2762
|
console.log(import_picocolors6.default.bold(" Exemplos:"));
|
|
2502
2763
|
console.log(import_picocolors6.default.dim(" $ nimbus lola install"));
|
|
2764
|
+
console.log(import_picocolors6.default.dim(" $ nimbus lola onboard"));
|
|
2765
|
+
console.log(import_picocolors6.default.dim(" $ nimbus lola quiz"));
|
|
2503
2766
|
console.log(import_picocolors6.default.dim(' $ nimbus lola suggest "adicionar suporte a X"'));
|
|
2504
2767
|
console.log();
|
|
2505
2768
|
}
|
package/package.json
CHANGED
package/src/commands/lola.ts
CHANGED
|
@@ -165,11 +165,310 @@ ${message}
|
|
|
165
165
|
console.log()
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
+
const PROFILES = {
|
|
169
|
+
millennial: {
|
|
170
|
+
label: "Millennial",
|
|
171
|
+
hint: "Nerd 90s/2000s, DBZ, Matrix, MSN",
|
|
172
|
+
emoji: "",
|
|
173
|
+
},
|
|
174
|
+
genz: {
|
|
175
|
+
label: "Gen Z",
|
|
176
|
+
hint: "Direto, girias atuais, slay",
|
|
177
|
+
emoji: "",
|
|
178
|
+
},
|
|
179
|
+
profissional: {
|
|
180
|
+
label: "Profissional",
|
|
181
|
+
hint: "100% tecnico, sem referencias",
|
|
182
|
+
emoji: "",
|
|
183
|
+
},
|
|
184
|
+
nerd: {
|
|
185
|
+
label: "Nerd",
|
|
186
|
+
hint: "Star Trek, vim jokes, deep tech",
|
|
187
|
+
emoji: "",
|
|
188
|
+
},
|
|
189
|
+
chill: {
|
|
190
|
+
label: "Chill",
|
|
191
|
+
hint: "Relaxado, vibes cafe, positivo",
|
|
192
|
+
emoji: "",
|
|
193
|
+
},
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async function onboardDev(): Promise<void> {
|
|
197
|
+
console.log()
|
|
198
|
+
console.log(pc.cyan(" Lola - Onboarding"))
|
|
199
|
+
console.log(pc.dim(" ================="))
|
|
200
|
+
console.log()
|
|
201
|
+
|
|
202
|
+
// Verificar se Lola está instalada
|
|
203
|
+
if (!existsSync(LOLA_DIR)) {
|
|
204
|
+
console.log(pc.yellow(" Lola nao instalada. Instalando primeiro..."))
|
|
205
|
+
console.log()
|
|
206
|
+
await installLola()
|
|
207
|
+
console.log()
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Pegar nome do git config
|
|
211
|
+
const gitUser = Bun.spawnSync(["git", "config", "user.name"], { stdout: "pipe" })
|
|
212
|
+
const defaultName = gitUser.stdout.toString().trim() || ""
|
|
213
|
+
|
|
214
|
+
p.intro(pc.bgCyan(pc.black(" Bem-vindo a nimbuslab! ")))
|
|
215
|
+
|
|
216
|
+
// Nome do dev
|
|
217
|
+
const devName = await p.text({
|
|
218
|
+
message: "Qual seu nome?",
|
|
219
|
+
placeholder: "Seu nome",
|
|
220
|
+
initialValue: defaultName,
|
|
221
|
+
validate: (v) => v ? undefined : "Nome e obrigatorio",
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
if (p.isCancel(devName)) {
|
|
225
|
+
p.cancel("Onboarding cancelado")
|
|
226
|
+
process.exit(0)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Perfil preferido
|
|
230
|
+
const profile = await p.select({
|
|
231
|
+
message: "Qual perfil da Lola voce prefere?",
|
|
232
|
+
options: Object.entries(PROFILES).map(([value, { label, hint }]) => ({
|
|
233
|
+
value,
|
|
234
|
+
label,
|
|
235
|
+
hint,
|
|
236
|
+
})),
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
if (p.isCancel(profile)) {
|
|
240
|
+
p.cancel("Onboarding cancelado")
|
|
241
|
+
process.exit(0)
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Atualizar USER_MEMORY.md
|
|
245
|
+
const claudeDir = join(process.env.HOME || "~", ".claude")
|
|
246
|
+
await Bun.$`mkdir -p ${claudeDir}`
|
|
247
|
+
|
|
248
|
+
const content = `# User Memory
|
|
249
|
+
|
|
250
|
+
Memoria persistente para sessoes Claude Code
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Dev
|
|
255
|
+
|
|
256
|
+
**Nome:** ${devName}
|
|
257
|
+
**Maquina:** ${process.env.HOSTNAME || "local"}
|
|
258
|
+
**Onboarding:** ${new Date().toISOString().split("T")[0]}
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Configuracoes da Lola
|
|
263
|
+
|
|
264
|
+
\`\`\`
|
|
265
|
+
lola_profile: ${profile}
|
|
266
|
+
\`\`\`
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Ultima Sessao
|
|
271
|
+
|
|
272
|
+
(sera preenchido automaticamente)
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
`
|
|
276
|
+
|
|
277
|
+
await Bun.write(USER_MEMORY, content)
|
|
278
|
+
|
|
279
|
+
p.outro(pc.green("Onboarding concluido!"))
|
|
280
|
+
|
|
281
|
+
// Resumo
|
|
282
|
+
console.log()
|
|
283
|
+
console.log(pc.bold(" Resumo:"))
|
|
284
|
+
console.log(pc.dim(" Nome: ") + pc.white(devName as string))
|
|
285
|
+
console.log(pc.dim(" Perfil: ") + pc.white(PROFILES[profile as keyof typeof PROFILES].label))
|
|
286
|
+
console.log()
|
|
287
|
+
console.log(pc.bold(" Proximos passos:"))
|
|
288
|
+
console.log(pc.dim(" 1. ") + pc.white("lola") + pc.dim(" - Iniciar sessao com a Lola"))
|
|
289
|
+
console.log(pc.dim(" 2. ") + pc.white("nimbus create meu-projeto --fast") + pc.dim(" - Criar projeto"))
|
|
290
|
+
console.log(pc.dim(" 3. ") + pc.white("lola suggest \"sua ideia\"") + pc.dim(" - Sugerir melhoria"))
|
|
291
|
+
console.log()
|
|
292
|
+
console.log(pc.dim(" Docs: ~/.lola/README.md"))
|
|
293
|
+
console.log()
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Quiz sobre a nimbuslab
|
|
297
|
+
interface QuizQuestion {
|
|
298
|
+
question: string
|
|
299
|
+
options: { value: string; label: string }[]
|
|
300
|
+
correct: string
|
|
301
|
+
explanation: string
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const QUIZ_QUESTIONS: QuizQuestion[] = [
|
|
305
|
+
{
|
|
306
|
+
question: "Quais sao os 4 valores da nimbuslab?",
|
|
307
|
+
options: [
|
|
308
|
+
{ value: "a", label: "Velocidade, Qualidade, Preco, Entrega" },
|
|
309
|
+
{ value: "b", label: "Cocriacao, Inovacao, Evolucao, Humanizacao" },
|
|
310
|
+
{ value: "c", label: "Codigo, Design, Marketing, Vendas" },
|
|
311
|
+
{ value: "d", label: "Agil, Lean, Scrum, Kanban" },
|
|
312
|
+
],
|
|
313
|
+
correct: "b",
|
|
314
|
+
explanation: "Cocriacao (construimos junto), Inovacao (buscamos o novo), Evolucao (aprendizado continuo), Humanizacao (tecnologia a servico das pessoas).",
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
question: "Quais sao os 4 pilares da filosofia fast?",
|
|
318
|
+
options: [
|
|
319
|
+
{ value: "a", label: "Analise, Planejamento, Execucao, Documentacao" },
|
|
320
|
+
{ value: "b", label: "Design, Codigo, Teste, Deploy" },
|
|
321
|
+
{ value: "c", label: "Briefing, Prototipo, Desenvolvimento, Lancamento" },
|
|
322
|
+
{ value: "d", label: "Discovery, Definition, Development, Delivery" },
|
|
323
|
+
],
|
|
324
|
+
correct: "a",
|
|
325
|
+
explanation: "Filosofia fast: 1. Analise (entender), 2. Planejamento (definir caminho), 3. Execucao (implementar), 4. Documentacao (registrar).",
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
question: "Qual package manager a nimbuslab usa como padrao?",
|
|
329
|
+
options: [
|
|
330
|
+
{ value: "a", label: "npm" },
|
|
331
|
+
{ value: "b", label: "yarn" },
|
|
332
|
+
{ value: "c", label: "pnpm" },
|
|
333
|
+
{ value: "d", label: "bun" },
|
|
334
|
+
],
|
|
335
|
+
correct: "d",
|
|
336
|
+
explanation: "Bun e o package manager padrao. Mais rapido e com menos dependencias.",
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
question: "Qual o estilo padrao do shadcn/ui na nimbuslab?",
|
|
340
|
+
options: [
|
|
341
|
+
{ value: "a", label: "new-york" },
|
|
342
|
+
{ value: "b", label: "default" },
|
|
343
|
+
{ value: "c", label: "minimal" },
|
|
344
|
+
{ value: "d", label: "custom" },
|
|
345
|
+
],
|
|
346
|
+
correct: "b",
|
|
347
|
+
explanation: "Usamos o estilo 'default' do shadcn/ui. Nunca 'new-york'.",
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
question: "Em projetos externos (stealth mode), a Lola deve:",
|
|
351
|
+
options: [
|
|
352
|
+
{ value: "a", label: "Sempre mencionar a nimbuslab nos commits" },
|
|
353
|
+
{ value: "b", label: "Usar assinatura 'Co-authored-by: Lola'" },
|
|
354
|
+
{ value: "c", label: "Nunca mencionar nimbuslab, Lola ou IA" },
|
|
355
|
+
{ value: "d", label: "Adicionar badge da nimbuslab no README" },
|
|
356
|
+
],
|
|
357
|
+
correct: "c",
|
|
358
|
+
explanation: "Stealth mode: commits sem mencao a nimbuslab/Lola/IA. O cliente nao precisa saber dos bastidores.",
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
question: "Qual a versao minima do Next.js usada na stack nimbuslab?",
|
|
362
|
+
options: [
|
|
363
|
+
{ value: "a", label: "Next.js 13" },
|
|
364
|
+
{ value: "b", label: "Next.js 14" },
|
|
365
|
+
{ value: "c", label: "Next.js 15" },
|
|
366
|
+
{ value: "d", label: "Next.js 16" },
|
|
367
|
+
],
|
|
368
|
+
correct: "d",
|
|
369
|
+
explanation: "Stack atual: Next.js 16+ com App Router e Turbopack.",
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
question: "Quem pode aprovar e mergear mudancas no repositorio da Lola?",
|
|
373
|
+
options: [
|
|
374
|
+
{ value: "a", label: "Qualquer dev da nimbuslab" },
|
|
375
|
+
{ value: "b", label: "Apenas o Hugo" },
|
|
376
|
+
{ value: "c", label: "Qualquer pessoa com acesso ao repo" },
|
|
377
|
+
{ value: "d", label: "A propria Lola via automacao" },
|
|
378
|
+
],
|
|
379
|
+
correct: "b",
|
|
380
|
+
explanation: "Apenas o Hugo pode aprovar e mergear. Devs sugerem via 'lola suggest', Hugo revisa.",
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
question: "Em commits da nimbuslab, qual o idioma correto?",
|
|
384
|
+
options: [
|
|
385
|
+
{ value: "a", label: "Ingles" },
|
|
386
|
+
{ value: "b", label: "Portugues (BR)" },
|
|
387
|
+
{ value: "c", label: "Depende do projeto" },
|
|
388
|
+
{ value: "d", label: "Spanglish" },
|
|
389
|
+
],
|
|
390
|
+
correct: "b",
|
|
391
|
+
explanation: "Commits e PRs em Portugues (BR). Codigo e comentarios em Ingles.",
|
|
392
|
+
},
|
|
393
|
+
]
|
|
394
|
+
|
|
395
|
+
async function runQuiz(): Promise<void> {
|
|
396
|
+
console.log()
|
|
397
|
+
console.log(pc.cyan(" Quiz nimbuslab"))
|
|
398
|
+
console.log(pc.dim(" =============="))
|
|
399
|
+
console.log()
|
|
400
|
+
console.log(pc.dim(" Teste seus conhecimentos sobre a nimbuslab!"))
|
|
401
|
+
console.log(pc.dim(" 8 perguntas sobre valores, filosofia e stack."))
|
|
402
|
+
console.log()
|
|
403
|
+
|
|
404
|
+
let score = 0
|
|
405
|
+
const results: { question: string; correct: boolean; explanation: string }[] = []
|
|
406
|
+
|
|
407
|
+
for (let i = 0; i < QUIZ_QUESTIONS.length; i++) {
|
|
408
|
+
const q = QUIZ_QUESTIONS[i]!
|
|
409
|
+
|
|
410
|
+
const answer = await p.select({
|
|
411
|
+
message: `${i + 1}. ${q.question}`,
|
|
412
|
+
options: q.options,
|
|
413
|
+
})
|
|
414
|
+
|
|
415
|
+
if (p.isCancel(answer)) {
|
|
416
|
+
p.cancel("Quiz cancelado")
|
|
417
|
+
process.exit(0)
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
const isCorrect = answer === q.correct
|
|
421
|
+
if (isCorrect) {
|
|
422
|
+
score++
|
|
423
|
+
console.log(pc.green(" Correto!"))
|
|
424
|
+
} else {
|
|
425
|
+
console.log(pc.red(" Incorreto."))
|
|
426
|
+
}
|
|
427
|
+
console.log(pc.dim(` ${q.explanation}`))
|
|
428
|
+
console.log()
|
|
429
|
+
|
|
430
|
+
results.push({
|
|
431
|
+
question: q.question,
|
|
432
|
+
correct: isCorrect,
|
|
433
|
+
explanation: q.explanation,
|
|
434
|
+
})
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Resultado final
|
|
438
|
+
const percentage = Math.round((score / QUIZ_QUESTIONS.length) * 100)
|
|
439
|
+
const passed = percentage >= 75
|
|
440
|
+
|
|
441
|
+
console.log(pc.bold(" Resultado:"))
|
|
442
|
+
console.log()
|
|
443
|
+
|
|
444
|
+
if (passed) {
|
|
445
|
+
console.log(pc.green(` ${score}/${QUIZ_QUESTIONS.length} (${percentage}%) - Aprovado!`))
|
|
446
|
+
console.log()
|
|
447
|
+
if (percentage === 100) {
|
|
448
|
+
console.log(pc.cyan(" Perfeito! Voce conhece bem a nimbuslab."))
|
|
449
|
+
} else {
|
|
450
|
+
console.log(pc.cyan(" Muito bem! Voce esta pronto para trabalhar."))
|
|
451
|
+
}
|
|
452
|
+
} else {
|
|
453
|
+
console.log(pc.yellow(` ${score}/${QUIZ_QUESTIONS.length} (${percentage}%) - Precisa revisar`))
|
|
454
|
+
console.log()
|
|
455
|
+
console.log(pc.dim(" Revise os conceitos em:"))
|
|
456
|
+
console.log(pc.dim(" ~/.lola/core/values.md"))
|
|
457
|
+
console.log(pc.dim(" ~/.lola/core/philosophy.md"))
|
|
458
|
+
console.log(pc.dim(" ~/.lola/modules/stack.md"))
|
|
459
|
+
}
|
|
460
|
+
console.log()
|
|
461
|
+
}
|
|
462
|
+
|
|
168
463
|
export async function lola(args: string[]) {
|
|
169
464
|
const subcommand = args[0]
|
|
170
465
|
|
|
171
466
|
if (!subcommand || subcommand === "install" || subcommand === "sync") {
|
|
172
467
|
await installLola()
|
|
468
|
+
} else if (subcommand === "onboard") {
|
|
469
|
+
await onboardDev()
|
|
470
|
+
} else if (subcommand === "quiz") {
|
|
471
|
+
await runQuiz()
|
|
173
472
|
} else if (subcommand === "suggest") {
|
|
174
473
|
const message = args.slice(1).join(" ")
|
|
175
474
|
await suggestImprovement(message)
|
|
@@ -191,11 +490,15 @@ function showLolaHelp() {
|
|
|
191
490
|
console.log(pc.bold(" Subcomandos:"))
|
|
192
491
|
console.log(pc.dim(" install ") + pc.white("Instalar/atualizar Lola"))
|
|
193
492
|
console.log(pc.dim(" sync ") + pc.white("Alias para install"))
|
|
493
|
+
console.log(pc.dim(" onboard ") + pc.white("Configurar perfil (novos devs)"))
|
|
494
|
+
console.log(pc.dim(" quiz ") + pc.white("Quiz sobre a nimbuslab"))
|
|
194
495
|
console.log(pc.dim(" suggest \"msg\" ") + pc.white("Sugerir melhoria (cria issue)"))
|
|
195
496
|
console.log(pc.dim(" help ") + pc.white("Mostrar esta ajuda"))
|
|
196
497
|
console.log()
|
|
197
498
|
console.log(pc.bold(" Exemplos:"))
|
|
198
499
|
console.log(pc.dim(" $ nimbus lola install"))
|
|
500
|
+
console.log(pc.dim(" $ nimbus lola onboard"))
|
|
501
|
+
console.log(pc.dim(" $ nimbus lola quiz"))
|
|
199
502
|
console.log(pc.dim(" $ nimbus lola suggest \"adicionar suporte a X\""))
|
|
200
503
|
console.log()
|
|
201
504
|
}
|