@nimbuslab/cli 0.17.3 → 1.0.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.
Files changed (2) hide show
  1. package/dist/index.js +201 -1074
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -147,7 +147,7 @@ var require_src = __commonJS((exports, module) => {
147
147
  });
148
148
 
149
149
  // src/index.ts
150
- var import_picocolors9 = __toESM(require_picocolors(), 1);
150
+ var import_picocolors8 = __toESM(require_picocolors(), 1);
151
151
 
152
152
  // node_modules/@clack/core/dist/index.mjs
153
153
  var import_sisteransi = __toESM(require_src(), 1);
@@ -2563,928 +2563,57 @@ async function update(args) {
2563
2563
  }
2564
2564
  }
2565
2565
 
2566
- // src/commands/lola.ts
2566
+ // src/commands/setup-node.ts
2567
2567
  var import_picocolors7 = __toESM(require_picocolors(), 1);
2568
- import { existsSync as existsSync2 } from "fs";
2569
- import { join as join3 } from "path";
2568
+ import { execSync as execSync2, spawnSync as spawnSync2 } from "child_process";
2569
+ import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync } from "fs";
2570
2570
  import { homedir } from "os";
2571
+ import { join as join3 } from "path";
2571
2572
  var HOME = homedir();
2572
- var LOLA_DIR = join3(HOME, ".lola");
2573
- var LOLA_REPO = "git@github.com:nimbuslab/lola.git";
2574
- var USER_MEMORY = join3(HOME, ".claude", "USER_MEMORY.md");
2575
- var CLAUDE_COMMANDS_DIR = join3(HOME, ".claude", "commands");
2576
- var LOLA_COMMANDS_DIR = join3(LOLA_DIR, "commands");
2577
- var LOLA_MEMORY_URL = "https://lola.nimbuslab.com.br/sse";
2578
- var LOLA_MEMORY_NAME = "lola-memory";
2579
- var GEMINI_DIR = join3(HOME, ".gemini");
2580
- var GEMINI_SETTINGS = join3(GEMINI_DIR, "GEMINI.md");
2581
- var CHECK_CMD = process.platform === "win32" ? "where" : "which";
2582
- function hasClaudeCLI() {
2583
- const result = Bun.spawnSync([CHECK_CMD, "claude"], { stdout: "pipe", stderr: "pipe" });
2584
- return result.exitCode === 0;
2585
- }
2586
- function hasGeminiCLI() {
2587
- const result = Bun.spawnSync([CHECK_CMD, "gemini"], { stdout: "pipe", stderr: "pipe" });
2588
- return result.exitCode === 0;
2589
- }
2590
- async function installLolaMemoryMCP() {
2591
- console.log();
2592
- console.log(import_picocolors7.default.cyan(" Configurando lola-memory MCP..."));
2593
- const claudeCheck = Bun.spawnSync([CHECK_CMD, "claude"], { stdout: "pipe", stderr: "pipe" });
2594
- if (claudeCheck.exitCode !== 0) {
2595
- console.log(import_picocolors7.default.yellow(" Claude CLI nao encontrado, pulando MCP"));
2596
- console.log(import_picocolors7.default.dim(" Instale o Claude CLI e rode 'nimbus lola install' novamente"));
2597
- return;
2598
- }
2599
- const mcpList = Bun.spawnSync(["claude", "mcp", "list"], { stdout: "pipe", stderr: "pipe" });
2600
- const mcpOutput = mcpList.stdout.toString();
2601
- if (mcpOutput.includes(LOLA_MEMORY_NAME)) {
2602
- console.log(import_picocolors7.default.green(" MCP lola-memory ja configurado"));
2603
- return;
2604
- }
2605
- console.log(import_picocolors7.default.dim(" Adicionando MCP lola-memory..."));
2606
- const result = Bun.spawnSync([
2607
- "claude",
2608
- "mcp",
2609
- "add",
2610
- "-s",
2611
- "user",
2612
- LOLA_MEMORY_NAME,
2613
- "--",
2614
- "bunx",
2615
- "mcp-remote",
2616
- LOLA_MEMORY_URL
2617
- ], {
2618
- stdout: "inherit",
2619
- stderr: "inherit"
2620
- });
2621
- if (result.exitCode !== 0) {
2622
- console.log(import_picocolors7.default.yellow(" Erro ao adicionar MCP, pode ser adicionado manualmente:"));
2623
- console.log(import_picocolors7.default.dim(` claude mcp add -s user ${LOLA_MEMORY_NAME} -- bunx mcp-remote ${LOLA_MEMORY_URL}`));
2624
- return;
2625
- }
2626
- console.log(import_picocolors7.default.green(" MCP lola-memory instalado!"));
2627
- console.log();
2628
- console.log(import_picocolors7.default.dim(" Comandos disponiveis:"));
2629
- console.log(import_picocolors7.default.dim(' remember "query" - Buscar conhecimento'));
2630
- console.log(import_picocolors7.default.dim(' learn "content" - Salvar conhecimento'));
2631
- console.log(import_picocolors7.default.dim(" memory_stats - Ver estatisticas"));
2632
- }
2633
- async function installLolaCommands() {
2634
- console.log();
2635
- console.log(import_picocolors7.default.cyan(" Instalando comandos da Lola..."));
2636
- if (!existsSync2(LOLA_COMMANDS_DIR)) {
2637
- console.log(import_picocolors7.default.dim(" Pasta de comandos nao encontrada em ~/.lola/commands"));
2638
- return;
2639
- }
2640
- if (!existsSync2(CLAUDE_COMMANDS_DIR)) {
2641
- await Bun.$`mkdir -p ${CLAUDE_COMMANDS_DIR}`;
2642
- }
2643
- const glob = new Bun.Glob("*.md");
2644
- const files = Array.from(glob.scanSync({ cwd: LOLA_COMMANDS_DIR }));
2645
- if (files.length === 0) {
2646
- console.log(import_picocolors7.default.dim(" Nenhum comando encontrado"));
2647
- return;
2648
- }
2649
- let installed = 0;
2650
- for (const file of files) {
2651
- const src = join3(LOLA_COMMANDS_DIR, file);
2652
- const dest = join3(CLAUDE_COMMANDS_DIR, file);
2653
- const content = await Bun.file(src).text();
2654
- await Bun.write(dest, content);
2655
- installed++;
2656
- }
2657
- console.log(import_picocolors7.default.green(` ${installed} comandos instalados!`));
2658
- console.log(import_picocolors7.default.dim(" Comandos: /inbox, /sent, /msg, /conversation"));
2659
- }
2660
- async function installGeminiCLI() {
2661
- console.log();
2662
- console.log(import_picocolors7.default.cyan(" Instalando Gemini CLI..."));
2663
- const result = Bun.spawnSync(["npm", "install", "-g", "@google/gemini-cli"], {
2664
- stdout: "inherit",
2665
- stderr: "inherit"
2666
- });
2667
- if (result.exitCode !== 0) {
2668
- console.log(import_picocolors7.default.red(" Erro ao instalar Gemini CLI"));
2669
- console.log(import_picocolors7.default.dim(" Tente manualmente: npm install -g @google/gemini-cli"));
2670
- return false;
2671
- }
2672
- console.log(import_picocolors7.default.green(" Gemini CLI instalado!"));
2673
- return true;
2674
- }
2675
- async function installGeminiMCP() {
2676
- console.log();
2677
- console.log(import_picocolors7.default.cyan(" Configurando MCP no Gemini..."));
2678
- const settingsPath = join3(GEMINI_DIR, "settings.json");
2679
- if (!existsSync2(GEMINI_DIR)) {
2680
- await Bun.$`mkdir -p ${GEMINI_DIR}`;
2681
- }
2682
- let settings = {};
2683
- if (existsSync2(settingsPath)) {
2684
- try {
2685
- const content = await Bun.file(settingsPath).text();
2686
- settings = JSON.parse(content);
2687
- } catch {}
2688
- }
2689
- const mcpServers = settings.mcpServers || {};
2690
- if (mcpServers[LOLA_MEMORY_NAME]) {
2691
- console.log(import_picocolors7.default.green(" MCP lola-memory ja configurado no Gemini"));
2692
- return;
2693
- }
2694
- mcpServers[LOLA_MEMORY_NAME] = {
2695
- url: LOLA_MEMORY_URL
2696
- };
2697
- settings.mcpServers = mcpServers;
2698
- await Bun.write(settingsPath, JSON.stringify(settings, null, 2));
2699
- console.log(import_picocolors7.default.green(" MCP lola-memory adicionado ao Gemini!"));
2700
- }
2701
- async function installGeminiSystemPrompt() {
2702
- console.log();
2703
- console.log(import_picocolors7.default.cyan(" Configurando GEMINI.md..."));
2704
- if (!existsSync2(GEMINI_DIR)) {
2705
- await Bun.$`mkdir -p ${GEMINI_DIR}`;
2706
- }
2707
- const lolaAgent = join3(LOLA_DIR, "agents", "claude.md");
2708
- if (!existsSync2(lolaAgent)) {
2709
- console.log(import_picocolors7.default.yellow(" Agent Lola nao encontrado"));
2710
- console.log(import_picocolors7.default.dim(" Rode 'nimbus lola install' primeiro"));
2711
- return;
2712
- }
2713
- let content = await Bun.file(lolaAgent).text();
2714
- content = content.replace(/^---[\s\S]*?---\n/, "");
2715
- content = content.replace(/Claude Code/g, "Gemini CLI");
2716
- content = content.replace(/Claude CLI/g, "Gemini CLI");
2717
- const geminiContent = `# Lola - Code Agent (Gemini)
2718
-
2719
- > Este arquivo configura a Lola para o Gemini CLI
2720
- > Gerado automaticamente por: nimbus lola install
2721
-
2722
- ---
2723
-
2724
- ${content}`;
2725
- await Bun.write(GEMINI_SETTINGS, geminiContent);
2726
- console.log(import_picocolors7.default.green(" GEMINI.md criado!"));
2727
- }
2728
- async function createGeminiCommand() {
2729
- const isWindows = process.platform === "win32";
2730
- const lolaAgent = GEMINI_SETTINGS;
2731
- console.log();
2732
- console.log(import_picocolors7.default.cyan(" Configurando comando lola-gemini..."));
2733
- if (isWindows) {
2734
- const ps7ProfileDir = join3(HOME, "Documents", "PowerShell");
2735
- const profileName = "Microsoft.PowerShell_profile.ps1";
2736
- const profilePath = join3(ps7ProfileDir, profileName);
2737
- const lolaGeminiFunction = `
2738
- # Lola (Gemini) - Code Agent da nimbuslab
2739
- function lola-gemini {
2740
- param([Parameter(ValueFromRemainingArguments=$true)]$args)
2741
- gemini @args
2742
- }
2743
- `;
2744
- if (!existsSync2(ps7ProfileDir)) {
2745
- await Bun.$`mkdir -p ${ps7ProfileDir}`;
2746
- }
2747
- let profileContent = "";
2748
- if (existsSync2(profilePath)) {
2749
- profileContent = await Bun.file(profilePath).text();
2750
- }
2751
- if (!profileContent.includes("function lola-gemini")) {
2752
- await Bun.write(profilePath, profileContent + lolaGeminiFunction);
2753
- console.log(import_picocolors7.default.green(" Funcao lola-gemini adicionada ao PowerShell"));
2754
- } else {
2755
- console.log(import_picocolors7.default.green(" Funcao lola-gemini ja existe"));
2756
- }
2757
- } else {
2758
- const binDir = join3(HOME, ".local", "bin");
2759
- const lolaGeminiScript = join3(binDir, "lola-gemini");
2760
- if (!existsSync2(lolaGeminiScript)) {
2761
- await Bun.$`mkdir -p ${binDir}`;
2762
- const unixScript = `#!/bin/bash
2763
- # lola-gemini - Code Agent da nimbuslab (Gemini)
2764
-
2765
- if [[ "$1" == "-h" || "$1" == "--help" ]]; then
2766
- echo "lola-gemini - Code Agent da nimbuslab (Gemini)"
2767
- echo "Uso: lola-gemini [args]"
2768
- echo " lola-gemini Abre Gemini CLI com a Lola"
2769
- exit 0
2770
- fi
2771
-
2772
- exec gemini "$@"
2773
- `;
2774
- await Bun.write(lolaGeminiScript, unixScript);
2775
- await Bun.$`chmod +x ${lolaGeminiScript}`;
2776
- console.log(import_picocolors7.default.green(` Script lola-gemini criado em ${lolaGeminiScript}`));
2777
- } else {
2778
- console.log(import_picocolors7.default.green(" Script lola-gemini ja existe"));
2779
- }
2780
- }
2781
- }
2782
- async function setupGemini() {
2783
- if (!hasGeminiCLI()) {
2784
- const installed = await installGeminiCLI();
2785
- if (!installed)
2786
- return;
2787
- } else {
2788
- console.log(import_picocolors7.default.green(" Gemini CLI ja instalado"));
2789
- }
2790
- await installGeminiMCP();
2791
- await installGeminiSystemPrompt();
2792
- await createGeminiCommand();
2793
- console.log();
2794
- console.log(import_picocolors7.default.green(" Gemini configurado!"));
2795
- console.log();
2796
- console.log(import_picocolors7.default.bold(" Para usar:"));
2797
- console.log(import_picocolors7.default.dim(" lola-gemini ") + import_picocolors7.default.white("# Iniciar sessao com Gemini"));
2798
- console.log(import_picocolors7.default.dim(" gemini ") + import_picocolors7.default.white("# Gemini puro (sem Lola)"));
2799
- console.log();
2800
- console.log(import_picocolors7.default.dim(" Na primeira execucao, faca login com sua conta Google."));
2801
- }
2802
- async function suggestImprovement(message) {
2803
- if (!message) {
2804
- console.log(import_picocolors7.default.red(" Erro: forne\xE7a uma mensagem"));
2805
- console.log(import_picocolors7.default.dim(' Uso: nimbus lola suggest "sua sugestao aqui"'));
2806
- process.exit(1);
2807
- }
2808
- const ghCheck = Bun.spawnSync([CHECK_CMD, "gh"], { stderr: "pipe" });
2809
- if (ghCheck.exitCode !== 0) {
2810
- console.log(import_picocolors7.default.red(" Erro: GitHub CLI (gh) nao encontrado"));
2811
- console.log(import_picocolors7.default.dim(" Instale: https://cli.github.com"));
2812
- process.exit(1);
2813
- }
2814
- const authCheck = Bun.spawnSync(["gh", "auth", "status"], {
2815
- stdout: "pipe",
2816
- stderr: "pipe"
2817
- });
2818
- if (authCheck.exitCode !== 0) {
2819
- console.log(import_picocolors7.default.red(" Erro: GitHub CLI nao autenticado"));
2820
- console.log(import_picocolors7.default.dim(" Execute: gh auth login"));
2821
- process.exit(1);
2822
- }
2823
- const gitUser = Bun.spawnSync(["git", "config", "user.name"], { stdout: "pipe" });
2824
- const gitEmail = Bun.spawnSync(["git", "config", "user.email"], { stdout: "pipe" });
2825
- const userName = gitUser.stdout.toString().trim() || "Dev";
2826
- const userEmail = gitEmail.stdout.toString().trim() || "";
2827
- console.log();
2828
- console.log(import_picocolors7.default.cyan(" Criando sugestao..."));
2829
- const date = new Date().toISOString().split("T")[0];
2830
- const body = `## Sugestao
2831
-
2832
- ${message}
2833
-
2834
- ---
2835
-
2836
- **Enviado por:** ${userName}
2837
- **Email:** ${userEmail}
2838
- **Data:** ${date}
2839
-
2840
- ---
2841
- *Criado via \`nimbus lola suggest\`*`;
2842
- const title = `Sugestao: ${message.slice(0, 50)}${message.length > 50 ? "..." : ""}`;
2843
- const result = Bun.spawnSync([
2844
- "gh",
2845
- "issue",
2846
- "create",
2847
- "--repo",
2848
- "nimbuslab/lola",
2849
- "--title",
2850
- title,
2851
- "--body",
2852
- body,
2853
- "--label",
2854
- "sugestao"
2855
- ], {
2856
- stdout: "inherit",
2857
- stderr: "inherit"
2858
- });
2859
- if (result.exitCode !== 0) {
2860
- console.log(import_picocolors7.default.red(" Erro ao criar issue"));
2861
- process.exit(1);
2862
- }
2863
- console.log();
2864
- console.log(import_picocolors7.default.green(" Sugestao enviada! Hugo vai revisar."));
2865
- console.log();
2866
- }
2867
- var PROFILES = {
2868
- millennial: {
2869
- label: "Millennial",
2870
- hint: "Nerd 90s/2000s, DBZ, Matrix, MSN",
2871
- emoji: ""
2872
- },
2873
- genz: {
2874
- label: "Gen Z",
2875
- hint: "Direto, girias atuais, slay",
2876
- emoji: ""
2877
- },
2878
- profissional: {
2879
- label: "Profissional",
2880
- hint: "100% tecnico, sem referencias",
2881
- emoji: ""
2882
- },
2883
- nerd: {
2884
- label: "Nerd",
2885
- hint: "Star Trek, vim jokes, deep tech",
2886
- emoji: ""
2887
- },
2888
- chill: {
2889
- label: "Chill",
2890
- hint: "Relaxado, vibes cafe, positivo",
2891
- emoji: ""
2892
- }
2893
- };
2894
- async function onboardDev() {
2895
- console.log();
2896
- console.log(import_picocolors7.default.cyan(" Lola - Onboarding"));
2897
- console.log(import_picocolors7.default.dim(" ================="));
2898
- console.log();
2899
- if (!existsSync2(LOLA_DIR)) {
2900
- console.log(import_picocolors7.default.yellow(" Lola nao instalada. Instalando primeiro..."));
2901
- console.log();
2902
- await installLolaBase();
2903
- console.log();
2904
- }
2905
- const gitUser = Bun.spawnSync(["git", "config", "user.name"], { stdout: "pipe" });
2906
- const defaultName = gitUser.stdout.toString().trim() || "";
2907
- Ie(import_picocolors7.default.bgCyan(import_picocolors7.default.black(" Bem-vindo a nimbuslab! ")));
2908
- const devName = await he({
2909
- message: "Qual seu nome?",
2910
- placeholder: "Seu nome",
2911
- initialValue: defaultName,
2912
- validate: (v2) => v2 ? undefined : "Nome e obrigatorio"
2913
- });
2914
- if (pD(devName)) {
2915
- xe("Onboarding cancelado");
2916
- process.exit(0);
2917
- }
2918
- const profile = await ve({
2919
- message: "Qual perfil da Lola voce prefere?",
2920
- options: Object.entries(PROFILES).map(([value, { label, hint }]) => ({
2921
- value,
2922
- label,
2923
- hint
2924
- }))
2925
- });
2926
- if (pD(profile)) {
2927
- xe("Onboarding cancelado");
2928
- process.exit(0);
2929
- }
2930
- const claudeDir = join3(HOME, ".claude");
2931
- await Bun.$`mkdir -p ${claudeDir}`;
2932
- const content = `# User Memory
2933
-
2934
- Memoria persistente para sessoes Claude Code
2935
-
2936
- ---
2937
-
2938
- ## Dev
2939
-
2940
- **Nome:** ${devName}
2941
- **Maquina:** ${process.env.HOSTNAME || "local"}
2942
- **Onboarding:** ${new Date().toISOString().split("T")[0]}
2943
-
2944
- ---
2945
-
2946
- ## Configuracoes da Lola
2947
-
2948
- \`\`\`
2949
- lola_profile: ${profile}
2950
- \`\`\`
2951
-
2952
- ---
2953
-
2954
- ## Ultima Sessao
2955
-
2956
- (sera preenchido automaticamente)
2957
-
2958
- ---
2959
- `;
2960
- await Bun.write(USER_MEMORY, content);
2961
- Se(import_picocolors7.default.green("Onboarding concluido!"));
2962
- console.log();
2963
- console.log(import_picocolors7.default.bold(" Resumo:"));
2964
- console.log(import_picocolors7.default.dim(" Nome: ") + import_picocolors7.default.white(devName));
2965
- console.log(import_picocolors7.default.dim(" Perfil: ") + import_picocolors7.default.white(PROFILES[profile].label));
2966
- console.log();
2967
- console.log(import_picocolors7.default.bold(" Proximos passos:"));
2968
- console.log(import_picocolors7.default.dim(" 1. ") + import_picocolors7.default.white("lola") + import_picocolors7.default.dim(" - Iniciar sessao com a Lola"));
2969
- console.log(import_picocolors7.default.dim(" 2. ") + import_picocolors7.default.white("nimbus create meu-projeto --fast") + import_picocolors7.default.dim(" - Criar projeto"));
2970
- console.log(import_picocolors7.default.dim(" 3. ") + import_picocolors7.default.white('lola suggest "sua ideia"') + import_picocolors7.default.dim(" - Sugerir melhoria"));
2971
- console.log();
2972
- console.log(import_picocolors7.default.dim(" Docs: ~/.lola/README.md"));
2973
- console.log();
2974
- }
2975
- var QUIZ_QUESTIONS = [
2976
- {
2977
- question: "Quais sao os 4 valores da nimbuslab?",
2978
- options: [
2979
- { value: "a", label: "Velocidade, Qualidade, Preco, Entrega" },
2980
- { value: "b", label: "Cocriacao, Inovacao, Evolucao, Humanizacao" },
2981
- { value: "c", label: "Codigo, Design, Marketing, Vendas" },
2982
- { value: "d", label: "Agil, Lean, Scrum, Kanban" }
2983
- ],
2984
- correct: "b",
2985
- explanation: "Cocriacao (construimos junto), Inovacao (buscamos o novo), Evolucao (aprendizado continuo), Humanizacao (tecnologia a servico das pessoas)."
2986
- },
2987
- {
2988
- question: "Quais sao os 4 pilares da filosofia fast?",
2989
- options: [
2990
- { value: "a", label: "Analise, Planejamento, Execucao, Documentacao" },
2991
- { value: "b", label: "Design, Codigo, Teste, Deploy" },
2992
- { value: "c", label: "Briefing, Prototipo, Desenvolvimento, Lancamento" },
2993
- { value: "d", label: "Discovery, Definition, Development, Delivery" }
2994
- ],
2995
- correct: "a",
2996
- explanation: "Filosofia fast: 1. Analise (entender), 2. Planejamento (definir caminho), 3. Execucao (implementar), 4. Documentacao (registrar)."
2997
- },
2998
- {
2999
- question: "Qual package manager a nimbuslab usa como padrao?",
3000
- options: [
3001
- { value: "a", label: "npm" },
3002
- { value: "b", label: "yarn" },
3003
- { value: "c", label: "pnpm" },
3004
- { value: "d", label: "bun" }
3005
- ],
3006
- correct: "d",
3007
- explanation: "Bun e o package manager padrao. Mais rapido e com menos dependencias."
3008
- },
3009
- {
3010
- question: "Qual o estilo padrao do shadcn/ui na nimbuslab?",
3011
- options: [
3012
- { value: "a", label: "new-york" },
3013
- { value: "b", label: "default" },
3014
- { value: "c", label: "minimal" },
3015
- { value: "d", label: "custom" }
3016
- ],
3017
- correct: "b",
3018
- explanation: "Usamos o estilo 'default' do shadcn/ui. Nunca 'new-york'."
3019
- },
3020
- {
3021
- question: "Em projetos externos (stealth mode), a Lola deve:",
3022
- options: [
3023
- { value: "a", label: "Sempre mencionar a nimbuslab nos commits" },
3024
- { value: "b", label: "Usar assinatura 'Co-authored-by: Lola'" },
3025
- { value: "c", label: "Nunca mencionar nimbuslab, Lola ou IA" },
3026
- { value: "d", label: "Adicionar badge da nimbuslab no README" }
3027
- ],
3028
- correct: "c",
3029
- explanation: "Stealth mode: commits sem mencao a nimbuslab/Lola/IA. O cliente nao precisa saber dos bastidores."
3030
- },
3031
- {
3032
- question: "Qual a versao minima do Next.js usada na stack nimbuslab?",
3033
- options: [
3034
- { value: "a", label: "Next.js 13" },
3035
- { value: "b", label: "Next.js 14" },
3036
- { value: "c", label: "Next.js 15" },
3037
- { value: "d", label: "Next.js 16" }
3038
- ],
3039
- correct: "d",
3040
- explanation: "Stack atual: Next.js 16+ com App Router e Turbopack."
3041
- },
3042
- {
3043
- question: "Quem pode aprovar e mergear mudancas no repositorio da Lola?",
3044
- options: [
3045
- { value: "a", label: "Qualquer dev da nimbuslab" },
3046
- { value: "b", label: "Apenas o Hugo" },
3047
- { value: "c", label: "Qualquer pessoa com acesso ao repo" },
3048
- { value: "d", label: "A propria Lola via automacao" }
3049
- ],
3050
- correct: "b",
3051
- explanation: "Apenas o Hugo pode aprovar e mergear. Devs sugerem via 'lola suggest', Hugo revisa."
3052
- },
3053
- {
3054
- question: "Em commits da nimbuslab, qual o idioma correto?",
3055
- options: [
3056
- { value: "a", label: "Ingles" },
3057
- { value: "b", label: "Portugues (BR)" },
3058
- { value: "c", label: "Depende do projeto" },
3059
- { value: "d", label: "Spanglish" }
3060
- ],
3061
- correct: "b",
3062
- explanation: "Commits e PRs em Portugues (BR). Codigo e comentarios em Ingles."
3063
- }
3064
- ];
3065
- async function runQuiz() {
3066
- console.log();
3067
- console.log(import_picocolors7.default.cyan(" Quiz nimbuslab"));
3068
- console.log(import_picocolors7.default.dim(" =============="));
3069
- console.log();
3070
- console.log(import_picocolors7.default.dim(" Teste seus conhecimentos sobre a nimbuslab!"));
3071
- console.log(import_picocolors7.default.dim(" 8 perguntas sobre valores, filosofia e stack."));
3072
- console.log();
3073
- let score = 0;
3074
- const results = [];
3075
- for (let i = 0;i < QUIZ_QUESTIONS.length; i++) {
3076
- const q2 = QUIZ_QUESTIONS[i];
3077
- const answer = await ve({
3078
- message: `${i + 1}. ${q2.question}`,
3079
- options: q2.options
3080
- });
3081
- if (pD(answer)) {
3082
- xe("Quiz cancelado");
3083
- process.exit(0);
3084
- }
3085
- const isCorrect = answer === q2.correct;
3086
- if (isCorrect) {
3087
- score++;
3088
- console.log(import_picocolors7.default.green(" Correto!"));
3089
- } else {
3090
- console.log(import_picocolors7.default.red(" Incorreto."));
3091
- }
3092
- console.log(import_picocolors7.default.dim(` ${q2.explanation}`));
3093
- console.log();
3094
- results.push({
3095
- question: q2.question,
3096
- correct: isCorrect,
3097
- explanation: q2.explanation
3098
- });
3099
- }
3100
- const percentage = Math.round(score / QUIZ_QUESTIONS.length * 100);
3101
- const passed = percentage >= 75;
3102
- console.log(import_picocolors7.default.bold(" Resultado:"));
3103
- console.log();
3104
- if (passed) {
3105
- console.log(import_picocolors7.default.green(` ${score}/${QUIZ_QUESTIONS.length} (${percentage}%) - Aprovado!`));
3106
- console.log();
3107
- if (percentage === 100) {
3108
- console.log(import_picocolors7.default.cyan(" Perfeito! Voce conhece bem a nimbuslab."));
3109
- } else {
3110
- console.log(import_picocolors7.default.cyan(" Muito bem! Voce esta pronto para trabalhar."));
3111
- }
3112
- } else {
3113
- console.log(import_picocolors7.default.yellow(` ${score}/${QUIZ_QUESTIONS.length} (${percentage}%) - Precisa revisar`));
3114
- console.log();
3115
- console.log(import_picocolors7.default.dim(" Revise os conceitos em:"));
3116
- console.log(import_picocolors7.default.dim(" ~/.lola/core/values.md"));
3117
- console.log(import_picocolors7.default.dim(" ~/.lola/core/philosophy.md"));
3118
- console.log(import_picocolors7.default.dim(" ~/.lola/modules/stack.md"));
3119
- }
3120
- console.log();
3121
- }
3122
- async function installInteractive() {
3123
- console.log();
3124
- console.log(import_picocolors7.default.cyan(" Lola - Code Agent da nimbuslab"));
3125
- console.log(import_picocolors7.default.dim(" ==============================="));
3126
- console.log();
3127
- const hasClaude = hasClaudeCLI();
3128
- const hasGemini = hasGeminiCLI();
3129
- console.log(import_picocolors7.default.dim(" Detectando agents..."));
3130
- console.log(import_picocolors7.default.dim(` Claude CLI: ${hasClaude ? import_picocolors7.default.green("instalado") : import_picocolors7.default.yellow("nao encontrado")}`));
3131
- console.log(import_picocolors7.default.dim(` Gemini CLI: ${hasGemini ? import_picocolors7.default.green("instalado") : import_picocolors7.default.yellow("nao encontrado")}`));
3132
- console.log();
3133
- const agentChoice = await ve({
3134
- message: "Qual agent deseja configurar?",
3135
- options: [
3136
- {
3137
- value: "all",
3138
- label: "Todos (Recomendado)",
3139
- hint: "Configura Claude e Gemini"
3140
- },
3141
- {
3142
- value: "claude",
3143
- label: "Apenas Claude",
3144
- hint: hasClaude ? "Ja instalado" : "Sera instalado"
3145
- },
3146
- {
3147
- value: "gemini",
3148
- label: "Apenas Gemini",
3149
- hint: hasGemini ? "Ja instalado" : "Sera instalado"
3150
- }
3151
- ]
3152
- });
3153
- if (pD(agentChoice)) {
3154
- xe("Instalacao cancelada");
3155
- process.exit(0);
3156
- }
3157
- const choice = agentChoice;
3158
- await installLolaBase();
3159
- if (choice === "claude" || choice === "all") {
3160
- console.log();
3161
- console.log(import_picocolors7.default.bgBlue(import_picocolors7.default.white(" CLAUDE ")));
3162
- await setupClaude();
3163
- }
3164
- if (choice === "gemini" || choice === "all") {
3165
- console.log();
3166
- console.log(import_picocolors7.default.bgMagenta(import_picocolors7.default.white(" GEMINI ")));
3167
- await setupGemini();
3168
- }
3169
- console.log();
3170
- console.log(import_picocolors7.default.green(" ==============================="));
3171
- console.log(import_picocolors7.default.green(" Instalacao concluida!"));
3172
- console.log(import_picocolors7.default.green(" ==============================="));
3173
- console.log();
3174
- if (choice === "claude" || choice === "all") {
3175
- console.log(import_picocolors7.default.dim(" lola ") + import_picocolors7.default.white("# Claude com Lola"));
3176
- }
3177
- if (choice === "gemini" || choice === "all") {
3178
- console.log(import_picocolors7.default.dim(" lola-gemini ") + import_picocolors7.default.white("# Gemini com Lola"));
3179
- }
3180
- console.log();
3181
- console.log(import_picocolors7.default.bold(" lola-memory (compartilhado entre agents):"));
3182
- console.log(import_picocolors7.default.dim(" remember, learn, memory_stats"));
3183
- console.log();
3184
- }
3185
- async function installLolaBase() {
3186
- console.log();
3187
- console.log(import_picocolors7.default.cyan(" Instalando base Lola (~/.lola)..."));
3188
- const isUpdate = existsSync2(LOLA_DIR);
3189
- if (isUpdate) {
3190
- console.log(import_picocolors7.default.dim(` Lola ja instalada em ${LOLA_DIR}`));
3191
- console.log(import_picocolors7.default.dim(" Atualizando..."));
3192
- const statusCheck = Bun.spawnSync(["git", "status", "--porcelain"], {
3193
- cwd: LOLA_DIR,
3194
- stdout: "pipe"
3195
- });
3196
- const hasLocalChanges = statusCheck.stdout.toString().trim().length > 0;
3197
- if (hasLocalChanges) {
3198
- console.log(import_picocolors7.default.dim(" Salvando mudancas locais..."));
3199
- Bun.spawnSync(["git", "stash", "--quiet"], {
3200
- cwd: LOLA_DIR,
3201
- stdout: "pipe",
3202
- stderr: "pipe"
3203
- });
3204
- }
3205
- const result = Bun.spawnSync(["git", "pull", "--quiet"], {
3206
- cwd: LOLA_DIR,
3207
- stdout: "inherit",
3208
- stderr: "inherit"
3209
- });
3210
- if (hasLocalChanges) {
3211
- console.log(import_picocolors7.default.dim(" Restaurando mudancas locais..."));
3212
- const stashPop = Bun.spawnSync(["git", "stash", "pop", "--quiet"], {
3213
- cwd: LOLA_DIR,
3214
- stdout: "pipe",
3215
- stderr: "pipe"
3216
- });
3217
- if (stashPop.exitCode !== 0) {
3218
- console.log(import_picocolors7.default.yellow(" Aviso: conflito ao restaurar mudancas locais"));
3219
- console.log(import_picocolors7.default.dim(" Verifique ~/.lola e resolva manualmente: git stash pop"));
3220
- }
3221
- }
3222
- if (result.exitCode !== 0) {
3223
- console.log(import_picocolors7.default.red(" Erro ao atualizar Lola"));
3224
- process.exit(1);
3225
- }
3226
- console.log(import_picocolors7.default.green(" Atualizado!"));
3227
- } else {
3228
- console.log(import_picocolors7.default.dim(` Clonando em ${LOLA_DIR}...`));
3229
- const result = Bun.spawnSync(["git", "clone", "--quiet", LOLA_REPO, LOLA_DIR], {
3230
- stdout: "inherit",
3231
- stderr: "inherit"
3232
- });
3233
- if (result.exitCode !== 0) {
3234
- console.log(import_picocolors7.default.red(" Erro ao clonar repositorio"));
3235
- console.log(import_picocolors7.default.dim(" Verifique se tem acesso ao repo nimbuslab/lola"));
3236
- process.exit(1);
3237
- }
3238
- console.log(import_picocolors7.default.green(" Instalado!"));
3239
- }
3240
- }
3241
- async function setupClaude() {
3242
- if (!hasClaudeCLI()) {
3243
- console.log(import_picocolors7.default.yellow(" Claude CLI nao encontrado"));
3244
- console.log(import_picocolors7.default.dim(" Instale: https://claude.ai/download"));
3245
- console.log(import_picocolors7.default.dim(" Depois rode 'nimbus lola install' novamente"));
3246
- return;
3247
- }
3248
- console.log(import_picocolors7.default.green(" Claude CLI encontrado"));
3249
- const isWindows = process.platform === "win32";
3250
- const lolaAgent = join3(LOLA_DIR, "agents", "claude.md");
3251
- console.log();
3252
- console.log(import_picocolors7.default.cyan(" Configurando comando lola..."));
3253
- if (isWindows) {
3254
- const ps5ProfileDir = join3(HOME, "Documents", "WindowsPowerShell");
3255
- const ps7ProfileDir = join3(HOME, "Documents", "PowerShell");
3256
- const profileName = "Microsoft.PowerShell_profile.ps1";
3257
- const lolaFunction = `
3258
- # Lola - Code Agent da nimbuslab
3259
- function lola {
3260
- param([Parameter(ValueFromRemainingArguments=$true)]$args)
3261
- $agent = "$env:USERPROFILE\\.lola\\agents\\claude.md"
3262
- if (Test-Path $agent) {
3263
- claude --append-system-prompt-file $agent @args
3264
- } else {
3265
- Write-Host "Agente Lola nao encontrado. Rode: nimbus lola install"
3266
- }
3267
- }
3268
- `;
3269
- const profiles = [
3270
- { dir: ps5ProfileDir, name: "PowerShell 5.x" },
3271
- { dir: ps7ProfileDir, name: "PowerShell 7+" }
3272
- ];
3273
- let addedToAny = false;
3274
- for (const { dir, name } of profiles) {
3275
- const profilePath = join3(dir, profileName);
3276
- if (!existsSync2(dir)) {
3277
- await Bun.$`mkdir -p ${dir}`;
3278
- }
3279
- let profileContent = "";
3280
- if (existsSync2(profilePath)) {
3281
- profileContent = await Bun.file(profilePath).text();
3282
- }
3283
- if (!profileContent.includes("function lola")) {
3284
- await Bun.write(profilePath, profileContent + lolaFunction);
3285
- console.log(import_picocolors7.default.green(` Funcao lola adicionada ao ${name} profile`));
3286
- addedToAny = true;
3287
- }
3288
- }
3289
- if (addedToAny) {
3290
- console.log(import_picocolors7.default.yellow(" Reinicie o PowerShell para usar o comando 'lola'"));
3291
- } else {
3292
- console.log(import_picocolors7.default.green(" Funcao lola ja existe"));
3293
- }
3294
- } else {
3295
- const binDir = join3(HOME, ".local", "bin");
3296
- const lolaScript = join3(binDir, "lola");
3297
- if (!existsSync2(lolaScript)) {
3298
- await Bun.$`mkdir -p ${binDir}`;
3299
- const unixScript = `#!/bin/bash
3300
- # lola - Code Agent da nimbuslab
3301
- LOLA_AGENT="${lolaAgent}"
3302
-
3303
- if [[ "$1" == "-h" || "$1" == "--help" ]]; then
3304
- echo "lola - Code Agent da nimbuslab"
3305
- echo "Uso: lola [args]"
3306
- echo " lola Abre Claude CLI com a Lola"
3307
- echo " lola --resume Resume sessao anterior"
3308
- exit 0
3309
- fi
3310
-
3311
- if [[ -f "$LOLA_AGENT" ]]; then
3312
- exec claude --append-system-prompt-file "$LOLA_AGENT" "$@"
3313
- else
3314
- echo "Agente Lola nao encontrado: $LOLA_AGENT"
3315
- echo "Rode: nimbus lola install"
3316
- exit 1
3317
- fi
3318
- `;
3319
- await Bun.write(lolaScript, unixScript);
3320
- await Bun.$`chmod +x ${lolaScript}`;
3321
- console.log(import_picocolors7.default.green(` Script lola criado em ${lolaScript}`));
3322
- const pathEnv = process.env.PATH || "";
3323
- if (!pathEnv.includes(".local/bin")) {
3324
- console.log();
3325
- console.log(import_picocolors7.default.yellow(" IMPORTANTE: Adicione ~/.local/bin ao seu PATH"));
3326
- console.log(import_picocolors7.default.dim(' export PATH="$HOME/.local/bin:$PATH"'));
3327
- }
3328
- } else {
3329
- console.log(import_picocolors7.default.green(" Script lola ja existe"));
3330
- }
3331
- }
3332
- await installLolaMemoryMCP();
3333
- await installLolaCommands();
3334
- const claudeDir = join3(HOME, ".claude");
3335
- if (!existsSync2(USER_MEMORY)) {
3336
- console.log();
3337
- console.log(import_picocolors7.default.cyan(" Configurando USER_MEMORY.md..."));
3338
- const gitUserResult = Bun.spawnSync(["git", "config", "user.name"], { stdout: "pipe" });
3339
- const gitEmailResult = Bun.spawnSync(["git", "config", "user.email"], { stdout: "pipe" });
3340
- const gitUser = gitUserResult.stdout.toString().trim() || "Dev";
3341
- const gitEmail = gitEmailResult.stdout.toString().trim() || "";
3342
- const hostname = process.env.HOSTNAME || process.env.COMPUTERNAME || "local";
3343
- const today = new Date().toISOString().split("T")[0];
3344
- await Bun.$`mkdir -p ${claudeDir}`;
3345
- const content = `# User Memory
3346
-
3347
- Memoria persistente para sessoes Claude Code
3348
-
3349
- ---
3350
-
3351
- ## Dev
3352
-
3353
- **Nome:** ${gitUser}
3354
- **Email:** ${gitEmail}
3355
- **Maquina:** ${hostname}
3356
- **Instalacao:** ${today}
3357
-
3358
- ---
3359
-
3360
- ## Configuracoes da Lola
3361
-
3362
- \`\`\`
3363
- lola_profile: millennial
3364
- \`\`\`
3365
-
3366
- ---
3367
-
3368
- ## Ultima Sessao
3369
-
3370
- (sera preenchido automaticamente)
3371
-
3372
- ---
3373
- `;
3374
- await Bun.write(USER_MEMORY, content);
3375
- console.log(import_picocolors7.default.green(` USER_MEMORY.md criado para ${gitUser}!`));
3376
- }
3377
- console.log();
3378
- console.log(import_picocolors7.default.green(" Claude configurado!"));
3379
- }
3380
- var SUBCOMMAND_ALIASES = {
3381
- i: "install",
3382
- s: "suggest",
3383
- o: "onboard",
3384
- q: "quiz",
3385
- h: "help",
3386
- sync: "install",
3387
- "--help": "help",
3388
- "-h": "help"
3389
- };
3390
- async function lola(args) {
3391
- const rawSubcommand = args[0];
3392
- const subcommand = rawSubcommand ? SUBCOMMAND_ALIASES[rawSubcommand] || rawSubcommand : null;
3393
- if (!subcommand || subcommand === "install") {
3394
- await installInteractive();
3395
- } else if (subcommand === "onboard") {
3396
- await onboardDev();
3397
- } else if (subcommand === "quiz") {
3398
- await runQuiz();
3399
- } else if (subcommand === "suggest") {
3400
- const message = args.slice(1).join(" ");
3401
- await suggestImprovement(message);
3402
- } else if (subcommand === "help") {
3403
- showLolaHelp();
3404
- } else {
3405
- console.log(import_picocolors7.default.red(` Subcomando desconhecido: ${rawSubcommand}`));
3406
- showLolaHelp();
3407
- process.exit(1);
3408
- }
3409
- }
3410
- function showLolaHelp() {
3411
- console.log();
3412
- console.log(import_picocolors7.default.bold(" Lola - Code Agent da nimbuslab"));
3413
- console.log();
3414
- console.log(import_picocolors7.default.bold(" Uso:") + " nimbus lola [subcomando]");
3415
- console.log();
3416
- console.log(import_picocolors7.default.bold(" Subcomandos:"));
3417
- console.log(import_picocolors7.default.dim(" install, i ") + import_picocolors7.default.white("Instalar/atualizar Lola + MCP"));
3418
- console.log(import_picocolors7.default.dim(" onboard, o ") + import_picocolors7.default.white("Configurar perfil (novos devs)"));
3419
- console.log(import_picocolors7.default.dim(" quiz, q ") + import_picocolors7.default.white("Quiz sobre a nimbuslab"));
3420
- console.log(import_picocolors7.default.dim(" suggest, s ") + import_picocolors7.default.white("Sugerir melhoria (cria issue)"));
3421
- console.log(import_picocolors7.default.dim(" help, h ") + import_picocolors7.default.white("Mostrar esta ajuda"));
3422
- console.log();
3423
- console.log(import_picocolors7.default.bold(" Exemplos:"));
3424
- console.log(import_picocolors7.default.dim(" $ nimbus lola i"));
3425
- console.log(import_picocolors7.default.dim(" $ nimbus lola o"));
3426
- console.log(import_picocolors7.default.dim(" $ nimbus lola q"));
3427
- console.log(import_picocolors7.default.dim(' $ nimbus lola s "adicionar suporte a X"'));
3428
- console.log();
3429
- console.log(import_picocolors7.default.bold(" lola-memory (dentro do Claude):"));
3430
- console.log(import_picocolors7.default.dim(' remember "query" ') + import_picocolors7.default.white("Buscar conhecimento"));
3431
- console.log(import_picocolors7.default.dim(' learn "content" ') + import_picocolors7.default.white("Salvar conhecimento"));
3432
- console.log(import_picocolors7.default.dim(" memory_stats ") + import_picocolors7.default.white("Ver estatisticas"));
3433
- console.log(import_picocolors7.default.dim(" get_context ") + import_picocolors7.default.white("Perfil + memorias recentes"));
3434
- console.log();
3435
- }
3436
-
3437
- // src/commands/setup-node.ts
3438
- var import_picocolors8 = __toESM(require_picocolors(), 1);
3439
- import { execSync as execSync2, spawnSync as spawnSync2 } from "child_process";
3440
- import { existsSync as existsSync3, readFileSync as readFileSync2, writeFileSync } from "fs";
3441
- import { homedir as homedir2 } from "os";
3442
- import { join as join4 } from "path";
3443
- var HOME2 = homedir2();
3444
2573
  var IS_WINDOWS = process.platform === "win32";
