@nimbuslab/cli 0.17.2 → 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 (3) hide show
  1. package/README.md +0 -41
  2. package/dist/index.js +265 -1068
  3. 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,917 +2563,60 @@ 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"),
3452
- join4("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")
2579
+ join3(HOME, "scoop", "shims", "fnm.exe"),
2580
+ join3(HOME, "scoop", "apps", "fnm", "current", "fnm.exe"),
2581
+ "C:\\ProgramData\\chocolatey\\bin\\fnm.exe",
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")
3457
2589
  ] : [
3458
- join4(HOME2, ".local", "share", "fnm", "fnm"),
3459
- join4(HOME2, ".fnm", "fnm"),
3460
- join4(HOME2, ".local", "bin", "fnm"),
2590
+ join3(HOME, ".local", "share", "fnm", "fnm"),
2591
+ join3(HOME, ".fnm", "fnm"),
2592
+ join3(HOME, ".local", "bin", "fnm"),
3461
2593
  "/opt/homebrew/bin/fnm",
3462
2594
  "/usr/local/bin/fnm",
3463
- join4(HOME2, ".cargo", "bin", "fnm")
2595
+ join3(HOME, ".cargo", "bin", "fnm")
3464
2596
  ];
3465
2597
  let fnmPath = null;
3466
- if (check.exitCode === 0) {
2598
+ if (check.status === 0) {
3467
2599
  fnmPath = check.stdout?.trim().split(`
3468
2600
  `)[0] || null;
3469
2601
  } else {
3470
2602
  for (const loc of fnmLocations) {
3471
- if (existsSync3(loc)) {
2603
+ if (existsSync2(loc)) {
3472
2604
  fnmPath = loc;
3473
2605
  break;
3474
2606
  }
3475
2607
  }
3476
2608
  }
2609
+ if (!fnmPath && process.env.FNM_DIR) {
2610
+ if (existsSync2(process.env.FNM_DIR)) {
2611
+ fnmPath = process.env.FNM_DIR;
2612
+ }
2613
+ }
2614
+ if (!fnmPath && IS_WINDOWS) {
2615
+ const fnmMultishells = join3(HOME, "AppData", "Local", "fnm_multishells");
2616
+ if (existsSync2(fnmMultishells)) {
2617
+ fnmPath = fnmMultishells;
2618
+ }
2619
+ }
3477
2620
  if (!fnmPath)
3478
2621
  return result;
3479
2622
  result.installed = true;
@@ -3485,26 +2628,26 @@ function detectFnm() {
3485
2628
  } catch {}
3486
2629
  result.configFiles = [];
3487
2630
  if (IS_WINDOWS) {
3488
- const ps5Profile = join4(HOME2, "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1");
3489
- const ps7Profile = join4(HOME2, "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1");
3490
- const psProfile = join4(HOME2, "Documents", "PowerShell", "profile.ps1");
3491
- 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))
3492
2635
  result.configFiles.push(ps5Profile);
3493
- if (existsSync3(ps7Profile))
2636
+ if (existsSync2(ps7Profile))
3494
2637
  result.configFiles.push(ps7Profile);
3495
- if (existsSync3(psProfile))
2638
+ if (existsSync2(psProfile))
3496
2639
  result.configFiles.push(psProfile);
3497
2640
  } else {
3498
2641
  const configs = [
3499
- join4(HOME2, ".bashrc"),
3500
- join4(HOME2, ".bash_profile"),
3501
- join4(HOME2, ".profile"),
3502
- join4(HOME2, ".zshrc"),
3503
- join4(HOME2, ".zprofile"),
3504
- 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")
3505
2648
  ];
3506
2649
  for (const cfg of configs) {
3507
- if (existsSync3(cfg))
2650
+ if (existsSync2(cfg))
3508
2651
  result.configFiles.push(cfg);
3509
2652
  }
3510
2653
  }
