@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 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.10.1",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nimbuslab/cli",
3
- "version": "0.10.1",
3
+ "version": "0.12.0",
4
4
  "description": "CLI para criar projetos nimbuslab",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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
  }