@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.
- package/README.md +0 -41
- package/dist/index.js +265 -1068
- 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
|
|
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/
|
|
2566
|
+
// src/commands/setup-node.ts
|
|
2567
2567
|
var import_picocolors7 = __toESM(require_picocolors(), 1);
|
|
2568
|
-
import {
|
|
2569
|
-
import {
|
|
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
|
|
2574
|
+
var CHECK_CMD = IS_WINDOWS ? "where" : "which";
|
|
3446
2575
|
function detectFnm() {
|
|
3447
2576
|
const result = { name: "fnm", installed: false };
|
|
3448
|
-
const check = spawnSync2(
|
|
2577
|
+
const check = spawnSync2(CHECK_CMD, ["fnm"], { encoding: "utf-8", shell: true });
|
|
3449
2578
|
const fnmLocations = IS_WINDOWS ? [
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
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
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
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
|
-
|
|
2595
|
+
join3(HOME, ".cargo", "bin", "fnm")
|
|
3464
2596
|
];
|
|
3465
2597
|
let fnmPath = null;
|
|
3466
|
-
if (check.
|
|
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 (
|
|
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 =
|
|
3489
|
-
const ps7Profile =
|
|
3490
|
-
const psProfile =
|
|
3491
|
-
if (
|
|
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 (
|
|
2636
|
+
if (existsSync2(ps7Profile))
|
|
3494
2637
|
result.configFiles.push(ps7Profile);
|
|
3495
|
-
if (
|
|
2638
|
+
if (existsSync2(psProfile))
|
|
3496
2639
|
result.configFiles.push(psProfile);
|
|
3497
2640
|
} else {
|
|
3498
2641
|
const configs = [
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
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 (
|
|
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(
|
|
2659
|
+
const check = spawnSync2(CHECK_CMD, ["nvm"], { encoding: "utf-8", shell: true });
|
|
3517
2660
|
const nvmWinLocations = [
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
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.
|
|
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 (
|
|
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
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
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 (
|
|
2693
|
+
if (existsSync2(cfg))
|
|
3550
2694
|
result.configFiles.push(cfg);
|
|
3551
2695
|
}
|
|
3552
2696
|
} else {
|
|
3553
|
-
const nvmDir = process.env.NVM_DIR ||
|
|
3554
|
-
if (!
|
|
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
|
-
|
|
3561
|
-
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
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 (
|
|
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(
|
|
3577
|
-
if (check.
|
|
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(
|
|
3590
|
-
if (check.
|
|
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 (!
|
|
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 (!
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
3718
|
-
|
|
3719
|
-
|
|
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 (
|
|
2868
|
+
if (existsSync2(dir)) {
|
|
3723
2869
|
try {
|
|
3724
|
-
execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell:
|
|
3725
|
-
console.log(
|
|
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(
|
|
2890
|
+
console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
|
|
3733
2891
|
removed = true;
|
|
3734
2892
|
}
|
|
3735
2893
|
}
|
|
3736
|
-
spinner.stop(removed ? "fnm removido!" :
|
|
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.
|
|
2901
|
+
if (brewCheck.status === 0) {
|
|
3744
2902
|
execSync2("brew uninstall fnm", { stdio: "pipe" });
|
|
3745
|
-
console.log(
|
|
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(
|
|
2909
|
+
console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
|
|
3752
2910
|
removed = true;
|
|
3753
2911
|
}
|
|
3754
2912
|
}
|
|
3755
2913
|
const fnmDirs = [
|
|
3756
|
-
|
|
3757
|
-
|
|
2914
|
+
join3(HOME, ".fnm"),
|
|
2915
|
+
join3(HOME, ".local", "share", "fnm")
|
|
3758
2916
|
];
|
|
3759
2917
|
for (const fnmDir of fnmDirs) {
|
|
3760
|
-
if (
|
|
2918
|
+
if (existsSync2(fnmDir)) {
|
|
3761
2919
|
execSync2(`rm -rf "${fnmDir}"`, { stdio: "pipe" });
|
|
3762
|
-
console.log(
|
|
2920
|
+
console.log(import_picocolors7.default.dim(` Removido ${fnmDir}`));
|
|
3763
2921
|
removed = true;
|
|
3764
2922
|
}
|
|
3765
2923
|
}
|
|
3766
2924
|
const fnmBins = [
|
|
3767
|
-
|
|
3768
|
-
|
|
2925
|
+
join3(HOME, ".local", "bin", "fnm"),
|
|
2926
|
+
join3(HOME, ".cargo", "bin", "fnm")
|
|
3769
2927
|
];
|
|
3770
2928
|
for (const bin of fnmBins) {
|
|
3771
|
-
if (
|
|
2929
|
+
if (existsSync2(bin)) {
|
|
3772
2930
|
execSync2(`rm -f "${bin}"`, { stdio: "pipe" });
|
|
3773
|
-
console.log(
|
|
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(
|
|
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(
|
|
2953
|
+
console.log(import_picocolors7.default.dim(" Removido via winget"));
|
|
3796
2954
|
removed = true;
|
|
3797
2955
|
}
|
|
3798
2956
|
} catch {}
|
|
3799
2957
|
const nvmWinDirs = [
|
|
3800
|
-
|
|
3801
|
-
|
|
3802
|
-
|
|
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 (
|
|
2963
|
+
if (existsSync2(dir)) {
|
|
3806
2964
|
try {
|
|
3807
|
-
execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell:
|
|
3808
|
-
console.log(
|
|
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(
|
|
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(
|
|
2978
|
+
console.log(import_picocolors7.default.yellow(`
|
|
3821
2979
|
nvm-windows pode precisar de remocao manual:`));
|
|
3822
|
-
console.log(
|
|
3823
|
-
console.log(
|
|
3824
|
-
console.log(
|
|
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!" :
|
|
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(
|
|
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 ||
|
|
3838
|
-
if (
|
|
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(
|
|
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(
|
|
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
|
|
3857
|
-
if (
|
|
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
|
-
|
|
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(
|
|
3875
|
-
console.log(
|
|
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 =
|
|
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 (
|
|
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(
|
|
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(
|
|
3904
|
-
console.log(
|
|
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" :
|
|
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"
|
|
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(
|
|
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" :
|
|
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"
|
|
3128
|
+
execSync2(`"${voltaBin}" install ${pkg}`, { stdio: "pipe" });
|
|
3930
3129
|
spinner.stop(`${pkg} instalado!`);
|
|
3931
3130
|
} catch {
|
|
3932
|
-
spinner.stop(
|
|
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(
|
|
3138
|
+
Ie(import_picocolors7.default.bgCyan(import_picocolors7.default.black(" nimbus setup node ")));
|
|
3940
3139
|
console.log();
|
|
3941
|
-
console.log(
|
|
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
|
|
3950
|
-
return
|
|
3148
|
+
return import_picocolors7.default.dim("nao instalado");
|
|
3149
|
+
return import_picocolors7.default.green(`instalado${version ? ` (${version})` : ""}`);
|
|
3951
3150
|
};
|
|
3952
|
-
console.log(` ${
|
|
3953
|
-
console.log(` ${
|
|
3954
|
-
console.log(` ${
|
|
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(` ${
|
|
3155
|
+
console.log(` ${import_picocolors7.default.bold("node:")} ${node.version || import_picocolors7.default.dim("nao encontrado")}`);
|
|
3957
3156
|
if (node.manager) {
|
|
3958
|
-
console.log(` ${
|
|
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(
|
|
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(
|
|
3969
|
-
console.log(
|
|
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(
|
|
3176
|
+
console.log(import_picocolors7.default.yellow(" Gerenciadores antigos detectados!"));
|
|
3978
3177
|
console.log();
|
|
3979
|
-
console.log(
|
|
3980
|
-
console.log(
|
|
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(
|
|
3182
|
+
console.log(import_picocolors7.default.bold(" Pacotes globais encontrados:"));
|
|
3984
3183
|
for (const pkg of globalPackages) {
|
|
3985
|
-
console.log(
|
|
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(
|
|
3199
|
+
console.log(import_picocolors7.default.bold(" O que sera feito:"));
|
|
4001
3200
|
for (const action of actions) {
|
|
4002
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
3224
|
+
console.log(import_picocolors7.default.bold(" Instalando Volta..."));
|
|
4026
3225
|
const installed = await installVolta();
|
|
4027
3226
|
if (!installed) {
|
|
4028
|
-
Se(
|
|
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(
|
|
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(
|
|
3236
|
+
console.log(import_picocolors7.default.bold(" Reinstalando pacotes globais..."));
|
|
4038
3237
|
await reinstallGlobalPackages(globalPackages);
|
|
4039
3238
|
console.log();
|
|
4040
3239
|
}
|
|
4041
|
-
console.log(
|
|
4042
|
-
console.log(
|
|
4043
|
-
console.log(
|
|
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(
|
|
3245
|
+
console.log(import_picocolors7.default.yellow(" IMPORTANTE: Reinicie o terminal!"));
|
|
4047
3246
|
console.log();
|
|
4048
|
-
console.log(
|
|
4049
|
-
console.log(
|
|
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(
|
|
3250
|
+
console.log(import_picocolors7.default.yellow(" IMPORTANTE: Reinicie o terminal ou execute:"));
|
|
4052
3251
|
console.log();
|
|
4053
|
-
console.log(
|
|
4054
|
-
console.log(
|
|
4055
|
-
console.log(
|
|
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(
|
|
4059
|
-
console.log(
|
|
4060
|
-
console.log(
|
|
4061
|
-
console.log(
|
|
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(
|
|
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.
|
|
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(
|
|
4105
|
-
console.log(
|
|
4106
|
-
console.log(
|
|
4107
|
-
console.log(
|
|
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(
|
|
4114
|
-
console.log(
|
|
4115
|
-
console.log(
|
|
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(
|
|
4137
|
-
console.log(
|
|
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(
|
|
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
|
-
${
|
|
3349
|
+
${import_picocolors8.default.bold("Uso:")} nimbus [comando] [op\xE7\xF5es]
|
|
4153
3350
|
|
|
4154
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
4197
|
-
${
|
|
4198
|
-
${
|
|
4199
|
-
${
|
|
4200
|
-
${
|
|
4201
|
-
${
|
|
4202
|
-
${
|
|
4203
|
-
${
|
|
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(
|
|
3407
|
+
console.error(import_picocolors8.default.red("Erro:"), err.message);
|
|
4211
3408
|
process.exit(1);
|
|
4212
3409
|
});
|