@@ -3513,19 +2656,20 @@ function detectFnm() {
3513
2656
  function detectNvm() {
3514
2657
  const result = { name: "nvm", installed: false };
3515
2658
  if (IS_WINDOWS) {
3516
- const check = spawnSync2(CHECK_CMD2, ["nvm"], { encoding: "utf-8", shell: true });
2659
+ const check = spawnSync2(CHECK_CMD, ["nvm"], { encoding: "utf-8", shell: true });
3517
2660
  const nvmWinLocations = [
3518
- join4(HOME2, "AppData", "Roaming", "nvm", "nvm.exe"),
3519
- join4("C:", "Program Files", "nvm", "nvm.exe"),
3520
- join4("C:", "ProgramData", "nvm", "nvm.exe")
2661
+ join3(HOME, "AppData", "Roaming", "nvm", "nvm.exe"),
2662
+ "C:\\Program Files\\nvm\\nvm.exe",
2663
+ "C:\\ProgramData\\nvm\\nvm.exe",
2664
+ join3(HOME, "nvm", "nvm.exe")
3521
2665
  ];
3522
2666
  let nvmPath = null;
3523
- if (check.exitCode === 0) {
2667
+ if (check.status === 0) {
3524
2668
  nvmPath = check.stdout?.trim().split(`
3525
2669
  `)[0] || null;
3526
2670
  } else {
3527
2671
  for (const loc of nvmWinLocations) {
3528
- if (existsSync3(loc)) {
2672
+ if (existsSync2(loc)) {
3529
2673
  nvmPath = loc;
3530
2674
  break;
3531
2675
  }
@@ -3541,31 +2685,31 @@ function detectNvm() {
3541
2685
  } catch {}
3542
2686
  result.configFiles = [];
3543
2687
  const configs = [
3544
- join4(HOME2, "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1"),
3545
- join4(HOME2, "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1"),
3546
- 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")
3547
2691
  ];
3548
2692
  for (const cfg of configs) {
3549
- if (existsSync3(cfg))
2693
+ if (existsSync2(cfg))
3550
2694
  result.configFiles.push(cfg);
3551
2695
  }
3552
2696
  } else {
3553
- const nvmDir = process.env.NVM_DIR || join4(HOME2, ".nvm");
3554
- if (!existsSync3(nvmDir))
2697
+ const nvmDir = process.env.NVM_DIR || join3(HOME, ".nvm");
2698
+ if (!existsSync2(nvmDir))
3555
2699
  return result;
3556
2700
  result.installed = true;
3557
2701
  result.path = nvmDir;
3558
2702
  result.configFiles = [];
3559
2703
  const configs = [
3560
- join4(HOME2, ".bashrc"),
3561
- join4(HOME2, ".bash_profile"),
3562
- join4(HOME2, ".profile"),
3563
- join4(HOME2, ".zshrc"),
3564
- join4(HOME2, ".zprofile"),
3565
- 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")
3566
2710
  ];
3567
2711
  for (const cfg of configs) {
3568
- if (existsSync3(cfg))
2712
+ if (existsSync2(cfg))
3569
2713
  result.configFiles.push(cfg);
3570
2714
  }
3571
2715
  }
@@ -3573,8 +2717,8 @@ function detectNvm() {
3573
2717
  }
3574
2718
  function detectVolta() {
3575
2719
  const result = { name: "volta", installed: false };
3576
- const check = spawnSync2(CHECK_CMD2, ["volta"], { encoding: "utf-8", shell: true });
3577
- if (check.exitCode !== 0)
2720
+ const check = spawnSync2(CHECK_CMD, ["volta"], { encoding: "utf-8", shell: true });
2721
+ if (check.status !== 0)
3578
2722
  return result;
3579
2723
  result.installed = true;
3580
2724
  result.path = check.stdout?.trim().split(`
@@ -3586,8 +2730,8 @@ function detectVolta() {
3586
2730
  return result;
3587
2731
  }
3588
2732
  function detectNode() {
3589
- const check = spawnSync2(CHECK_CMD2, ["node"], { encoding: "utf-8", shell: true });
3590
- if (check.exitCode !== 0)
2733
+ const check = spawnSync2(CHECK_CMD, ["node"], { encoding: "utf-8", shell: true });
2734
+ if (check.status !== 0)
3591
2735
  return { version: null, manager: null };
3592
2736
  const nodePath = check.stdout?.trim().split(`
3593
2737
  `)[0] || "";
@@ -3628,7 +2772,7 @@ function getGlobalPackages() {
3628
2772
  return packages;
3629
2773
  }
3630
2774
  function removeFnmFromConfig(configFile) {
3631
- if (!existsSync3(configFile))
2775
+ if (!existsSync2(configFile))
3632
2776
  return false;
3633
2777
  try {
3634
2778
  let content = readFileSync2(configFile, "utf-8");
@@ -3653,7 +2797,7 @@ function removeFnmFromConfig(configFile) {
3653
2797
  return false;
3654
2798
  }
3655
2799
  function removeNvmFromConfig(configFile) {
3656
- if (!existsSync3(configFile))
2800
+ if (!existsSync2(configFile))
3657
2801
  return false;
3658
2802
  try {
3659
2803
  let content = readFileSync2(configFile, "utf-8");
@@ -3689,7 +2833,7 @@ async function removeFnm(fnm) {
3689
2833
  const scoopCheck = spawnSync2("scoop", ["list"], { encoding: "utf-8", shell: true });
3690
2834
  if (scoopCheck.stdout?.includes("fnm")) {
3691
2835
  execSync2("scoop uninstall fnm", { stdio: "pipe" });
3692
- console.log(import_picocolors8.default.dim(" Removido via Scoop"));
2836
+ console.log(import_picocolors7.default.dim(" Removido via Scoop"));
3693
2837
  removed = true;
3694
2838
  }
3695
2839
  } catch {}
@@ -3698,7 +2842,7 @@ async function removeFnm(fnm) {
3698
2842
  const chocoCheck = spawnSync2("choco", ["list", "--local-only"], { encoding: "utf-8", shell: true });
3699
2843
  if (chocoCheck.stdout?.includes("fnm")) {
3700
2844
  execSync2("choco uninstall fnm -y", { stdio: "pipe" });
3701
- console.log(import_picocolors8.default.dim(" Removido via Chocolatey"));
2845
+ console.log(import_picocolors7.default.dim(" Removido via Chocolatey"));
3702
2846
  removed = true;
3703
2847
  }
3704
2848
  } catch {}
@@ -3708,69 +2852,83 @@ async function removeFnm(fnm) {
3708
2852
  const wingetCheck = spawnSync2("winget", ["list", "--name", "fnm"], { encoding: "utf-8", shell: true });
3709
2853
  if (wingetCheck.stdout?.includes("fnm")) {
3710
2854
  execSync2("winget uninstall fnm --silent", { stdio: "pipe" });
3711
- console.log(import_picocolors8.default.dim(" Removido via winget"));
2855
+ console.log(import_picocolors7.default.dim(" Removido via winget"));
3712
2856
  removed = true;
3713
2857
  }
3714
2858
  } catch {}
3715
2859
  }
3716
2860
  const winFnmDirs = [
3717
- join4(HOME2, ".fnm"),
3718
- join4(HOME2, "AppData", "Local", "fnm"),
3719
- join4(HOME2, "AppData", "Roaming", "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")
3720
2866
  ];
3721
2867
  for (const dir of winFnmDirs) {
3722
- if (existsSync3(dir)) {
2868
+ if (existsSync2(dir)) {
3723
2869
  try {
3724
- execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: true });
3725
- 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}`));
3726
2872
  removed = true;
3727
- } catch {}
2873
+ } catch {
2874
+ try {
2875
+ execSync2(`powershell -Command "Remove-Item -Path '${dir}' -Recurse -Force"`, { stdio: "pipe" });
2876
+ console.log(import_picocolors7.default.dim(` Removido ${dir}`));
2877
+ removed = true;
2878
+ } catch {}
2879
+ }
3728
2880
  }
3729
2881
  }
2882
+ try {
2883
+ execSync2(`powershell -Command "[Environment]::SetEnvironmentVariable('FNM_DIR', $null, 'User')"`, { stdio: "pipe" });
2884
+ execSync2(`powershell -Command "[Environment]::SetEnvironmentVariable('FNM_MULTISHELL_PATH', $null, 'User')"`, { stdio: "pipe" });
2885
+ console.log(import_picocolors7.default.dim(" Variaveis de ambiente FNM removidas"));
2886
+ removed = true;
2887
+ } catch {}
3730
2888
  for (const configFile of fnm.configFiles || []) {
3731
2889
  if (removeFnmFromConfig(configFile)) {
3732
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2890
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3733
2891
  removed = true;
3734
2892
  }
3735
2893
  }
3736
- 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"));
3737
2895
  return removed;
3738
2896
  } else {
3739
2897
  spinner.start("Removendo fnm...");
3740
2898
  let removed = false;
3741
2899
  try {
3742
2900
  const brewCheck = spawnSync2("brew", ["list", "fnm"], { encoding: "utf-8", shell: true });
3743
- if (brewCheck.exitCode === 0) {
2901
+ if (brewCheck.status === 0) {
3744
2902
  execSync2("brew uninstall fnm", { stdio: "pipe" });
3745
- console.log(import_picocolors8.default.dim(" Removido via Homebrew"));
2903
+ console.log(import_picocolors7.default.dim(" Removido via Homebrew"));
3746
2904
  removed = true;
3747
2905
  }
3748
2906
  } catch {}
3749
2907
  for (const configFile of fnm.configFiles || []) {
3750
2908
  if (removeFnmFromConfig(configFile)) {
3751
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2909
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3752
2910
  removed = true;
3753
2911
  }
3754
2912
  }
3755
2913
  const fnmDirs = [
3756
- join4(HOME2, ".fnm"),
3757
- join4(HOME2, ".local", "share", "fnm")
2914
+ join3(HOME, ".fnm"),
2915
+ join3(HOME, ".local", "share", "fnm")
3758
2916
  ];
3759
2917
  for (const fnmDir of fnmDirs) {
3760
- if (existsSync3(fnmDir)) {
2918
+ if (existsSync2(fnmDir)) {
3761
2919
  execSync2(`rm -rf "${fnmDir}"`, { stdio: "pipe" });
3762
- console.log(import_picocolors8.default.dim(` Removido ${fnmDir}`));
2920
+ console.log(import_picocolors7.default.dim(` Removido ${fnmDir}`));
3763
2921
  removed = true;
3764
2922
  }
3765
2923
  }
3766
2924
  const fnmBins = [
3767
- join4(HOME2, ".local", "bin", "fnm"),
3768
- join4(HOME2, ".cargo", "bin", "fnm")
2925
+ join3(HOME, ".local", "bin", "fnm"),
2926
+ join3(HOME, ".cargo", "bin", "fnm")
3769
2927
  ];
3770
2928
  for (const bin of fnmBins) {
3771
- if (existsSync3(bin)) {
2929
+ if (existsSync2(bin)) {
3772
2930
  execSync2(`rm -f "${bin}"`, { stdio: "pipe" });
3773
- console.log(import_picocolors8.default.dim(` Removido ${bin}`));
2931
+ console.log(import_picocolors7.default.dim(` Removido ${bin}`));
3774
2932
  removed = true;
3775
2933
  }
3776
2934
  }
@@ -3778,7 +2936,7 @@ async function removeFnm(fnm) {
3778
2936
  return removed;
3779
2937
  }
3780
2938
  } catch (error) {
3781
- spinner.stop(import_picocolors8.default.red("Erro ao remover fnm"));
2939
+ spinner.stop(import_picocolors7.default.red("Erro ao remover fnm"));
3782
2940
  return false;
3783
2941
  }
3784
2942
  }
@@ -3792,59 +2950,59 @@ async function removeNvm(nvm) {
3792
2950
  const wingetCheck = spawnSync2("winget", ["list", "--name", "nvm"], { encoding: "utf-8", shell: true });
3793
2951
  if (wingetCheck.stdout?.toLowerCase().includes("nvm")) {
3794
2952
  execSync2("winget uninstall nvm --silent", { stdio: "pipe" });
3795
- console.log(import_picocolors8.default.dim(" Removido via winget"));
2953
+ console.log(import_picocolors7.default.dim(" Removido via winget"));
3796
2954
  removed = true;
3797
2955
  }
3798
2956
  } catch {}
3799
2957
  const nvmWinDirs = [
3800
- join4(HOME2, "AppData", "Roaming", "nvm"),
3801
- join4("C:", "Program Files", "nvm"),
3802
- join4("C:", "ProgramData", "nvm")
2958
+ join3(HOME, "AppData", "Roaming", "nvm"),
2959
+ join3("C:", "Program Files", "nvm"),
2960
+ join3("C:", "ProgramData", "nvm")
3803
2961
  ];
3804
2962
  for (const dir of nvmWinDirs) {
3805
- if (existsSync3(dir)) {
2963
+ if (existsSync2(dir)) {
3806
2964
  try {
3807
- execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: true });
3808
- 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}`));
3809
2967
  removed = true;
3810
2968
  } catch {}
3811
2969
  }
3812
2970
  }
3813
2971
  for (const configFile of nvm.configFiles || []) {
3814
2972
  if (removeNvmFromConfig(configFile)) {
3815
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2973
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3816
2974
  removed = true;
3817
2975
  }
3818
2976
  }
3819
2977
  if (!removed) {
3820
- console.log(import_picocolors8.default.yellow(`
2978
+ console.log(import_picocolors7.default.yellow(`
3821
2979
  nvm-windows pode precisar de remocao manual:`));
3822
- console.log(import_picocolors8.default.dim(" 1. Abra 'Adicionar ou remover programas'"));
3823
- console.log(import_picocolors8.default.dim(" 2. Procure por 'NVM for Windows'"));
3824
- 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"));
3825
2983
  }
3826
- spinner.stop(removed ? "nvm removido!" : import_picocolors8.default.yellow("Verifique manualmente"));
2984
+ spinner.stop(removed ? "nvm removido!" : import_picocolors7.default.yellow("Verifique manualmente"));
3827
2985
  return removed;
3828
2986
  } else {
3829
2987
  spinner.start("Removendo nvm...");
3830
2988
  let removed = false;
3831
2989
  for (const configFile of nvm.configFiles || []) {
3832
2990
  if (removeNvmFromConfig(configFile)) {
3833
- console.log(import_picocolors8.default.dim(` Removido de ${configFile}`));
2991
+ console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
3834
2992
  removed = true;
3835
2993
  }
3836
2994
  }
3837
- const nvmDir = process.env.NVM_DIR || join4(HOME2, ".nvm");
3838
- if (existsSync3(nvmDir)) {
2995
+ const nvmDir = process.env.NVM_DIR || join3(HOME, ".nvm");
2996
+ if (existsSync2(nvmDir)) {
3839
2997
  execSync2(`rm -rf "${nvmDir}"`, { stdio: "pipe" });
3840
- console.log(import_picocolors8.default.dim(` Removido ${nvmDir}`));
2998
+ console.log(import_picocolors7.default.dim(` Removido ${nvmDir}`));
3841
2999
  removed = true;
3842
3000
  }
3843
3001
  spinner.stop(removed ? "nvm removido!" : "nvm nao encontrado");
3844
3002
  return removed;
3845
3003
  }
3846
3004
  } catch (error) {
3847
- spinner.stop(import_picocolors8.default.red("Erro ao remover nvm"));
3005
+ spinner.stop(import_picocolors7.default.red("Erro ao remover nvm"));
3848
3006
  return false;
3849
3007
  }
3850
3008
  }
@@ -3853,29 +3011,70 @@ async function installVolta() {
3853
3011
  try {
3854
3012
  if (IS_WINDOWS) {
3855
3013
  spinner.start("Verificando metodo de instalacao...");
3856
- const chocoCheck = spawnSync2(CHECK_CMD2, ["choco"], { encoding: "utf-8", shell: true });
3857
- if (chocoCheck.exitCode === 0) {
3858
- spinner.stop("Chocolatey detectado");
3859
- spinner.start("Instalando Volta via Chocolatey...");
3860
- execSync2("choco install volta -y", { stdio: "pipe" });
3861
- spinner.stop("Volta instalado!");
3862
- return true;
3863
- }
3864
- const wingetCheck = spawnSync2(CHECK_CMD2, ["winget"], { encoding: "utf-8", shell: true });
3865
- if (wingetCheck.exitCode === 0) {
3014
+ const wingetCheck = spawnSync2(CHECK_CMD, ["winget"], { encoding: "utf-8", shell: true });
3015
+ if (wingetCheck.status === 0) {
3866
3016
  spinner.stop("winget detectado");
3867
3017
  spinner.start("Instalando Volta via winget...");
3868
- execSync2("winget install Volta.Volta --silent", { stdio: "pipe" });
3018
+ try {
3019
+ execSync2("winget install Volta.Volta --silent --accept-package-agreements --accept-source-agreements", {
3020
+ stdio: "pipe",
3021
+ timeout: 120000
3022
+ });
3023
+ spinner.stop("Volta instalado!");
3024
+ const voltaPath = join3(HOME, ".volta", "bin");
3025
+ console.log(import_picocolors7.default.dim(` Adicionando ${voltaPath} ao PATH...`));
3026
+ try {
3027
+ execSync2(`setx PATH "%PATH%;${voltaPath}"`, { stdio: "pipe", shell: "cmd.exe" });
3028
+ } catch {}
3029
+ return true;
3030
+ } catch (e2) {
3031
+ spinner.stop(import_picocolors7.default.yellow("winget falhou, tentando outro metodo..."));
3032
+ }
3033
+ }
3034
+ const chocoCheck = spawnSync2(CHECK_CMD, ["choco"], { encoding: "utf-8", shell: true });
3035
+ if (chocoCheck.status === 0) {
3036
+ spinner.start("Instalando Volta via Chocolatey...");
3037
+ try {
3038
+ execSync2("choco install volta -y", { stdio: "pipe", timeout: 120000 });
3039
+ spinner.stop("Volta instalado!");
3040
+ return true;
3041
+ } catch {
3042
+ spinner.stop(import_picocolors7.default.yellow("Chocolatey falhou"));
3043
+ }
3044
+ }
3045
+ spinner.start("Baixando Volta diretamente...");
3046
+ try {
3047
+ const psScript = `
3048
+ $ErrorActionPreference = 'Stop'
3049
+ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
3050
+ $voltaUrl = 'https://get.volta.sh'
3051
+ $response = Invoke-WebRequest -Uri $voltaUrl -UseBasicParsing
3052
+ # Volta nao tem instalador PS nativo, usar release direto
3053
+ $releaseUrl = 'https://github.com/volta-cli/volta/releases/latest/download/volta-windows.msi'
3054
+ $msiPath = "$env:TEMP\\volta-installer.msi"
3055
+ Invoke-WebRequest -Uri $releaseUrl -OutFile $msiPath
3056
+ Start-Process msiexec.exe -ArgumentList '/i', $msiPath, '/quiet', '/norestart' -Wait
3057
+ Remove-Item $msiPath -Force
3058
+ `;
3059
+ execSync2(`powershell -ExecutionPolicy Bypass -Command "${psScript.replace(/\n/g, " ")}"`, {
3060
+ stdio: "pipe",
3061
+ timeout: 180000
3062
+ });
3869
3063
  spinner.stop("Volta instalado!");
3870
3064
  return true;
3065
+ } catch (e2) {
3066
+ spinner.stop(import_picocolors7.default.yellow("Download direto falhou"));
3871
3067
  }
3872
- spinner.stop(import_picocolors8.default.yellow("Instale manualmente"));
3873
3068
  console.log();
3874
- console.log(import_picocolors8.default.bold(" Baixe o instalador:"));
3875
- console.log(import_picocolors8.default.cyan(" https://github.com/volta-cli/volta/releases/latest"));
3069
+ console.log(import_picocolors7.default.bold(" Instale manualmente:"));
3070
+ console.log();
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)"));
3073
+ console.log();
3074
+ console.log(import_picocolors7.default.cyan(" 2. Execute o instalador"));
3075
+ console.log();
3076
+ console.log(import_picocolors7.default.cyan(" 3. Reinicie o terminal"));
3876
3077
  console.log();
3877
- console.log(import_picocolors8.default.dim(" Ou instale Chocolatey primeiro:"));
3878
- console.log(import_picocolors8.default.dim(" https://chocolatey.org/install"));
3879
3078
  return false;
3880
3079
  } else {
3881
3080
  spinner.start("Baixando e instalando Volta...");
@@ -3883,38 +3082,38 @@ async function installVolta() {
3883
3082
  stdio: "pipe",
3884
3083
  shell: "/bin/bash"
3885
3084
  });
3886
- 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");
3887
3086
  const voltaSetup = `
3888
3087
  # Volta - Node.js version manager
3889
3088
  export VOLTA_HOME="$HOME/.volta"
3890
3089
  export PATH="$VOLTA_HOME/bin:$PATH"
3891
3090
  `;
3892
- if (existsSync3(shellConfig)) {
3091
+ if (existsSync2(shellConfig)) {
3893
3092
  const content = readFileSync2(shellConfig, "utf-8");
3894
3093
  if (!content.includes("VOLTA_HOME")) {
3895
3094
  writeFileSync(shellConfig, content + voltaSetup);
3896
- console.log(import_picocolors8.default.dim(` Adicionado ao ${shellConfig}`));
3095
+ console.log(import_picocolors7.default.dim(` Adicionado ao ${shellConfig}`));
3897
3096
  }
3898
3097
  }
3899
3098
  spinner.stop("Volta instalado!");
3900
3099
  return true;
3901
3100
  }
3902
3101
  } catch (error) {
3903
- spinner.stop(import_picocolors8.default.red("Erro ao instalar Volta"));
3904
- 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}`));
3905
3104
  return false;
3906
3105
  }
3907
3106
  }
3908
3107
  async function installNodeWithVolta() {
3909
3108
  const spinner = Y2();
3910
3109
  try {
3911
- const voltaBin = IS_WINDOWS ? "volta" : join4(HOME2, ".volta", "bin", "volta");
3110
+ const voltaBin = IS_WINDOWS ? "volta" : join3(HOME, ".volta", "bin", "volta");
3912
3111
  spinner.start("Instalando Node.js LTS via Volta...");
3913
- execSync2(`"${voltaBin}" install node`, { stdio: "pipe", shell: true });
3112
+ execSync2(`"${voltaBin}" install node`, { stdio: "pipe" });
3914
3113
  spinner.stop("Node.js instalado!");
3915
3114
  return true;
3916
3115
  } catch (error) {
3917
- spinner.stop(import_picocolors8.default.red("Erro ao instalar Node.js"));
3116
+ spinner.stop(import_picocolors7.default.red("Erro ao instalar Node.js"));
3918
3117
  return false;
3919
3118
  }
3920
3119
  }
@@ -3922,23 +3121,23 @@ async function reinstallGlobalPackages(packages) {
3922
3121
  if (packages.length === 0)
3923
3122
  return;
3924
3123
  const spinner = Y2();
3925
- const voltaBin = IS_WINDOWS ? "volta" : join4(HOME2, ".volta", "bin", "volta");
3124
+ const voltaBin = IS_WINDOWS ? "volta" : join3(HOME, ".volta", "bin", "volta");
3926
3125
  for (const pkg of packages) {
3927
3126
  spinner.start(`Instalando ${pkg}...`);
3928
3127
  try {
3929
- execSync2(`"${voltaBin}" install ${pkg}`, { stdio: "pipe", shell: true });
3128
+ execSync2(`"${voltaBin}" install ${pkg}`, { stdio: "pipe" });
3930
3129
  spinner.stop(`${pkg} instalado!`);
3931
3130
  } catch {
3932
- spinner.stop(import_picocolors8.default.yellow(`${pkg} - falha (instale manualmente)`));
3131
+ spinner.stop(import_picocolors7.default.yellow(`${pkg} - falha (instale manualmente)`));
3933
3132
  }
3934
3133
  }
3935
3134
  }
3936
3135
  async function setupNode(args) {
3937
3136
  const checkOnly = args.includes("--check") || args.includes("-c");
3938
3137
  console.log();
3939
- 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 ")));
3940
3139
  console.log();
3941
- console.log(import_picocolors8.default.bold(" Detectando ambiente..."));
3140
+ console.log(import_picocolors7.default.bold(" Detectando ambiente..."));
3942
3141
  console.log();
3943
3142
  const fnm = detectFnm();
3944
3143
  const nvm = detectNvm();
@@ -3946,27 +3145,27 @@ async function setupNode(args) {
3946
3145
  const node = detectNode();
3947
3146
  const status = (installed, version) => {
3948
3147
  if (!installed)
3949
- return import_picocolors8.default.dim("nao instalado");
3950
- 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})` : ""}`);
3951
3150
  };
3952
- console.log(` ${import_picocolors8.default.bold("fnm:")} ${status(fnm.installed, fnm.version)}`);
3953
- console.log(` ${import_picocolors8.default.bold("nvm:")} ${status(nvm.installed, nvm.version)}`);
3954
- 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)}`);
3955
3154
  console.log();