3445
- var CHECK_CMD2 = IS_WINDOWS ? "where" : "which";
2574
+ var CHECK_CMD = IS_WINDOWS ? "where" : "which";
3446
2575
  function detectFnm() {
3447
2576
  const result = { name: "fnm", installed: false };
3448
- const check = spawnSync2(CHECK_CMD2, ["fnm"], { encoding: "utf-8", shell: true });
2577
+ const check = spawnSync2(CHECK_CMD, ["fnm"], { encoding: "utf-8", shell: true });
3449
2578
  const fnmLocations = IS_WINDOWS ? [
3450
- join4(HOME2, "scoop", "shims", "fnm.exe"),
3451
- join4(HOME2, "scoop", "apps", "fnm", "current", "fnm.exe"),
2579
+ join3(HOME, "scoop", "shims", "fnm.exe"),
2580
+ join3(HOME, "scoop", "apps", "fnm", "current", "fnm.exe"),
3452
2581
  "C:\\ProgramData\\chocolatey\\bin\\fnm.exe",
3453
- join4(HOME2, ".cargo", "bin", "fnm.exe"),
3454
- join4(HOME2, ".fnm", "fnm.exe"),
3455
- join4(HOME2, "AppData", "Local", "fnm", "fnm.exe"),
3456
- join4(HOME2, "AppData", "Roaming", "fnm", "fnm.exe"),
3457
- join4(HOME2, "AppData", "Local", "Microsoft", "fnm", "fnm.exe"),
3458
- join4(HOME2, "AppData", "Roaming", "fnm"),
3459
- join4(HOME2, "AppData", "Local", "fnm_multishells")
2582
+ join3(HOME, ".cargo", "bin", "fnm.exe"),
2583
+ join3(HOME, ".fnm", "fnm.exe"),
2584
+ join3(HOME, "AppData", "Local", "fnm", "fnm.exe"),
2585
+ join3(HOME, "AppData", "Roaming", "fnm", "fnm.exe"),
2586
+ join3(HOME, "AppData", "Local", "Microsoft", "fnm", "fnm.exe"),
2587
+ join3(HOME, "AppData", "Roaming", "fnm"),
2588
+ join3(HOME, "AppData", "Local", "fnm_multishells")
3460
2589
  ] : [
3461
- join4(HOME2, ".local", "share", "fnm", "fnm"),
3462
- join4(HOME2, ".fnm", "fnm"),
3463
- join4(HOME2, ".local", "bin", "fnm"),
2590
+ join3(HOME, ".local", "share", "fnm", "fnm"),
2591
+ join3(HOME, ".fnm", "fnm"),
2592
+ join3(HOME, ".local", "bin", "fnm"),
3464
2593
  "/opt/homebrew/bin/fnm",
3465
2594
  "/usr/local/bin/fnm",
3466
- join4(HOME2, ".cargo", "bin", "fnm")
2595
+ join3(HOME, ".cargo", "bin", "fnm")
3467
2596
  ];
3468
2597
  let fnmPath = null;
3469
- if (check.exitCode === 0) {
2598
+ if (check.status === 0) {
3470
2599
  fnmPath = check.stdout?.trim().split(`
3471
2600
  `)[0] || null;
3472
2601
  } else {
3473
2602
  for (const loc of fnmLocations) {
3474
- if (existsSync3(loc)) {
2603
+ if (existsSync2(loc)) {
3475
2604
  fnmPath = loc;
3476
2605
  break;
3477
2606
  }
3478
2607
  }
3479
2608
  }
3480
2609
  if (!fnmPath && process.env.FNM_DIR) {
3481
- if (existsSync3(process.env.FNM_DIR)) {
2610
+ if (existsSync2(process.env.FNM_DIR)) {
3482
2611
  fnmPath = process.env.FNM_DIR;
3483
2612
  }
3484
2613
  }
3485
2614
  if (!fnmPath && IS_WINDOWS) {
3486
- const fnmMultishells = join4(HOME2, "AppData", "Local", "fnm_multishells");
3487
- if (existsSync3(fnmMultishells)) {
2615
+ const fnmMultishells = join3(HOME, "AppData", "Local", "fnm_multishells");
2616
+ if (existsSync2(fnmMultishells)) {
3488
2617
  fnmPath = fnmMultishells;
3489
2618
  }
3490
2619
  }
@@ -3499,26 +2628,26 @@ function detectFnm() {
3499
2628
  } catch {}
3500
2629
  result.configFiles = [];
3501
2630
  if (IS_WINDOWS) {
3502
- const ps5Profile = join4(HOME2, "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1");
3503
- const ps7Profile = join4(HOME2, "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1");
3504
- const psProfile = join4(HOME2, "Documents", "PowerShell", "profile.ps1");
3505
- if (existsSync3(ps5Profile))
2631
+ const ps5Profile = join3(HOME, "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1");
2632
+ const ps7Profile = join3(HOME, "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1");
2633
+ const psProfile = join3(HOME, "Documents", "PowerShell", "profile.ps1");
2634
+ if (existsSync2(ps5Profile))
3506
2635
  result.configFiles.push(ps5Profile);
3507
- if (existsSync3(ps7Profile))
2636
+ if (existsSync2(ps7Profile))
3508
2637
  result.configFiles.push(ps7Profile);
3509
- if (existsSync3(psProfile))
2638
+ if (existsSync2(psProfile))
3510
2639
  result.configFiles.push(psProfile);
3511
2640
  } else {
3512
2641
  const configs = [
3513
- join4(HOME2, ".bashrc"),
3514
- join4(HOME2, ".bash_profile"),
3515
- join4(HOME2, ".profile"),
3516
- join4(HOME2, ".zshrc"),
3517
- join4(HOME2, ".zprofile"),
3518
- join4(HOME2, ".config", "fish", "config.fish")
2642
+ join3(HOME, ".bashrc"),
2643
+ join3(HOME, ".bash_profile"),
2644
+ join3(HOME, ".profile"),
2645
+ join3(HOME, ".zshrc"),
2646
+ join3(HOME, ".zprofile"),
2647
+ join3(HOME, ".config", "fish", "config.fish")
3519
2648
  ];
3520
2649
  for (const cfg of configs) {
3521
- if (existsSync3(cfg))
2650
+ if (existsSync2(cfg))
3522
2651
  result.configFiles.push(cfg);
3523
2652
  }
3524
2653
  }
@@ -3527,20 +2656,20 @@ function detectFnm() {
3527
2656
  function detectNvm() {
3528
2657
  const result = { name: "nvm", installed: false };
3529
2658
  if (IS_WINDOWS) {
3530
- const check = spawnSync2(CHECK_CMD2, ["nvm"], { encoding: "utf-8", shell: true });
2659
+ const check = spawnSync2(CHECK_CMD, ["nvm"], { encoding: "utf-8", shell: true });
3531
2660
  const nvmWinLocations = [
3532
- join4(HOME2, "AppData", "Roaming", "nvm", "nvm.exe"),
2661
+ join3(HOME, "AppData", "Roaming", "nvm", "nvm.exe"),
3533
2662
  "C:\\Program Files\\nvm\\nvm.exe",
3534
2663
  "C:\\ProgramData\\nvm\\nvm.exe",
3535
- join4(HOME2, "nvm", "nvm.exe")
2664
+ join3(HOME, "nvm", "nvm.exe")
3536
2665
  ];
3537
2666
  let nvmPath = null;
3538
- if (check.exitCode === 0) {
2667
+ if (check.status === 0) {
3539
2668
  nvmPath = check.stdout?.trim().split(`
3540
2669
  `)[0] || null;
3541
2670
  } else {
3542
2671
  for (const loc of nvmWinLocations) {
3543
- if (existsSync3(loc)) {
2672
+ if (existsSync2(loc)) {
3544
2673
  nvmPath = loc;
3545
2674
  break;
3546
2675
  }
@@ -3556,31 +2685,31 @@ function detectNvm() {
3556
2685
  } catch {}
3557
2686
  result.configFiles = [];
3558
2687
  const configs = [
3559
- join4(HOME2, "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1"),
3560
- join4(HOME2, "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1"),
3561
- join4(HOME2, "Documents", "PowerShell", "profile.ps1")
2688
+ join3(HOME, "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1"),
2689
+ join3(HOME, "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1"),
2690
+ join3(HOME, "Documents", "PowerShell", "profile.ps1")
3562
2691
  ];
3563
2692
  for (const cfg of configs) {
3564
- if (existsSync3(cfg))
2693
+ if (existsSync2(cfg))
3565
2694
  result.configFiles.push(cfg);
3566
2695
  }
3567
2696
  } else {
3568
- const nvmDir = process.env.NVM_DIR || join4(HOME2, ".nvm");
3569
- if (!existsSync3(nvmDir))
2697
+ const nvmDir = process.env.NVM_DIR || join3(HOME, ".nvm");
2698
+ if (!existsSync2(nvmDir))
3570
2699
  return result;
3571
2700
  result.installed = true;
3572
2701
  result.path = nvmDir;
3573
2702
  result.configFiles = [];
3574
2703
  const configs = [
3575
- join4(HOME2, ".bashrc"),
3576
- join4(HOME2, ".bash_profile"),
3577
- join4(HOME2, ".profile"),
3578
- join4(HOME2, ".zshrc"),
3579
- join4(HOME2, ".zprofile"),
3580
- join4(HOME2, ".config", "fish", "config.fish")
2704
+ join3(HOME, ".bashrc"),
2705
+ join3(HOME, ".bash_profile"),
2706
+ join3(HOME, ".profile"),
2707
+ join3(HOME, ".zshrc"),
2708
+ join3(HOME, ".zprofile"),
2709
+ join3(HOME, ".config", "fish", "config.fish")
3581
2710
  ];
3582
2711
  for (const cfg of configs) {
3583
- if (existsSync3(cfg))
2712
+ if (existsSync2(cfg))
3584
2713
  result.configFiles.push(cfg);
3585
2714
  }
3586
2715
  }
@@ -3588,8 +2717,8 @@ function detectNvm() {
3588
2717
  }
3589
2718
  function detectVolta() {
3590
2719
  const result = { name: "volta", installed: false };
3591
- const check = spawnSync2(CHECK_CMD2, ["volta"], { encoding: "utf-8", shell: true });
3592
- if (check.exitCode !== 0)
2720
+ const check = spawnSync2(CHECK_CMD, ["volta"], { encoding: "utf-8", shell: true });
2721
+ if (check.status !== 0)
3593
2722
  return result;
3594
2723
  result.installed = true;
3595
2724
  result.path = check.stdout?.trim().split(`
@@ -3601,8 +2730,8 @@ function detectVolta() {
3601
2730
  return result;
3602
2731
  }
3603
2732
  function detectNode() {
3604
- const check = spawnSync2(CHECK_CMD2, ["node"], { encoding: "utf-8", shell: true });
3605
- if (check.exitCode !== 0)
2733
+ const check = spawnSync2(CHECK_CMD, ["node"], { encoding: "utf-8", shell: true });
2734
+ if (check.status !== 0)
3606
2735
  return { version: null, manager: null };
3607
2736
  const nodePath = check.stdout?.trim().split(`
3608
2737
  `)[0] || "";
@@ -3643,7 +2772,7 @@ function getGlobalPackages() {
3643
2772
  return packages;
3644
2773
  }
3645
2774
  function removeFnmFromConfig(configFile) {
3646
- if (!existsSync3(configFile))
2775
+ if (!existsSync2(configFile))
3647
2776
  return false;
3648
2777
  try {
3649
2778
  let content = readFileSync2(configFile, "utf-8");
@@ -3668,7 +2797,7 @@ function removeFnmFromConfig(configFile) {
3668
2797
  return false;
3669
2798
  }
3670
2799
  function removeNvmFromConfig(configFile) {
3671
- if (!existsSync3(configFile))
2800
+ if (!existsSync2(configFile))
3672
2801
  return false;
3673
2802
  try {
3674
2803
  let content = readFileSync2(configFile, "utf-8");
@@ -3704,7 +2833,7 @@ async function removeFnm(fnm) {
3704
2833
  const scoopCheck = spawnSync2("scoop", ["list"], { encoding: "utf-8", shell: true });
3705
2834
  if (scoopCheck.stdout?.includes("fnm")) {
3706
2835
  execSync2("scoop uninstall fnm", { stdio: "pipe" });
3707
- console.log(import_picocolors8.default.dim(" Removido via Scoop"));
2836
+ console.log(import_picocolors7.default.dim(" Removido via Scoop"));
3708
2837
  removed = true;
3709
2838
  }
3710
2839
  } catch {}
@@ -3713,7 +2842,7 @@ async function removeFnm(fnm) {
3713
2842
  const chocoCheck = spawnSync2("choco", ["list", "--local-only"], { encoding: "utf-8", shell: true });
3714
2843
  if (chocoCheck.stdout?.includes("fnm")) {
3715
2844
  execSync2("choco uninstall fnm -y", { stdio: "pipe" });
3716
- console.log(import_picocolors8.default.dim(" Removido via Chocolatey"));
2845
+ console.log(import_picocolors7.default.dim(" Removido via Chocolatey"));
3717
2846
  removed = true;
3718
2847
  }
3719
2848
  } catch {}
@@ -3723,28 +2852,28 @@ async function removeFnm(fnm) {
3723
2852
  const wingetCheck = spawnSync2("winget", ["list", "--name", "fnm"], { encoding: "utf-8", shell: true });
3724
2853
  if (wingetCheck.stdout?.includes("fnm")) {
3725
2854
  execSync2("winget uninstall fnm --silent", { stdio: "pipe" });
3726
- console.log(import_picocolors8.default.dim(" Removido via winget"));
2855
+ console.log(import_picocolors7.default.dim(" Removido via winget"));
3727
2856
  removed = true;
3728
2857
  }
3729
2858
  } catch {}
3730
2859
  }
3731
2860
  const winFnmDirs = [
3732
- join4(HOME2, ".fnm"),
3733
- join4(HOME2, "AppData", "Local", "fnm"),
3734
- join4(HOME2, "AppData", "Roaming", "fnm"),
3735
- join4(HOME2, "AppData", "Local", "fnm_multishells"),
3736
- join4(HOME2, "AppData", "Local", "Microsoft", "fnm")
2861
+ join3(HOME, ".fnm"),
2862
+ join3(HOME, "AppData", "Local", "fnm"),
2863
+ join3(HOME, "AppData", "Roaming", "fnm"),
2864
+ join3(HOME, "AppData", "Local", "fnm_multishells"),
2865
+ join3(HOME, "AppData", "Local", "Microsoft", "fnm")
3737
2866
  ];
3738
2867
  for (const dir of winFnmDirs) {
3739
- if (existsSync3(dir)) {
2868
+ if (existsSync2(dir)) {
3740
2869
  try {
3741
- execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: true });
3742
- console.log(import_picocolors8.default.dim(` Removido ${dir}`));
2870
+ execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: "cmd.exe" });
2871
+ console.log(import_picocolors7.default.dim(` Removido ${dir}`));
3743
2872
  removed = true;
3744
2873
  } catch {
3745
2874
  try {
3746
2875
  execSync2(`powershell -Command "Remove-Item -Path '${dir}' -Recurse -Force"`, { stdio: "pipe" });
3747
- console.log(import_picocolors8.default.dim(` Removido ${dir}`));
2876
+ console.log(import_picocolors7.default.dim(` Removido ${dir}`));
3748
2877
  removed = true;
3749
2878
  } catch {}
3750
2879
  }
@@ -3753,53 +2882,53 @@ async function removeFnm(fnm) {
3753
2882
  try {
3754
2883
  execSync2(`powershell -Command "[Environment]::SetEnvironmentVariable('FNM_DIR', $null, 'User')"`, { stdio: "pipe" });
3755
2884
  execSync2(`powershell -Command "[Environment]::SetEnvironmentVariable('FNM_MULTISHELL_PATH', $null, 'User')"`, { stdio: "pipe" });
3756
- console.log(import_picocolors8.default.dim(" Variaveis de ambiente FNM removidas"));
2885
+ console.log(import_picocolors7.default.dim(" Variaveis de ambiente FNM removidas"));
3757
2886
  removed = true;
3758
2887
  } catch {}
3759
2888
  for (const configFile of fnm.configFiles || []) {
3760
2889
  if (removeFnmFromConfig(configFile)) {
3761
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2890
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3762
2891
  removed = true;
3763
2892
  }
3764
2893
  }
3765
- spinner.stop(removed ? "fnm removido!" : import_picocolors8.default.yellow("fnm nao encontrado"));
2894
+ spinner.stop(removed ? "fnm removido!" : import_picocolors7.default.yellow("fnm nao encontrado"));
3766
2895
  return removed;
3767
2896
  } else {
3768
2897
  spinner.start("Removendo fnm...");
3769
2898
  let removed = false;
3770
2899
  try {
3771
2900
  const brewCheck = spawnSync2("brew", ["list", "fnm"], { encoding: "utf-8", shell: true });
3772
- if (brewCheck.exitCode === 0) {
2901
+ if (brewCheck.status === 0) {
3773
2902
  execSync2("brew uninstall fnm", { stdio: "pipe" });
3774
- console.log(import_picocolors8.default.dim(" Removido via Homebrew"));
2903
+ console.log(import_picocolors7.default.dim(" Removido via Homebrew"));
3775
2904
  removed = true;
3776
2905
  }
3777
2906
  } catch {}
3778
2907
  for (const configFile of fnm.configFiles || []) {
3779
2908
  if (removeFnmFromConfig(configFile)) {
3780
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2909
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3781
2910
  removed = true;
3782
2911
  }
3783
2912
  }
3784
2913
  const fnmDirs = [
3785
- join4(HOME2, ".fnm"),
3786
- join4(HOME2, ".local", "share", "fnm")
2914
+ join3(HOME, ".fnm"),
2915
+ join3(HOME, ".local", "share", "fnm")
3787
2916
  ];
3788
2917
  for (const fnmDir of fnmDirs) {
3789
- if (existsSync3(fnmDir)) {
2918
+ if (existsSync2(fnmDir)) {
3790
2919
  execSync2(`rm -rf "${fnmDir}"`, { stdio: "pipe" });
3791
- console.log(import_picocolors8.default.dim(` Removido ${fnmDir}`));
2920
+ console.log(import_picocolors7.default.dim(` Removido ${fnmDir}`));
3792
2921
  removed = true;
3793
2922
  }
3794
2923
  }
3795
2924
  const fnmBins = [
3796
- join4(HOME2, ".local", "bin", "fnm"),
3797
- join4(HOME2, ".cargo", "bin", "fnm")
2925
+ join3(HOME, ".local", "bin", "fnm"),
2926
+ join3(HOME, ".cargo", "bin", "fnm")
3798
2927
  ];
3799
2928
  for (const bin of fnmBins) {
3800
- if (existsSync3(bin)) {
2929
+ if (existsSync2(bin)) {
3801
2930
  execSync2(`rm -f "${bin}"`, { stdio: "pipe" });
3802
- console.log(import_picocolors8.default.dim(` Removido ${bin}`));
2931
+ console.log(import_picocolors7.default.dim(` Removido ${bin}`));
3803
2932
  removed = true;
3804
2933
  }
3805
2934
  }
@@ -3807,7 +2936,7 @@ async function removeFnm(fnm) {
3807
2936
  return removed;
3808
2937
  }
3809
2938
  } catch (error) {
3810
- spinner.stop(import_picocolors8.default.red("Erro ao remover fnm"));
2939
+ spinner.stop(import_picocolors7.default.red("Erro ao remover fnm"));
3811
2940
  return false;
3812
2941
  }
3813
2942
  }
@@ -3821,59 +2950,59 @@ async function removeNvm(nvm) {
3821
2950
  const wingetCheck = spawnSync2("winget", ["list", "--name", "nvm"], { encoding: "utf-8", shell: true });
3822
2951
  if (wingetCheck.stdout?.toLowerCase().includes("nvm")) {
3823
2952
  execSync2("winget uninstall nvm --silent", { stdio: "pipe" });
3824
- console.log(import_picocolors8.default.dim(" Removido via winget"));
2953
+ console.log(import_picocolors7.default.dim(" Removido via winget"));
3825
2954
  removed = true;
3826
2955
  }
3827
2956
  } catch {}
3828
2957
  const nvmWinDirs = [
3829
- join4(HOME2, "AppData", "Roaming", "nvm"),
3830
- join4("C:", "Program Files", "nvm"),
3831
- join4("C:", "ProgramData", "nvm")
2958
+ join3(HOME, "AppData", "Roaming", "nvm"),
2959
+ join3("C:", "Program Files", "nvm"),
2960
+ join3("C:", "ProgramData", "nvm")
3832
2961
  ];
3833
2962
  for (const dir of nvmWinDirs) {
3834
- if (existsSync3(dir)) {
2963
+ if (existsSync2(dir)) {
3835
2964
  try {
3836
- execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: true });
3837
- console.log(import_picocolors8.default.dim(` Removido ${dir}`));
2965
+ execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: "cmd.exe" });
2966
+ console.log(import_picocolors7.default.dim(` Removido ${dir}`));
3838
2967
  removed = true;
3839
2968
  } catch {}
3840
2969
  }
3841
2970
  }
3842
2971
  for (const configFile of nvm.configFiles || []) {
3843
2972
  if (removeNvmFromConfig(configFile)) {
3844
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2973
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3845
2974
  removed = true;
3846
2975
  }
3847
2976
  }
3848
2977
  if (!removed) {
3849
- console.log(import_picocolors8.default.yellow(`
2978
+ console.log(import_picocolors7.default.yellow(`
3850
2979
  nvm-windows pode precisar de remocao manual:`));
3851
- console.log(import_picocolors8.default.dim(" 1. Abra 'Adicionar ou remover programas'"));
3852
- console.log(import_picocolors8.default.dim(" 2. Procure por 'NVM for Windows'"));
3853
- console.log(import_picocolors8.default.dim(" 3. Clique em Desinstalar"));
2980
+ console.log(import_picocolors7.default.dim(" 1. Abra 'Adicionar ou remover programas'"));
2981
+ console.log(import_picocolors7.default.dim(" 2. Procure por 'NVM for Windows'"));
2982
+ console.log(import_picocolors7.default.dim(" 3. Clique em Desinstalar"));
3854
2983
  }
3855
- spinner.stop(removed ? "nvm removido!" : import_picocolors8.default.yellow("Verifique manualmente"));
2984
+ spinner.stop(removed ? "nvm removido!" : import_picocolors7.default.yellow("Verifique manualmente"));
3856
2985
  return removed;
3857
2986
  } else {
3858
2987
  spinner.start("Removendo nvm...");
3859
2988
  let removed = false;
3860
2989
  for (const configFile of nvm.configFiles || []) {
3861
2990
  if (removeNvmFromConfig(configFile)) {
3862
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2991
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3863
2992
  removed = true;
3864
2993
  }
3865
2994
  }
3866
- const nvmDir = process.env.NVM_DIR || join4(HOME2, ".nvm");
3867
- if (existsSync3(nvmDir)) {
2995
+ const nvmDir = process.env.NVM_DIR || join3(HOME, ".nvm");
2996
+ if (existsSync2(nvmDir)) {
3868
2997
  execSync2(`rm -rf "${nvmDir}"`, { stdio: "pipe" });
3869
- console.log(import_picocolors8.default.dim(` Removido ${nvmDir}`));
2998
+ console.log(import_picocolors7.default.dim(` Removido ${nvmDir}`));
3870
2999
  removed = true;
3871
3000
  }
3872
3001
  spinner.stop(removed ? "nvm removido!" : "nvm nao encontrado");
3873
3002
  return removed;
3874
3003
  }
3875
3004
  } catch (error) {
3876
- spinner.stop(import_picocolors8.default.red("Erro ao remover nvm"));
3005
+ spinner.stop(import_picocolors7.default.red("Erro ao remover nvm"));
3877
3006
  return false;
3878
3007
  }
3879
3008
  }
@@ -3882,8 +3011,8 @@ async function installVolta() {
3882
3011
  try {
3883
3012
  if (IS_WINDOWS) {
3884
3013
  spinner.start("Verificando metodo de instalacao...");
3885
- const wingetCheck = spawnSync2(CHECK_CMD2, ["winget"], { encoding: "utf-8", shell: true });
3886
- if (wingetCheck.exitCode === 0) {
3014
+ const wingetCheck = spawnSync2(CHECK_CMD, ["winget"], { encoding: "utf-8", shell: true });
3015
+ if (wingetCheck.status === 0) {
3887
3016
  spinner.stop("winget detectado");
3888
3017
  spinner.start("Instalando Volta via winget...");
3889
3018
  try {
@@ -3892,25 +3021,25 @@ async function installVolta() {
3892
3021
  timeout: 120000
3893
3022
  });
3894
3023
  spinner.stop("Volta instalado!");
3895
- const voltaPath = join4(HOME2, ".volta", "bin");
3896
- console.log(import_picocolors8.default.dim(` Adicionando ${voltaPath} ao PATH...`));
3024
+ const voltaPath = join3(HOME, ".volta", "bin");
3025
+ console.log(import_picocolors7.default.dim(` Adicionando ${voltaPath} ao PATH...`));
3897
3026
  try {
3898
- execSync2(`setx PATH "%PATH%;${voltaPath}"`, { stdio: "pipe", shell: true });
3027
+ execSync2(`setx PATH "%PATH%;${voltaPath}"`, { stdio: "pipe", shell: "cmd.exe" });
3899
3028
  } catch {}
3900
3029
  return true;
3901
3030
  } catch (e2) {
3902
- spinner.stop(import_picocolors8.default.yellow("winget falhou, tentando outro metodo..."));
3031
+ spinner.stop(import_picocolors7.default.yellow("winget falhou, tentando outro metodo..."));
3903
3032
  }
3904
3033
  }
3905
- const chocoCheck = spawnSync2(CHECK_CMD2, ["choco"], { encoding: "utf-8", shell: true });
3906
- if (chocoCheck.exitCode === 0) {
3034
+ const chocoCheck = spawnSync2(CHECK_CMD, ["choco"], { encoding: "utf-8", shell: true });
3035
+ if (chocoCheck.status === 0) {
3907
3036
  spinner.start("Instalando Volta via Chocolatey...");
3908
3037
  try {
3909
3038
  execSync2("choco install volta -y", { stdio: "pipe", timeout: 120000 });
3910
3039
  spinner.stop("Volta instalado!");
3911
3040
  return true;
3912
3041
  } catch {
3913
- spinner.stop(import_picocolors8.default.yellow("Chocolatey falhou"));
3042
+ spinner.stop(import_picocolors7.default.yellow("Chocolatey falhou"));
3914
3043
  }
3915
3044
  }
3916
3045
  spinner.start("Baixando Volta diretamente...");
@@ -3934,17 +3063,17 @@ async function installVolta() {
3934
3063
  spinner.stop("Volta instalado!");
3935
3064
  return true;
3936
3065
  } catch (e2) {
3937
- spinner.stop(import_picocolors8.default.yellow("Download direto falhou"));
3066
+ spinner.stop(import_picocolors7.default.yellow("Download direto falhou"));
3938
3067
  }
3939
3068
  console.log();
3940
- console.log(import_picocolors8.default.bold(" Instale manualmente:"));
3069
+ console.log(import_picocolors7.default.bold(" Instale manualmente:"));
3941
3070
  console.log();
3942
- console.log(import_picocolors8.default.cyan(" 1. Baixe: https://github.com/volta-cli/volta/releases/latest"));
3943
- console.log(import_picocolors8.default.dim(" (arquivo volta-windows.msi)"));
3071
+ console.log(import_picocolors7.default.cyan(" 1. Baixe: https://github.com/volta-cli/volta/releases/latest"));
3072
+ console.log(import_picocolors7.default.dim(" (arquivo volta-windows.msi)"));
3944
3073
  console.log();
3945
- console.log(import_picocolors8.default.cyan(" 2. Execute o instalador"));
3074
+ console.log(import_picocolors7.default.cyan(" 2. Execute o instalador"));
3946
3075
  console.log();
3947
- console.log(import_picocolors8.default.cyan(" 3. Reinicie o terminal"));
3076
+ console.log(import_picocolors7.default.cyan(" 3. Reinicie o terminal"));
3948
3077
  console.log();
3949
3078
  return false;
3950
3079
  } else {
@@ -3953,38 +3082,38 @@ async function installVolta() {
3953
3082
  stdio: "pipe",
3954
3083
  shell: "/bin/bash"
3955
3084
  });
3956
- const shellConfig = existsSync3(join4(HOME2, ".zshrc")) ? join4(HOME2, ".zshrc") : join4(HOME2, ".bashrc");
3085
+ const shellConfig = existsSync2(join3(HOME, ".zshrc")) ? join3(HOME, ".zshrc") : join3(HOME, ".bashrc");
3957
3086
  const voltaSetup = `
3958
3087
  # Volta - Node.js version manager
3959
3088
  export VOLTA_HOME="$HOME/.volta"
3960
3089
  export PATH="$VOLTA_HOME/bin:$PATH"
3961
3090
  `;
3962
- if (existsSync3(shellConfig)) {
3091
+ if (existsSync2(shellConfig)) {
3963
3092
  const content = readFileSync2(shellConfig, "utf-8");
3964
3093
  if (!content.includes("VOLTA_HOME")) {
3965
3094
  writeFileSync(shellConfig, content + voltaSetup);
3966
- console.log(import_picocolors8.default.dim(` Adicionado ao ${shellConfig}`));
3095
+ console.log(import_picocolors7.default.dim(` Adicionado ao ${shellConfig}`));
3967
3096
  }
3968
3097
  }
3969
3098
  spinner.stop("Volta instalado!");
3970
3099
  return true;
3971
3100
  }
3972
3101
  } catch (error) {
3973
- spinner.stop(import_picocolors8.default.red("Erro ao instalar Volta"));
3974
- console.log(import_picocolors8.default.dim(` ${error}`));
3102
+ spinner.stop(import_picocolors7.default.red("Erro ao instalar Volta"));
3103
+ console.log(import_picocolors7.default.dim(` ${error}`));
3975
3104
  return false;
3976
3105
  }
3977
3106
  }
3978
3107
  async function installNodeWithVolta() {
3979
3108
  const spinner = Y2();
3980
3109
  try {
3981
- const voltaBin = IS_WINDOWS ? "volta" : join4(HOME2, ".volta", "bin", "volta");
3110
+ const voltaBin = IS_WINDOWS ? "volta" : join3(HOME, ".volta", "bin", "volta");
3982
3111
  spinner.start("Instalando Node.js LTS via Volta...");
3983
- execSync2(`"${voltaBin}" install node`, { stdio: "pipe", shell: true });
3112
+ execSync2(`"${voltaBin}" install node`, { stdio: "pipe" });
3984
3113
  spinner.stop("Node.js instalado!");
3985
3114
  return true;
3986
3115
  } catch (error) {
3987
- spinner.stop(import_picocolors8.default.red("Erro ao instalar Node.js"));
3116
+ spinner.stop(import_picocolors7.default.red("Erro ao instalar Node.js"));
3988
3117
  return false;
3989
3118
  }
3990
3119
  }
@@ -3992,23 +3121,23 @@ async function reinstallGlobalPackages(packages) {
3992
3121
  if (packages.length === 0)
3993
3122
  return;
3994
3123
  const spinner = Y2();
3995
- const voltaBin = IS_WINDOWS ? "volta" : join4(HOME2, ".volta", "bin", "volta");
3124
+ const voltaBin = IS_WINDOWS ? "volta" : join3(HOME, ".volta", "bin", "volta");
3996
3125
  for (const pkg of packages) {
3997
3126
  spinner.start(`Instalando ${pkg}...`);
3998
3127
  try {
3999
- execSync2(`"${voltaBin}" install ${pkg}`, { stdio: "pipe", shell: true });
3128
+ execSync2(`"${voltaBin}" install ${pkg}`, { stdio: "pipe" });
4000
3129
  spinner.stop(`${pkg} instalado!`);
4001
3130
  } catch {
4002
- spinner.stop(import_picocolors8.default.yellow(`${pkg} - falha (instale manualmente)`));
3131
+ spinner.stop(import_picocolors7.default.yellow(`${pkg} - falha (instale manualmente)`));
4003
3132
  }
4004
3133
  }
4005
3134
  }
4006
3135
  async function setupNode(args) {
4007
3136
  const checkOnly = args.includes("--check") || args.includes("-c");
4008
3137
  console.log();
4009
- Ie(import_picocolors8.default.bgCyan(import_picocolors8.default.black(" nimbus setup node ")));
3138
+ Ie(import_picocolors7.default.bgCyan(import_picocolors7.default.black(" nimbus setup node ")));
4010
3139
  console.log();
4011
- console.log(import_picocolors8.default.bold(" Detectando ambiente..."));
3140
+ console.log(import_picocolors7.default.bold(" Detectando ambiente..."));
4012
3141
  console.log();
4013
3142
  const fnm = detectFnm();
4014
3143
  const nvm = detectNvm();
@@ -4016,27 +3145,27 @@ async function setupNode(args) {
4016
3145
  const node = detectNode();
4017
3146
  const status = (installed, version) => {
4018
3147
  if (!installed)
4019
- return import_picocolors8.default.dim("nao instalado");
4020
- return import_picocolors8.default.green(`instalado${version ? ` (${version})` : ""}`);
3148
+ return import_picocolors7.default.dim("nao instalado");
3149
+ return import_picocolors7.default.green(`instalado${version ? ` (${version})` : ""}`);
4021
3150
  };
4022
- console.log(` ${import_picocolors8.default.bold("fnm:")} ${status(fnm.installed, fnm.version)}`);
4023
- console.log(` ${import_picocolors8.default.bold("nvm:")} ${status(nvm.installed, nvm.version)}`);
4024
- console.log(` ${import_picocolors8.default.bold("volta:")} ${status(volta.installed, volta.version)}`);
3151
+ console.log(` ${import_picocolors7.default.bold("fnm:")} ${status(fnm.installed, fnm.version)}`);
3152
+ console.log(` ${import_picocolors7.default.bold("nvm:")} ${status(nvm.installed, nvm.version)}`);
3153
+ console.log(` ${import_picocolors7.default.bold("volta:")} ${status(volta.installed, volta.version)}`);
4025
3154
  console.log();
4026
- console.log(` ${import_picocolors8.default.bold("node:")} ${node.version || import_picocolors8.default.dim("nao encontrado")}`);
3155
+ console.log(` ${import_picocolors7.default.bold("node:")} ${node.version || import_picocolors7.default.dim("nao encontrado")}`);
4027
3156
  if (node.manager) {
4028
- console.log(` ${import_picocolors8.default.dim(`gerenciado por: ${node.manager}`)}`);
3157
+ console.log(` ${import_picocolors7.default.dim(`gerenciado por: ${node.manager}`)}`);
4029
3158
  }
4030
3159
  console.log();
4031
3160
  if (volta.installed && !fnm.installed && !nvm.installed) {
4032
3161
  M2.success("Ambiente OK! Volta instalado e configurado.");
4033
- Se(import_picocolors8.default.green("Nada a fazer."));
3162
+ Se(import_picocolors7.default.green("Nada a fazer."));
4034
3163
  return;
4035
3164
  }
4036
3165
  if (checkOnly) {
4037
3166
  if (fnm.installed || nvm.installed) {
4038
- console.log(import_picocolors8.default.yellow(" Recomendacao: migre para Volta"));
4039
- console.log(import_picocolors8.default.dim(" Execute: nimbus setup node"));
3167
+ console.log(import_picocolors7.default.yellow(" Recomendacao: migre para Volta"));
3168
+ console.log(import_picocolors7.default.dim(" Execute: nimbus setup node"));
4040
3169
  }
4041
3170
  Se("");
4042
3171
  return;
@@ -4044,15 +3173,15 @@ async function setupNode(args) {
4044
3173
  const hasOldManager = fnm.installed || nvm.installed;
4045
3174
  const globalPackages = getGlobalPackages();
4046
3175
  if (hasOldManager) {
4047
- console.log(import_picocolors8.default.yellow(" Gerenciadores antigos detectados!"));
3176
+ console.log(import_picocolors7.default.yellow(" Gerenciadores antigos detectados!"));
4048
3177
  console.log();
4049
- console.log(import_picocolors8.default.dim(" fnm e nvm causam problemas de cache do shell."));
4050
- console.log(import_picocolors8.default.dim(" Volta resolve isso e funciona melhor no Windows."));
3178
+ console.log(import_picocolors7.default.dim(" fnm e nvm causam problemas de cache do shell."));
3179
+ console.log(import_picocolors7.default.dim(" Volta resolve isso e funciona melhor no Windows."));
4051
3180
  console.log();
4052
3181
  if (globalPackages.length > 0) {
4053
- console.log(import_picocolors8.default.bold(" Pacotes globais encontrados:"));
3182
+ console.log(import_picocolors7.default.bold(" Pacotes globais encontrados:"));
4054
3183
  for (const pkg of globalPackages) {
4055
- console.log(import_picocolors8.default.dim(` - ${pkg}`));
3184
+ console.log(import_picocolors7.default.dim(` - ${pkg}`));
4056
3185
  }
4057
3186
  console.log();
4058
3187
  }
@@ -4067,9 +3196,9 @@ async function setupNode(args) {
4067
3196
  actions.push("Instalar Node.js via Volta");
4068
3197
  if (globalPackages.length > 0)
4069
3198
  actions.push(`Reinstalar ${globalPackages.length} pacotes globais`);
4070
- console.log(import_picocolors8.default.bold(" O que sera feito:"));
3199
+ console.log(import_picocolors7.default.bold(" O que sera feito:"));
4071
3200
  for (const action of actions) {
4072
- console.log(import_picocolors8.default.cyan(` -> ${action}`));
3201
+ console.log(import_picocolors7.default.cyan(` -> ${action}`));
4073
3202
  }
4074
3203
  console.log();
4075
3204
  const confirm = await ye({
@@ -4082,60 +3211,60 @@ async function setupNode(args) {
4082
3211
  }
4083
3212
  console.log();
4084
3213
  if (fnm.installed) {
4085
- console.log(import_picocolors8.default.bold(" Removendo fnm..."));
3214
+ console.log(import_picocolors7.default.bold(" Removendo fnm..."));
4086
3215
  await removeFnm(fnm);
4087
3216
  console.log();
4088
3217
  }
4089
3218
  if (nvm.installed) {
4090
- console.log(import_picocolors8.default.bold(" Removendo nvm..."));
3219
+ console.log(import_picocolors7.default.bold(" Removendo nvm..."));
4091
3220
  await removeNvm(nvm);
4092
3221
  console.log();
4093
3222
  }
4094
3223
  if (!volta.installed) {
4095
- console.log(import_picocolors8.default.bold(" Instalando Volta..."));
3224
+ console.log(import_picocolors7.default.bold(" Instalando Volta..."));
4096
3225
  const installed = await installVolta();
4097
3226
  if (!installed) {
4098
- Se(import_picocolors8.default.red("Falha na instalacao. Tente manualmente."));
3227
+ Se(import_picocolors7.default.red("Falha na instalacao. Tente manualmente."));
4099
3228
  return;
4100
3229
  }
4101
3230
  console.log();
4102
3231
  }
4103
- console.log(import_picocolors8.default.bold(" Instalando Node.js..."));
3232
+ console.log(import_picocolors7.default.bold(" Instalando Node.js..."));
4104
3233
  await installNodeWithVolta();
4105
3234
  console.log();
4106
3235
  if (globalPackages.length > 0) {
4107
- console.log(import_picocolors8.default.bold(" Reinstalando pacotes globais..."));
3236
+ console.log(import_picocolors7.default.bold(" Reinstalando pacotes globais..."));
4108
3237
  await reinstallGlobalPackages(globalPackages);
4109
3238
  console.log();
4110
3239
  }
4111
- console.log(import_picocolors8.default.green(" ====================================="));
4112
- console.log(import_picocolors8.default.green(" Migracao concluida!"));
4113
- console.log(import_picocolors8.default.green(" ====================================="));
3240
+ console.log(import_picocolors7.default.green(" ====================================="));
3241
+ console.log(import_picocolors7.default.green(" Migracao concluida!"));
3242
+ console.log(import_picocolors7.default.green(" ====================================="));
4114
3243
  console.log();
4115
3244
  if (IS_WINDOWS) {
4116
- console.log(import_picocolors8.default.yellow(" IMPORTANTE: Reinicie o terminal!"));
3245
+ console.log(import_picocolors7.default.yellow(" IMPORTANTE: Reinicie o terminal!"));
4117
3246
  console.log();
4118
- console.log(import_picocolors8.default.dim(" Feche todas as janelas do PowerShell/Terminal"));
4119
- console.log(import_picocolors8.default.dim(" e abra novamente para aplicar as mudancas."));
3247
+ console.log(import_picocolors7.default.dim(" Feche todas as janelas do PowerShell/Terminal"));
3248
+ console.log(import_picocolors7.default.dim(" e abra novamente para aplicar as mudancas."));
4120
3249
  } else {
4121
- console.log(import_picocolors8.default.yellow(" IMPORTANTE: Reinicie o terminal ou execute:"));
3250
+ console.log(import_picocolors7.default.yellow(" IMPORTANTE: Reinicie o terminal ou execute:"));
4122
3251
  console.log();
4123
- console.log(import_picocolors8.default.cyan(" source ~/.zshrc"));
4124
- console.log(import_picocolors8.default.dim(" # ou"));
4125
- console.log(import_picocolors8.default.cyan(" source ~/.bashrc"));
3252
+ console.log(import_picocolors7.default.cyan(" source ~/.zshrc"));
3253
+ console.log(import_picocolors7.default.dim(" # ou"));
3254
+ console.log(import_picocolors7.default.cyan(" source ~/.bashrc"));
4126
3255
  }
4127
3256
  console.log();
4128
- console.log(import_picocolors8.default.bold(" Depois, verifique:"));
4129
- console.log(import_picocolors8.default.dim(" volta --version"));
4130
- console.log(import_picocolors8.default.dim(" node --version"));
4131
- console.log(import_picocolors8.default.dim(" nimbus --version"));
3257
+ console.log(import_picocolors7.default.bold(" Depois, verifique:"));
3258
+ console.log(import_picocolors7.default.dim(" volta --version"));
3259
+ console.log(import_picocolors7.default.dim(" node --version"));
3260
+ console.log(import_picocolors7.default.dim(" nimbus --version"));
4132
3261
  console.log();
4133
- Se(import_picocolors8.default.green("Pronto! Volta configurado."));
3262
+ Se(import_picocolors7.default.green("Pronto! Volta configurado."));
4134
3263
  }
4135
3264
 
4136
3265
  // src/index.ts
4137
3266
  var PACKAGE_NAME2 = "@nimbuslab/cli";
4138
- var CURRENT_VERSION = "0.17.3";
3267
+ var CURRENT_VERSION = "1.0.0";
4139
3268
  var LOGO = `
4140
3269
  \u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557
4141
3270
  \u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D
@@ -4171,18 +3300,18 @@ function showUpdateNotice(latestVersion) {
4171
3300
  const line2 = ` Atualize com: ${command}`;
4172
3301
  const maxLen = Math.max(line1.length, line2.length);
4173
3302
  const border = "\u2500".repeat(maxLen + 2);
4174
- console.log(import_picocolors9.default.yellow(` \u250C${border}\u2510`));
4175
- console.log(import_picocolors9.default.yellow(` \u2502`) + import_picocolors9.default.white(line1.padEnd(maxLen + 2)) + import_picocolors9.default.yellow(`\u2502`));
4176
- console.log(import_picocolors9.default.yellow(` \u2502`) + import_picocolors9.default.cyan(line2.padEnd(maxLen + 2)) + import_picocolors9.default.yellow(`\u2502`));
4177
- console.log(import_picocolors9.default.yellow(` \u2514${border}\u2518`));
3303
+ console.log(import_picocolors8.default.yellow(` \u250C${border}\u2510`));
3304
+ console.log(import_picocolors8.default.yellow(` \u2502`) + import_picocolors8.default.white(line1.padEnd(maxLen + 2)) + import_picocolors8.default.yellow(`\u2502`));
3305
+ console.log(import_picocolors8.default.yellow(` \u2502`) + import_picocolors8.default.cyan(line2.padEnd(maxLen + 2)) + import_picocolors8.default.yellow(`\u2502`));
3306
+ console.log(import_picocolors8.default.yellow(` \u2514${border}\u2518`));
4178
3307
  console.log();
4179
3308
  }
4180
3309
  async function main() {
4181
3310
  const args = process.argv.slice(2);
4182
3311
  const command = args[0];
4183
- console.log(import_picocolors9.default.cyan(LOGO));
4184
- console.log(import_picocolors9.default.white(" nimbuslab CLI"));
4185
- console.log(import_picocolors9.default.dim(" Create awesome projects"));
3312
+ console.log(import_picocolors8.default.cyan(LOGO));
3313
+ console.log(import_picocolors8.default.white(" nimbuslab CLI"));
3314
+ console.log(import_picocolors8.default.dim(" Create awesome projects"));
4186
3315
  console.log();
4187
3316
  const latestVersion = await checkForUpdates();
4188
3317
  if (latestVersion) {
@@ -4196,15 +3325,13 @@ async function main() {
4196
3325
  await upgrade(args.slice(1));
4197
3326
  } else if (command === "update") {
4198
3327
  await update(args.slice(1));
4199
- } else if (command === "lola") {
4200
- await lola(args.slice(1));
4201
3328
  } else if (command === "setup") {
4202
3329
  const subcommand = args[1];
4203
3330
  if (subcommand === "node") {
4204
3331
  await setupNode(args.slice(2));
4205
3332
  } else {
4206
- console.log(import_picocolors9.default.red(`Subcomando desconhecido: ${subcommand || "(vazio)"}`));
4207
- console.log(import_picocolors9.default.dim(" Uso: nimbus setup node"));
3333
+ console.log(import_picocolors8.default.red(`Subcomando desconhecido: ${subcommand || "(vazio)"}`));
3334
+ console.log(import_picocolors8.default.dim(" Uso: nimbus setup node"));
4208
3335
  process.exit(1);
4209
3336
  }
4210
3337
  } else if (command === "help" || command === "--help" || command === "-h") {
@@ -4212,16 +3339,16 @@ async function main() {
4212
3339
  } else if (command === "version" || command === "--version" || command === "-v") {
4213
3340
  showVersion();
4214
3341
  } else {
4215
- console.log(import_picocolors9.default.red(`Comando desconhecido: ${command}`));
3342
+ console.log(import_picocolors8.default.red(`Comando desconhecido: ${command}`));
4216
3343
  showHelp();
4217
3344
  process.exit(1);
4218
3345
  }
4219
3346
  }
4220
3347
  function showHelp() {
4221
3348
  console.log(`
4222
- ${import_picocolors9.default.bold("Uso:")} nimbus [comando] [op\xE7\xF5es]
3349
+ ${import_picocolors8.default.bold("Uso:")} nimbus [comando] [op\xE7\xF5es]
4223
3350
 
4224
- ${import_picocolors9.default.bold("Comandos:")}
3351
+ ${import_picocolors8.default.bold("Comandos:")}
4225
3352
  create [nome] Criar novo projeto
4226
3353
  analyze [dir] Analisar stack do projeto
4227
3354
  upgrade [alvo] Atualizar depend\xEAncias
@@ -4231,52 +3358,52 @@ ${import_picocolors9.default.bold("Comandos:")}
4231
3358
  help Mostrar esta ajuda
4232
3359
  version Mostrar vers\xE3o
4233
3360
 
4234
- ${import_picocolors9.default.bold("Templates:")}
3361
+ ${import_picocolors8.default.bold("Templates:")}
4235
3362
  --landing Landing page (Next.js 16 + Tailwind 4 + shadcn)
4236
3363
  --app Web app (Landing + Better Auth + Drizzle)
4237
3364
  --turborepo Monorepo (Turborepo + apps/packages)
4238
3365
 
4239
- ${import_picocolors9.default.bold("Analyze & Upgrade:")}
3366
+ ${import_picocolors8.default.bold("Analyze & Upgrade:")}
4240
3367
  analyze . Detectar stack e mostrar recomenda\xE7\xF5es
4241
3368
  analyze --json Output em JSON
4242
3369
  upgrade --plan Mostrar plano de upgrade
4243
3370
  upgrade next Atualizar Next.js
4244
3371
  upgrade tailwind Atualizar Tailwind CSS
4245
3372
 
4246
- ${import_picocolors9.default.bold("Update (CLI):")}
3373
+ ${import_picocolors8.default.bold("Update (CLI):")}
4247
3374
  update Atualizar para ultima versao
4248
3375
  update 0.11.0 Instalar versao especifica
4249
3376
  update --list Listar versoes disponiveis
4250
3377
  update --force Forcar reinstalacao (limpa cache)
4251
3378
 
4252
- ${import_picocolors9.default.bold("Setup (Ambiente):")}
3379
+ ${import_picocolors8.default.bold("Setup (Ambiente):")}
4253
3380
  setup node Migrar para Volta (remove fnm/nvm)
4254
3381
  setup node --check Verificar ambiente atual
4255
3382
 
4256
- ${import_picocolors9.default.bold("Op\xE7\xF5es:")}
3383
+ ${import_picocolors8.default.bold("Op\xE7\xF5es:")}
4257
3384
  -y, --yes Aceitar padr\xF5es
4258
3385
  --no-git N\xE3o inicializar Git
4259
3386
  --no-install N\xE3o instalar depend\xEAncias
4260
3387
  --template <url> Usar template customizado
4261
3388
 
4262
- ${import_picocolors9.default.bold("Lola (Code Agent):")}
3389
+ ${import_picocolors8.default.bold("Lola (Code Agent):")}
4263
3390
  lola install Instalar/atualizar Lola
4264
3391
  lola suggest Sugerir melhoria (cria issue)
4265
3392
 
4266
- ${import_picocolors9.default.bold("Exemplos:")}
4267
- ${import_picocolors9.default.dim("$")} nimbus create my-landing --landing
4268
- ${import_picocolors9.default.dim("$")} nimbus create my-app --app
4269
- ${import_picocolors9.default.dim("$")} nimbus analyze ./my-project
4270
- ${import_picocolors9.default.dim("$")} nimbus upgrade --plan
4271
- ${import_picocolors9.default.dim("$")} nimbus update
4272
- ${import_picocolors9.default.dim("$")} nimbus setup node
4273
- ${import_picocolors9.default.dim("$")} nimbus lola install
3393
+ ${import_picocolors8.default.bold("Exemplos:")}
3394
+ ${import_picocolors8.default.dim("$")} nimbus create my-landing --landing
3395
+ ${import_picocolors8.default.dim("$")} nimbus create my-app --app
3396
+ ${import_picocolors8.default.dim("$")} nimbus analyze ./my-project
3397
+ ${import_picocolors8.default.dim("$")} nimbus upgrade --plan
3398
+ ${import_picocolors8.default.dim("$")} nimbus update
3399
+ ${import_picocolors8.default.dim("$")} nimbus setup node
3400
+ ${import_picocolors8.default.dim("$")} nimbus lola install
4274
3401
  `);
4275
3402
  }
4276
3403
  function showVersion() {
4277
3404
  console.log(`${PACKAGE_NAME2} v${CURRENT_VERSION}`);
4278
3405
  }
4279
3406
  main().catch((err) => {
4280
- console.error(import_picocolors9.default.red("Erro:"), err.message);
3407
+ console.error(import_picocolors8.default.red("Erro:"), err.message);
4281
3408
  process.exit(1);
4282
3409
  });