3956
- 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")}`);
3957
3156
  if (node.manager) {
3958
- console.log(` ${import_picocolors8.default.dim(`gerenciado por: ${node.manager}`)}`);
3157
+ console.log(` ${import_picocolors7.default.dim(`gerenciado por: ${node.manager}`)}`);
3959
3158
  }
3960
3159
  console.log();
3961
3160
  if (volta.installed && !fnm.installed && !nvm.installed) {
3962
3161
  M2.success("Ambiente OK! Volta instalado e configurado.");
3963
- Se(import_picocolors8.default.green("Nada a fazer."));
3162
+ Se(import_picocolors7.default.green("Nada a fazer."));
3964
3163
  return;
3965
3164
  }
3966
3165
  if (checkOnly) {
3967
3166
  if (fnm.installed || nvm.installed) {
3968
- console.log(import_picocolors8.default.yellow(" Recomendacao: migre para Volta"));
3969
- 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"));
3970
3169
  }
3971
3170
  Se("");
3972
3171
  return;
@@ -3974,15 +3173,15 @@ async function setupNode(args) {
3974
3173
  const hasOldManager = fnm.installed || nvm.installed;
3975
3174
  const globalPackages = getGlobalPackages();
3976
3175
  if (hasOldManager) {
3977
- console.log(import_picocolors8.default.yellow(" Gerenciadores antigos detectados!"));
3176
+ console.log(import_picocolors7.default.yellow(" Gerenciadores antigos detectados!"));
3978
3177
  console.log();
3979
- console.log(import_picocolors8.default.dim(" fnm e nvm causam problemas de cache do shell."));
3980
- 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."));
3981
3180
  console.log();
3982
3181
  if (globalPackages.length > 0) {
3983
- console.log(import_picocolors8.default.bold(" Pacotes globais encontrados:"));
3182
+ console.log(import_picocolors7.default.bold(" Pacotes globais encontrados:"));
3984
3183
  for (const pkg of globalPackages) {
3985
- console.log(import_picocolors8.default.dim(` - ${pkg}`));
3184
+ console.log(import_picocolors7.default.dim(` - ${pkg}`));
3986
3185
  }
3987
3186
  console.log();
3988
3187
  }
@@ -3997,9 +3196,9 @@ async function setupNode(args) {
3997
3196
  actions.push("Instalar Node.js via Volta");
3998
3197
  if (globalPackages.length > 0)
3999
3198
  actions.push(`Reinstalar ${globalPackages.length} pacotes globais`);
4000
- console.log(import_picocolors8.default.bold(" O que sera feito:"));
3199
+ console.log(import_picocolors7.default.bold(" O que sera feito:"));
4001
3200
  for (const action of actions) {
4002
- console.log(import_picocolors8.default.cyan(` -> ${action}`));
3201
+ console.log(import_picocolors7.default.cyan(` -> ${action}`));
4003
3202
  }
4004
3203
  console.log();
4005
3204
  const confirm = await ye({
@@ -4012,60 +3211,60 @@ async function setupNode(args) {
4012
3211
  }
4013
3212
  console.log();
4014
3213
  if (fnm.installed) {
4015
- console.log(import_picocolors8.default.bold(" Removendo fnm..."));
3214
+ console.log(import_picocolors7.default.bold(" Removendo fnm..."));
4016
3215
  await removeFnm(fnm);
4017
3216
  console.log();
4018
3217
  }
4019
3218
  if (nvm.installed) {
4020
- console.log(import_picocolors8.default.bold(" Removendo nvm..."));
3219
+ console.log(import_picocolors7.default.bold(" Removendo nvm..."));
4021
3220
  await removeNvm(nvm);
4022
3221
  console.log();
4023
3222
  }
4024
3223
  if (!volta.installed) {
4025
- console.log(import_picocolors8.default.bold(" Instalando Volta..."));
3224
+ console.log(import_picocolors7.default.bold(" Instalando Volta..."));
4026
3225
  const installed = await installVolta();
4027
3226
  if (!installed) {
4028
- Se(import_picocolors8.default.red("Falha na instalacao. Tente manualmente."));
3227
+ Se(import_picocolors7.default.red("Falha na instalacao. Tente manualmente."));
4029
3228
  return;
4030
3229
  }
4031
3230
  console.log();
4032
3231
  }
4033
- console.log(import_picocolors8.default.bold(" Instalando Node.js..."));
3232
+ console.log(import_picocolors7.default.bold(" Instalando Node.js..."));
4034
3233
  await installNodeWithVolta();
4035
3234
  console.log();
4036
3235
  if (globalPackages.length > 0) {
4037
- console.log(import_picocolors8.default.bold(" Reinstalando pacotes globais..."));
3236
+ console.log(import_picocolors7.default.bold(" Reinstalando pacotes globais..."));
4038
3237
  await reinstallGlobalPackages(globalPackages);
4039
3238
  console.log();
4040
3239
  }
4041
- console.log(import_picocolors8.default.green(" ====================================="));
4042
- console.log(import_picocolors8.default.green(" Migracao concluida!"));
4043
- 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(" ====================================="));
4044
3243
  console.log();
4045
3244
  if (IS_WINDOWS) {
4046
- console.log(import_picocolors8.default.yellow(" IMPORTANTE: Reinicie o terminal!"));
3245
+ console.log(import_picocolors7.default.yellow(" IMPORTANTE: Reinicie o terminal!"));
4047
3246
  console.log();
4048
- console.log(import_picocolors8.default.dim(" Feche todas as janelas do PowerShell/Terminal"));
4049
- 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."));
4050
3249
  } else {
4051
- 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:"));
4052
3251
  console.log();
4053
- console.log(import_picocolors8.default.cyan(" source ~/.zshrc"));
4054
- console.log(import_picocolors8.default.dim(" # ou"));
4055
- 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"));
4056
3255
  }
4057
3256
  console.log();
4058
- console.log(import_picocolors8.default.bold(" Depois, verifique:"));
4059
- console.log(import_picocolors8.default.dim(" volta --version"));
4060
- console.log(import_picocolors8.default.dim(" node --version"));
4061
- 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"));
4062
3261
  console.log();
4063
- Se(import_picocolors8.default.green("Pronto! Volta configurado."));
3262
+ Se(import_picocolors7.default.green("Pronto! Volta configurado."));
4064
3263
  }
4065
3264
 
4066
3265
  // src/index.ts
4067
3266
  var PACKAGE_NAME2 = "@nimbuslab/cli";
4068
- var CURRENT_VERSION = "0.17.2";
3267
+ var CURRENT_VERSION = "1.0.0";
4069
3268
  var LOGO = `
4070
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
4071
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
@@ -4101,18 +3300,18 @@ function showUpdateNotice(latestVersion) {
4101
3300
  const line2 = ` Atualize com: ${command}`;
4102
3301
  const maxLen = Math.max(line1.length, line2.length);
4103
3302
  const border = "\u2500".repeat(maxLen + 2);
4104
- console.log(import_picocolors9.default.yellow(` \u250C${border}\u2510`));
4105
- console.log(import_picocolors9.default.yellow(` \u2502`) + import_picocolors9.default.white(line1.padEnd(maxLen + 2)) + import_picocolors9.default.yellow(`\u2502`));
4106
- console.log(import_picocolors9.default.yellow(` \u2502`) + import_picocolors9.default.cyan(line2.padEnd(maxLen + 2)) + import_picocolors9.default.yellow(`\u2502`));
4107
- 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`));
4108
3307
  console.log();
4109
3308
  }
4110
3309
  async function main() {
4111
3310
  const args = process.argv.slice(2);
4112
3311
  const command = args[0];
4113
- console.log(import_picocolors9.default.cyan(LOGO));
4114
- console.log(import_picocolors9.default.white(" nimbuslab CLI"));
4115
- 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"));
4116
3315
  console.log();
4117
3316
  const latestVersion = await checkForUpdates();
4118
3317
  if (latestVersion) {
@@ -4126,15 +3325,13 @@ async function main() {
4126
3325
  await upgrade(args.slice(1));
4127
3326
  } else if (command === "update") {
4128
3327
  await update(args.slice(1));
4129
- } else if (command === "lola") {
4130
- await lola(args.slice(1));
4131
3328
  } else if (command === "setup") {
4132
3329
  const subcommand = args[1];
4133
3330
  if (subcommand === "node") {
4134
3331
  await setupNode(args.slice(2));
4135
3332
  } else {
4136
- console.log(import_picocolors9.default.red(`Subcomando desconhecido: ${subcommand || "(vazio)"}`));
4137
- 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"));
4138
3335
  process.exit(1);
4139
3336
  }
4140
3337
  } else if (command === "help" || command === "--help" || command === "-h") {
@@ -4142,16 +3339,16 @@ async function main() {
4142
3339
  } else if (command === "version" || command === "--version" || command === "-v") {
4143
3340
  showVersion();
4144
3341
  } else {
4145
- console.log(import_picocolors9.default.red(`Comando desconhecido: ${command}`));
3342
+ console.log(import_picocolors8.default.red(`Comando desconhecido: ${command}`));
4146
3343
  showHelp();
4147
3344
  process.exit(1);
4148
3345
  }
4149
3346
  }
4150
3347
  function showHelp() {
4151
3348
  console.log(`
4152
- ${import_picocolors9.default.bold("Uso:")} nimbus [comando] [op\xE7\xF5es]
3349
+ ${import_picocolors8.default.bold("Uso:")} nimbus [comando] [op\xE7\xF5es]
4153
3350
 
4154
- ${import_picocolors9.default.bold("Comandos:")}
3351
+ ${import_picocolors8.default.bold("Comandos:")}
4155
3352
  create [nome] Criar novo projeto
4156
3353
  analyze [dir] Analisar stack do projeto
4157
3354
  upgrade [alvo] Atualizar depend\xEAncias
@@ -4161,52 +3358,52 @@ ${import_picocolors9.default.bold("Comandos:")}
4161
3358
  help Mostrar esta ajuda
4162
3359
  version Mostrar vers\xE3o
4163
3360
 
4164
- ${import_picocolors9.default.bold("Templates:")}
3361
+ ${import_picocolors8.default.bold("Templates:")}
4165
3362
  --landing Landing page (Next.js 16 + Tailwind 4 + shadcn)
4166
3363
  --app Web app (Landing + Better Auth + Drizzle)
4167
3364
  --turborepo Monorepo (Turborepo + apps/packages)
4168
3365
 
4169
- ${import_picocolors9.default.bold("Analyze & Upgrade:")}
3366
+ ${import_picocolors8.default.bold("Analyze & Upgrade:")}
4170
3367
  analyze . Detectar stack e mostrar recomenda\xE7\xF5es
4171
3368
  analyze --json Output em JSON
4172
3369
  upgrade --plan Mostrar plano de upgrade
4173
3370
  upgrade next Atualizar Next.js
4174
3371
  upgrade tailwind Atualizar Tailwind CSS
4175
3372
 
4176
- ${import_picocolors9.default.bold("Update (CLI):")}
3373
+ ${import_picocolors8.default.bold("Update (CLI):")}
4177
3374
  update Atualizar para ultima versao
4178
3375
  update 0.11.0 Instalar versao especifica
4179
3376
  update --list Listar versoes disponiveis
4180
3377
  update --force Forcar reinstalacao (limpa cache)
4181
3378
 
4182
- ${import_picocolors9.default.bold("Setup (Ambiente):")}
3379
+ ${import_picocolors8.default.bold("Setup (Ambiente):")}
4183
3380
  setup node Migrar para Volta (remove fnm/nvm)
4184
3381
  setup node --check Verificar ambiente atual
4185
3382
 
4186
- ${import_picocolors9.default.bold("Op\xE7\xF5es:")}
3383
+ ${import_picocolors8.default.bold("Op\xE7\xF5es:")}
4187
3384
  -y, --yes Aceitar padr\xF5es
4188
3385
  --no-git N\xE3o inicializar Git
4189
3386
  --no-install N\xE3o instalar depend\xEAncias
4190
3387
  --template <url> Usar template customizado
4191
3388
 
4192
- ${import_picocolors9.default.bold("Lola (Code Agent):")}
3389
+ ${import_picocolors8.default.bold("Lola (Code Agent):")}
4193
3390
  lola install Instalar/atualizar Lola
4194
3391
  lola suggest Sugerir melhoria (cria issue)
4195
3392
 
4196
- ${import_picocolors9.default.bold("Exemplos:")}
4197
- ${import_picocolors9.default.dim("$")} nimbus create my-landing --landing
4198
- ${import_picocolors9.default.dim("$")} nimbus create my-app --app
4199
- ${import_picocolors9.default.dim("$")} nimbus analyze ./my-project
4200
- ${import_picocolors9.default.dim("$")} nimbus upgrade --plan
4201
- ${import_picocolors9.default.dim("$")} nimbus update
4202
- ${import_picocolors9.default.dim("$")} nimbus setup node
4203
- ${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
4204
3401
  `);
4205
3402
  }
4206
3403
  function showVersion() {
4207
3404
  console.log(`${PACKAGE_NAME2} v${CURRENT_VERSION}`);
4208
3405
  }
4209
3406
  main().catch((err) => {
4210
- console.error(import_picocolors9.default.red("Erro:"), err.message);
3407
+ console.error(import_picocolors8.default.red("Erro:"), err.message);
4211
3408
  process.exit(1);
4212
3409
  });