@nimbuslab/cli 0.17.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +201 -1074
- 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,928 +2563,57 @@ 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
|
-
|
|
2579
|
+
join3(HOME, "scoop", "shims", "fnm.exe"),
|
|
2580
|
+
join3(HOME, "scoop", "apps", "fnm", "current", "fnm.exe"),
|
|
3452
2581
|
"C:\\ProgramData\\chocolatey\\bin\\fnm.exe",
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
2582
|
+
join3(HOME, ".cargo", "bin", "fnm.exe"),
|
|
2583
|
+
join3(HOME, ".fnm", "fnm.exe"),
|
|
2584
|
+
join3(HOME, "AppData", "Local", "fnm", "fnm.exe"),
|
|
2585
|
+
join3(HOME, "AppData", "Roaming", "fnm", "fnm.exe"),
|
|
2586
|
+
join3(HOME, "AppData", "Local", "Microsoft", "fnm", "fnm.exe"),
|
|
2587
|
+
join3(HOME, "AppData", "Roaming", "fnm"),
|
|
2588
|
+
join3(HOME, "AppData", "Local", "fnm_multishells")
|
|
3460
2589
|
] : [
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
2590
|
+
join3(HOME, ".local", "share", "fnm", "fnm"),
|
|
2591
|
+
join3(HOME, ".fnm", "fnm"),
|
|
2592
|
+
join3(HOME, ".local", "bin", "fnm"),
|
|
3464
2593
|
"/opt/homebrew/bin/fnm",
|
|
3465
2594
|
"/usr/local/bin/fnm",
|
|
3466
|
-
|
|
2595
|
+
join3(HOME, ".cargo", "bin", "fnm")
|
|
3467
2596
|
];
|
|
3468
2597
|
let fnmPath = null;
|
|
3469
|
-
if (check.
|
|
2598
|
+
if (check.status === 0) {
|
|
3470
2599
|
fnmPath = check.stdout?.trim().split(`
|
|
3471
2600
|
`)[0] || null;
|
|
3472
2601
|
} else {
|
|
3473
2602
|
for (const loc of fnmLocations) {
|
|
3474
|
-
if (
|
|
2603
|
+
if (existsSync2(loc)) {
|
|
3475
2604
|
fnmPath = loc;
|
|
3476
2605
|
break;
|
|
3477
2606
|
}
|
|
3478
2607
|
}
|
|
3479
2608
|
}
|
|
3480
2609
|
if (!fnmPath && process.env.FNM_DIR) {
|
|
3481
|
-
if (
|
|
2610
|
+
if (existsSync2(process.env.FNM_DIR)) {
|
|
3482
2611
|
fnmPath = process.env.FNM_DIR;
|
|
3483
2612
|
}
|
|
3484
2613
|
}
|
|
3485
2614
|
if (!fnmPath && IS_WINDOWS) {
|
|
3486
|
-
const fnmMultishells =
|
|
3487
|
-
if (
|
|
2615
|
+
const fnmMultishells = join3(HOME, "AppData", "Local", "fnm_multishells");
|
|
2616
|
+
if (existsSync2(fnmMultishells)) {
|
|
3488
2617
|
fnmPath = fnmMultishells;
|
|
3489
2618
|
}
|
|
3490
2619
|
}
|
|
@@ -3499,26 +2628,26 @@ function detectFnm() {
|
|
|
3499
2628
|
} catch {}
|
|
3500
2629
|
result.configFiles = [];
|
|
3501
2630
|
if (IS_WINDOWS) {
|
|
3502
|
-
const ps5Profile =
|
|
3503
|
-
const ps7Profile =
|
|
3504
|
-
const psProfile =
|
|
3505
|
-
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))
|
|
3506
2635
|
result.configFiles.push(ps5Profile);
|
|
3507
|
-
if (
|
|
2636
|
+
if (existsSync2(ps7Profile))
|
|
3508
2637
|
result.configFiles.push(ps7Profile);
|
|
3509
|
-
if (
|
|
2638
|
+
if (existsSync2(psProfile))
|
|
3510
2639
|
result.configFiles.push(psProfile);
|
|
3511
2640
|
} else {
|
|
3512
2641
|
const configs = [
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
2642
|
+
join3(HOME, ".bashrc"),
|
|
2643
|
+
join3(HOME, ".bash_profile"),
|
|
2644
|
+
join3(HOME, ".profile"),
|
|
2645
|
+
join3(HOME, ".zshrc"),
|
|
2646
|
+
join3(HOME, ".zprofile"),
|
|
2647
|
+
join3(HOME, ".config", "fish", "config.fish")
|
|
3519
2648
|
];
|
|
3520
2649
|
for (const cfg of configs) {
|
|
3521
|
-
if (
|
|
2650
|
+
if (existsSync2(cfg))
|
|
3522
2651
|
result.configFiles.push(cfg);
|
|
3523
2652
|
}
|
|
3524
2653
|
}
|
|
@@ -3527,20 +2656,20 @@ function detectFnm() {
|
|
|
3527
2656
|
function detectNvm() {
|
|
3528
2657
|
const result = { name: "nvm", installed: false };
|
|
3529
2658
|
if (IS_WINDOWS) {
|
|
3530
|
-
const check = spawnSync2(
|
|
2659
|
+
const check = spawnSync2(CHECK_CMD, ["nvm"], { encoding: "utf-8", shell: true });
|
|
3531
2660
|
const nvmWinLocations = [
|
|
3532
|
-
|
|
2661
|
+
join3(HOME, "AppData", "Roaming", "nvm", "nvm.exe"),
|
|
3533
2662
|
"C:\\Program Files\\nvm\\nvm.exe",
|
|
3534
2663
|
"C:\\ProgramData\\nvm\\nvm.exe",
|
|
3535
|
-
|
|
2664
|
+
join3(HOME, "nvm", "nvm.exe")
|
|
3536
2665
|
];
|
|
3537
2666
|
let nvmPath = null;
|
|
3538
|
-
if (check.
|
|
2667
|
+
if (check.status === 0) {
|
|
3539
2668
|
nvmPath = check.stdout?.trim().split(`
|
|
3540
2669
|
`)[0] || null;
|
|
3541
2670
|
} else {
|
|
3542
2671
|
for (const loc of nvmWinLocations) {
|
|
3543
|
-
if (
|
|
2672
|
+
if (existsSync2(loc)) {
|
|
3544
2673
|
nvmPath = loc;
|
|
3545
2674
|
break;
|
|
3546
2675
|
}
|
|
@@ -3556,31 +2685,31 @@ function detectNvm() {
|
|
|
3556
2685
|
} catch {}
|
|
3557
2686
|
result.configFiles = [];
|
|
3558
2687
|
const configs = [
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
|
|
2688
|
+
join3(HOME, "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1"),
|
|
2689
|
+
join3(HOME, "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1"),
|
|
2690
|
+
join3(HOME, "Documents", "PowerShell", "profile.ps1")
|
|
3562
2691
|
];
|
|
3563
2692
|
for (const cfg of configs) {
|
|
3564
|
-
if (
|
|
2693
|
+
if (existsSync2(cfg))
|
|
3565
2694
|
result.configFiles.push(cfg);
|
|
3566
2695
|
}
|
|
3567
2696
|
} else {
|
|
3568
|
-
const nvmDir = process.env.NVM_DIR ||
|
|
3569
|
-
if (!
|
|
2697
|
+
const nvmDir = process.env.NVM_DIR || join3(HOME, ".nvm");
|
|
2698
|
+
if (!existsSync2(nvmDir))
|
|
3570
2699
|
return result;
|
|
3571
2700
|
result.installed = true;
|
|
3572
2701
|
result.path = nvmDir;
|
|
3573
2702
|
result.configFiles = [];
|
|
3574
2703
|
const configs = [
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
2704
|
+
join3(HOME, ".bashrc"),
|
|
2705
|
+
join3(HOME, ".bash_profile"),
|
|
2706
|
+
join3(HOME, ".profile"),
|
|
2707
|
+
join3(HOME, ".zshrc"),
|
|
2708
|
+
join3(HOME, ".zprofile"),
|
|
2709
|
+
join3(HOME, ".config", "fish", "config.fish")
|
|
3581
2710
|
];
|
|
3582
2711
|
for (const cfg of configs) {
|
|
3583
|
-
if (
|
|
2712
|
+
if (existsSync2(cfg))
|
|
3584
2713
|
result.configFiles.push(cfg);
|
|
3585
2714
|
}
|
|
3586
2715
|
}
|
|
@@ -3588,8 +2717,8 @@ function detectNvm() {
|
|
|
3588
2717
|
}
|
|
3589
2718
|
function detectVolta() {
|
|
3590
2719
|
const result = { name: "volta", installed: false };
|
|
3591
|
-
const check = spawnSync2(
|
|
3592
|
-
if (check.
|
|
2720
|
+
const check = spawnSync2(CHECK_CMD, ["volta"], { encoding: "utf-8", shell: true });
|
|
2721
|
+
if (check.status !== 0)
|
|
3593
2722
|
return result;
|
|
3594
2723
|
result.installed = true;
|
|
3595
2724
|
result.path = check.stdout?.trim().split(`
|
|
@@ -3601,8 +2730,8 @@ function detectVolta() {
|
|
|
3601
2730
|
return result;
|
|
3602
2731
|
}
|
|
3603
2732
|
function detectNode() {
|
|
3604
|
-
const check = spawnSync2(
|
|
3605
|
-
if (check.
|
|
2733
|
+
const check = spawnSync2(CHECK_CMD, ["node"], { encoding: "utf-8", shell: true });
|
|
2734
|
+
if (check.status !== 0)
|
|
3606
2735
|
return { version: null, manager: null };
|
|
3607
2736
|
const nodePath = check.stdout?.trim().split(`
|
|
3608
2737
|
`)[0] || "";
|
|
@@ -3643,7 +2772,7 @@ function getGlobalPackages() {
|
|
|
3643
2772
|
return packages;
|
|
3644
2773
|
}
|
|
3645
2774
|
function removeFnmFromConfig(configFile) {
|
|
3646
|
-
if (!
|
|
2775
|
+
if (!existsSync2(configFile))
|
|
3647
2776
|
return false;
|
|
3648
2777
|
try {
|
|
3649
2778
|
let content = readFileSync2(configFile, "utf-8");
|
|
@@ -3668,7 +2797,7 @@ function removeFnmFromConfig(configFile) {
|
|
|
3668
2797
|
return false;
|
|
3669
2798
|
}
|
|
3670
2799
|
function removeNvmFromConfig(configFile) {
|
|
3671
|
-
if (!
|
|
2800
|
+
if (!existsSync2(configFile))
|
|
3672
2801
|
return false;
|
|
3673
2802
|
try {
|
|
3674
2803
|
let content = readFileSync2(configFile, "utf-8");
|
|
@@ -3704,7 +2833,7 @@ async function removeFnm(fnm) {
|
|
|
3704
2833
|
const scoopCheck = spawnSync2("scoop", ["list"], { encoding: "utf-8", shell: true });
|
|
3705
2834
|
if (scoopCheck.stdout?.includes("fnm")) {
|
|
3706
2835
|
execSync2("scoop uninstall fnm", { stdio: "pipe" });
|
|
3707
|
-
console.log(
|
|
2836
|
+
console.log(import_picocolors7.default.dim(" Removido via Scoop"));
|
|
3708
2837
|
removed = true;
|
|
3709
2838
|
}
|
|
3710
2839
|
} catch {}
|
|
@@ -3713,7 +2842,7 @@ async function removeFnm(fnm) {
|
|
|
3713
2842
|
const chocoCheck = spawnSync2("choco", ["list", "--local-only"], { encoding: "utf-8", shell: true });
|
|
3714
2843
|
if (chocoCheck.stdout?.includes("fnm")) {
|
|
3715
2844
|
execSync2("choco uninstall fnm -y", { stdio: "pipe" });
|
|
3716
|
-
console.log(
|
|
2845
|
+
console.log(import_picocolors7.default.dim(" Removido via Chocolatey"));
|
|
3717
2846
|
removed = true;
|
|
3718
2847
|
}
|
|
3719
2848
|
} catch {}
|
|
@@ -3723,28 +2852,28 @@ async function removeFnm(fnm) {
|
|
|
3723
2852
|
const wingetCheck = spawnSync2("winget", ["list", "--name", "fnm"], { encoding: "utf-8", shell: true });
|
|
3724
2853
|
if (wingetCheck.stdout?.includes("fnm")) {
|
|
3725
2854
|
execSync2("winget uninstall fnm --silent", { stdio: "pipe" });
|
|
3726
|
-
console.log(
|
|
2855
|
+
console.log(import_picocolors7.default.dim(" Removido via winget"));
|
|
3727
2856
|
removed = true;
|
|
3728
2857
|
}
|
|
3729
2858
|
} catch {}
|
|
3730
2859
|
}
|
|
3731
2860
|
const winFnmDirs = [
|
|
3732
|
-
|
|
3733
|
-
|
|
3734
|
-
|
|
3735
|
-
|
|
3736
|
-
|
|
2861
|
+
join3(HOME, ".fnm"),
|
|
2862
|
+
join3(HOME, "AppData", "Local", "fnm"),
|
|
2863
|
+
join3(HOME, "AppData", "Roaming", "fnm"),
|
|
2864
|
+
join3(HOME, "AppData", "Local", "fnm_multishells"),
|
|
2865
|
+
join3(HOME, "AppData", "Local", "Microsoft", "fnm")
|
|
3737
2866
|
];
|
|
3738
2867
|
for (const dir of winFnmDirs) {
|
|
3739
|
-
if (
|
|
2868
|
+
if (existsSync2(dir)) {
|
|
3740
2869
|
try {
|
|
3741
|
-
execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell:
|
|
3742
|
-
console.log(
|
|
2870
|
+
execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: "cmd.exe" });
|
|
2871
|
+
console.log(import_picocolors7.default.dim(` Removido ${dir}`));
|
|
3743
2872
|
removed = true;
|
|
3744
2873
|
} catch {
|
|
3745
2874
|
try {
|
|
3746
2875
|
execSync2(`powershell -Command "Remove-Item -Path '${dir}' -Recurse -Force"`, { stdio: "pipe" });
|
|
3747
|
-
console.log(
|
|
2876
|
+
console.log(import_picocolors7.default.dim(` Removido ${dir}`));
|
|
3748
2877
|
removed = true;
|
|
3749
2878
|
} catch {}
|
|
3750
2879
|
}
|
|
@@ -3753,53 +2882,53 @@ async function removeFnm(fnm) {
|
|
|
3753
2882
|
try {
|
|
3754
2883
|
execSync2(`powershell -Command "[Environment]::SetEnvironmentVariable('FNM_DIR', $null, 'User')"`, { stdio: "pipe" });
|
|
3755
2884
|
execSync2(`powershell -Command "[Environment]::SetEnvironmentVariable('FNM_MULTISHELL_PATH', $null, 'User')"`, { stdio: "pipe" });
|
|
3756
|
-
console.log(
|
|
2885
|
+
console.log(import_picocolors7.default.dim(" Variaveis de ambiente FNM removidas"));
|
|
3757
2886
|
removed = true;
|
|
3758
2887
|
} catch {}
|
|
3759
2888
|
for (const configFile of fnm.configFiles || []) {
|
|
3760
2889
|
if (removeFnmFromConfig(configFile)) {
|
|
3761
|
-
console.log(
|
|
2890
|
+
console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
|
|
3762
2891
|
removed = true;
|
|
3763
2892
|
}
|
|
3764
2893
|
}
|
|
3765
|
-
spinner.stop(removed ? "fnm removido!" :
|
|
2894
|
+
spinner.stop(removed ? "fnm removido!" : import_picocolors7.default.yellow("fnm nao encontrado"));
|
|
3766
2895
|
return removed;
|
|
3767
2896
|
} else {
|
|
3768
2897
|
spinner.start("Removendo fnm...");
|
|
3769
2898
|
let removed = false;
|
|
3770
2899
|
try {
|
|
3771
2900
|
const brewCheck = spawnSync2("brew", ["list", "fnm"], { encoding: "utf-8", shell: true });
|
|
3772
|
-
if (brewCheck.
|
|
2901
|
+
if (brewCheck.status === 0) {
|
|
3773
2902
|
execSync2("brew uninstall fnm", { stdio: "pipe" });
|
|
3774
|
-
console.log(
|
|
2903
|
+
console.log(import_picocolors7.default.dim(" Removido via Homebrew"));
|
|
3775
2904
|
removed = true;
|
|
3776
2905
|
}
|
|
3777
2906
|
} catch {}
|
|
3778
2907
|
for (const configFile of fnm.configFiles || []) {
|
|
3779
2908
|
if (removeFnmFromConfig(configFile)) {
|
|
3780
|
-
console.log(
|
|
2909
|
+
console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
|
|
3781
2910
|
removed = true;
|
|
3782
2911
|
}
|
|
3783
2912
|
}
|
|
3784
2913
|
const fnmDirs = [
|
|
3785
|
-
|
|
3786
|
-
|
|
2914
|
+
join3(HOME, ".fnm"),
|
|
2915
|
+
join3(HOME, ".local", "share", "fnm")
|
|
3787
2916
|
];
|
|
3788
2917
|
for (const fnmDir of fnmDirs) {
|
|
3789
|
-
if (
|
|
2918
|
+
if (existsSync2(fnmDir)) {
|
|
3790
2919
|
execSync2(`rm -rf "${fnmDir}"`, { stdio: "pipe" });
|
|
3791
|
-
console.log(
|
|
2920
|
+
console.log(import_picocolors7.default.dim(` Removido ${fnmDir}`));
|
|
3792
2921
|
removed = true;
|
|
3793
2922
|
}
|
|
3794
2923
|
}
|
|
3795
2924
|
const fnmBins = [
|
|
3796
|
-
|
|
3797
|
-
|
|
2925
|
+
join3(HOME, ".local", "bin", "fnm"),
|
|
2926
|
+
join3(HOME, ".cargo", "bin", "fnm")
|
|
3798
2927
|
];
|
|
3799
2928
|
for (const bin of fnmBins) {
|
|
3800
|
-
if (
|
|
2929
|
+
if (existsSync2(bin)) {
|
|
3801
2930
|
execSync2(`rm -f "${bin}"`, { stdio: "pipe" });
|
|
3802
|
-
console.log(
|
|
2931
|
+
console.log(import_picocolors7.default.dim(` Removido ${bin}`));
|
|
3803
2932
|
removed = true;
|
|
3804
2933
|
}
|
|
3805
2934
|
}
|
|
@@ -3807,7 +2936,7 @@ async function removeFnm(fnm) {
|
|
|
3807
2936
|
return removed;
|
|
3808
2937
|
}
|
|
3809
2938
|
} catch (error) {
|
|
3810
|
-
spinner.stop(
|
|
2939
|
+
spinner.stop(import_picocolors7.default.red("Erro ao remover fnm"));
|
|
3811
2940
|
return false;
|
|
3812
2941
|
}
|
|
3813
2942
|
}
|
|
@@ -3821,59 +2950,59 @@ async function removeNvm(nvm) {
|
|
|
3821
2950
|
const wingetCheck = spawnSync2("winget", ["list", "--name", "nvm"], { encoding: "utf-8", shell: true });
|
|
3822
2951
|
if (wingetCheck.stdout?.toLowerCase().includes("nvm")) {
|
|
3823
2952
|
execSync2("winget uninstall nvm --silent", { stdio: "pipe" });
|
|
3824
|
-
console.log(
|
|
2953
|
+
console.log(import_picocolors7.default.dim(" Removido via winget"));
|
|
3825
2954
|
removed = true;
|
|
3826
2955
|
}
|
|
3827
2956
|
} catch {}
|
|
3828
2957
|
const nvmWinDirs = [
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
2958
|
+
join3(HOME, "AppData", "Roaming", "nvm"),
|
|
2959
|
+
join3("C:", "Program Files", "nvm"),
|
|
2960
|
+
join3("C:", "ProgramData", "nvm")
|
|
3832
2961
|
];
|
|
3833
2962
|
for (const dir of nvmWinDirs) {
|
|
3834
|
-
if (
|
|
2963
|
+
if (existsSync2(dir)) {
|
|
3835
2964
|
try {
|
|
3836
|
-
execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell:
|
|
3837
|
-
console.log(
|
|
2965
|
+
execSync2(`rmdir /s /q "${dir}"`, { stdio: "pipe", shell: "cmd.exe" });
|
|
2966
|
+
console.log(import_picocolors7.default.dim(` Removido ${dir}`));
|
|
3838
2967
|
removed = true;
|
|
3839
2968
|
} catch {}
|
|
3840
2969
|
}
|
|
3841
2970
|
}
|
|
3842
2971
|
for (const configFile of nvm.configFiles || []) {
|
|
3843
2972
|
if (removeNvmFromConfig(configFile)) {
|
|
3844
|
-
console.log(
|
|
2973
|
+
console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
|
|
3845
2974
|
removed = true;
|
|
3846
2975
|
}
|
|
3847
2976
|
}
|
|
3848
2977
|
if (!removed) {
|
|
3849
|
-
console.log(
|
|
2978
|
+
console.log(import_picocolors7.default.yellow(`
|
|
3850
2979
|
nvm-windows pode precisar de remocao manual:`));
|
|
3851
|
-
console.log(
|
|
3852
|
-
console.log(
|
|
3853
|
-
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"));
|
|
3854
2983
|
}
|
|
3855
|
-
spinner.stop(removed ? "nvm removido!" :
|
|
2984
|
+
spinner.stop(removed ? "nvm removido!" : import_picocolors7.default.yellow("Verifique manualmente"));
|
|
3856
2985
|
return removed;
|
|
3857
2986
|
} else {
|
|
3858
2987
|
spinner.start("Removendo nvm...");
|
|
3859
2988
|
let removed = false;
|
|
3860
2989
|
for (const configFile of nvm.configFiles || []) {
|
|
3861
2990
|
if (removeNvmFromConfig(configFile)) {
|
|
3862
|
-
console.log(
|
|
2991
|
+
console.log(import_picocolors7.default.dim(` Removido de ${configFile}`));
|
|
3863
2992
|
removed = true;
|
|
3864
2993
|
}
|
|
3865
2994
|
}
|
|
3866
|
-
const nvmDir = process.env.NVM_DIR ||
|
|
3867
|
-
if (
|
|
2995
|
+
const nvmDir = process.env.NVM_DIR || join3(HOME, ".nvm");
|
|
2996
|
+
if (existsSync2(nvmDir)) {
|
|
3868
2997
|
execSync2(`rm -rf "${nvmDir}"`, { stdio: "pipe" });
|
|
3869
|
-
console.log(
|
|
2998
|
+
console.log(import_picocolors7.default.dim(` Removido ${nvmDir}`));
|
|
3870
2999
|
removed = true;
|
|
3871
3000
|
}
|
|
3872
3001
|
spinner.stop(removed ? "nvm removido!" : "nvm nao encontrado");
|
|
3873
3002
|
return removed;
|
|
3874
3003
|
}
|
|
3875
3004
|
} catch (error) {
|
|
3876
|
-
spinner.stop(
|
|
3005
|
+
spinner.stop(import_picocolors7.default.red("Erro ao remover nvm"));
|
|
3877
3006
|
return false;
|
|
3878
3007
|
}
|
|
3879
3008
|
}
|
|
@@ -3882,8 +3011,8 @@ async function installVolta() {
|
|
|
3882
3011
|
try {
|
|
3883
3012
|
if (IS_WINDOWS) {
|
|
3884
3013
|
spinner.start("Verificando metodo de instalacao...");
|
|
3885
|
-
const wingetCheck = spawnSync2(
|
|
3886
|
-
if (wingetCheck.
|
|
3014
|
+
const wingetCheck = spawnSync2(CHECK_CMD, ["winget"], { encoding: "utf-8", shell: true });
|
|
3015
|
+
if (wingetCheck.status === 0) {
|
|
3887
3016
|
spinner.stop("winget detectado");
|
|
3888
3017
|
spinner.start("Instalando Volta via winget...");
|
|
3889
3018
|
try {
|
|
@@ -3892,25 +3021,25 @@ async function installVolta() {
|
|
|
3892
3021
|
timeout: 120000
|
|
3893
3022
|
});
|
|
3894
3023
|
spinner.stop("Volta instalado!");
|
|
3895
|
-
const voltaPath =
|
|
3896
|
-
console.log(
|
|
3024
|
+
const voltaPath = join3(HOME, ".volta", "bin");
|
|
3025
|
+
console.log(import_picocolors7.default.dim(` Adicionando ${voltaPath} ao PATH...`));
|
|
3897
3026
|
try {
|
|
3898
|
-
execSync2(`setx PATH "%PATH%;${voltaPath}"`, { stdio: "pipe", shell:
|
|
3027
|
+
execSync2(`setx PATH "%PATH%;${voltaPath}"`, { stdio: "pipe", shell: "cmd.exe" });
|
|
3899
3028
|
} catch {}
|
|
3900
3029
|
return true;
|
|
3901
3030
|
} catch (e2) {
|
|
3902
|
-
spinner.stop(
|
|
3031
|
+
spinner.stop(import_picocolors7.default.yellow("winget falhou, tentando outro metodo..."));
|
|
3903
3032
|
}
|
|
3904
3033
|
}
|
|
3905
|
-
const chocoCheck = spawnSync2(
|
|
3906
|
-
if (chocoCheck.
|
|
3034
|
+
const chocoCheck = spawnSync2(CHECK_CMD, ["choco"], { encoding: "utf-8", shell: true });
|
|
3035
|
+
if (chocoCheck.status === 0) {
|
|
3907
3036
|
spinner.start("Instalando Volta via Chocolatey...");
|
|
3908
3037
|
try {
|
|
3909
3038
|
execSync2("choco install volta -y", { stdio: "pipe", timeout: 120000 });
|
|
3910
3039
|
spinner.stop("Volta instalado!");
|
|
3911
3040
|
return true;
|
|
3912
3041
|
} catch {
|
|
3913
|
-
spinner.stop(
|
|
3042
|
+
spinner.stop(import_picocolors7.default.yellow("Chocolatey falhou"));
|
|
3914
3043
|
}
|
|
3915
3044
|
}
|
|
3916
3045
|
spinner.start("Baixando Volta diretamente...");
|
|
@@ -3934,17 +3063,17 @@ async function installVolta() {
|
|
|
3934
3063
|
spinner.stop("Volta instalado!");
|
|
3935
3064
|
return true;
|
|
3936
3065
|
} catch (e2) {
|
|
3937
|
-
spinner.stop(
|
|
3066
|
+
spinner.stop(import_picocolors7.default.yellow("Download direto falhou"));
|
|
3938
3067
|
}
|
|
3939
3068
|
console.log();
|
|
3940
|
-
console.log(
|
|
3069
|
+
console.log(import_picocolors7.default.bold(" Instale manualmente:"));
|
|
3941
3070
|
console.log();
|
|
3942
|
-
console.log(
|
|
3943
|
-
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)"));
|
|
3944
3073
|
console.log();
|
|
3945
|
-
console.log(
|
|
3074
|
+
console.log(import_picocolors7.default.cyan(" 2. Execute o instalador"));
|
|
3946
3075
|
console.log();
|
|
3947
|
-
console.log(
|
|
3076
|
+
console.log(import_picocolors7.default.cyan(" 3. Reinicie o terminal"));
|
|
3948
3077
|
console.log();
|
|
3949
3078
|
return false;
|
|
3950
3079
|
} else {
|
|
@@ -3953,38 +3082,38 @@ async function installVolta() {
|
|
|
3953
3082
|
stdio: "pipe",
|
|
3954
3083
|
shell: "/bin/bash"
|
|
3955
3084
|
});
|
|
3956
|
-
const shellConfig =
|
|
3085
|
+
const shellConfig = existsSync2(join3(HOME, ".zshrc")) ? join3(HOME, ".zshrc") : join3(HOME, ".bashrc");
|
|
3957
3086
|
const voltaSetup = `
|
|
3958
3087
|
# Volta - Node.js version manager
|
|
3959
3088
|
export VOLTA_HOME="$HOME/.volta"
|
|
3960
3089
|
export PATH="$VOLTA_HOME/bin:$PATH"
|
|
3961
3090
|
`;
|
|
3962
|
-
if (
|
|
3091
|
+
if (existsSync2(shellConfig)) {
|
|
3963
3092
|
const content = readFileSync2(shellConfig, "utf-8");
|
|
3964
3093
|
if (!content.includes("VOLTA_HOME")) {
|
|
3965
3094
|
writeFileSync(shellConfig, content + voltaSetup);
|
|
3966
|
-
console.log(
|
|
3095
|
+
console.log(import_picocolors7.default.dim(` Adicionado ao ${shellConfig}`));
|
|
3967
3096
|
}
|
|
3968
3097
|
}
|
|
3969
3098
|
spinner.stop("Volta instalado!");
|
|
3970
3099
|
return true;
|
|
3971
3100
|
}
|
|
3972
3101
|
} catch (error) {
|
|
3973
|
-
spinner.stop(
|
|
3974
|
-
console.log(
|
|
3102
|
+
spinner.stop(import_picocolors7.default.red("Erro ao instalar Volta"));
|
|
3103
|
+
console.log(import_picocolors7.default.dim(` ${error}`));
|
|
3975
3104
|
return false;
|
|
3976
3105
|
}
|
|
3977
3106
|
}
|
|
3978
3107
|
async function installNodeWithVolta() {
|
|
3979
3108
|
const spinner = Y2();
|
|
3980
3109
|
try {
|
|
3981
|
-
const voltaBin = IS_WINDOWS ? "volta" :
|
|
3110
|
+
const voltaBin = IS_WINDOWS ? "volta" : join3(HOME, ".volta", "bin", "volta");
|
|
3982
3111
|
spinner.start("Instalando Node.js LTS via Volta...");
|
|
3983
|
-
execSync2(`"${voltaBin}" install node`, { stdio: "pipe"
|
|
3112
|
+
execSync2(`"${voltaBin}" install node`, { stdio: "pipe" });
|
|
3984
3113
|
spinner.stop("Node.js instalado!");
|
|
3985
3114
|
return true;
|
|
3986
3115
|
} catch (error) {
|
|
3987
|
-
spinner.stop(
|
|
3116
|
+
spinner.stop(import_picocolors7.default.red("Erro ao instalar Node.js"));
|
|
3988
3117
|
return false;
|
|
3989
3118
|
}
|
|
3990
3119
|
}
|
|
@@ -3992,23 +3121,23 @@ async function reinstallGlobalPackages(packages) {
|
|
|
3992
3121
|
if (packages.length === 0)
|
|
3993
3122
|
return;
|
|
3994
3123
|
const spinner = Y2();
|
|
3995
|
-
const voltaBin = IS_WINDOWS ? "volta" :
|
|
3124
|
+
const voltaBin = IS_WINDOWS ? "volta" : join3(HOME, ".volta", "bin", "volta");
|
|
3996
3125
|
for (const pkg of packages) {
|
|
3997
3126
|
spinner.start(`Instalando ${pkg}...`);
|
|
3998
3127
|
try {
|
|
3999
|
-
execSync2(`"${voltaBin}" install ${pkg}`, { stdio: "pipe"
|
|
3128
|
+
execSync2(`"${voltaBin}" install ${pkg}`, { stdio: "pipe" });
|
|
4000
3129
|
spinner.stop(`${pkg} instalado!`);
|
|
4001
3130
|
} catch {
|
|
4002
|
-
spinner.stop(
|
|
3131
|
+
spinner.stop(import_picocolors7.default.yellow(`${pkg} - falha (instale manualmente)`));
|
|
4003
3132
|
}
|
|
4004
3133
|
}
|
|
4005
3134
|
}
|
|
4006
3135
|
async function setupNode(args) {
|
|
4007
3136
|
const checkOnly = args.includes("--check") || args.includes("-c");
|
|
4008
3137
|
console.log();
|
|
4009
|
-
Ie(
|
|
3138
|
+
Ie(import_picocolors7.default.bgCyan(import_picocolors7.default.black(" nimbus setup node ")));
|
|
4010
3139
|
console.log();
|
|
4011
|
-
console.log(
|
|
3140
|
+
console.log(import_picocolors7.default.bold(" Detectando ambiente..."));
|
|
4012
3141
|
console.log();
|
|
4013
3142
|
const fnm = detectFnm();
|
|
4014
3143
|
const nvm = detectNvm();
|
|
@@ -4016,27 +3145,27 @@ async function setupNode(args) {
|
|
|
4016
3145
|
const node = detectNode();
|
|
4017
3146
|
const status = (installed, version) => {
|
|
4018
3147
|
if (!installed)
|
|
4019
|
-
return
|
|
4020
|
-
return
|
|
3148
|
+
return import_picocolors7.default.dim("nao instalado");
|
|
3149
|
+
return import_picocolors7.default.green(`instalado${version ? ` (${version})` : ""}`);
|
|
4021
3150
|
};
|
|
4022
|
-
console.log(` ${
|
|
4023
|
-
console.log(` ${
|
|
4024
|
-
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)}`);
|
|
4025
3154
|
console.log();
|
|
4026
|
-
console.log(` ${
|
|
3155
|
+
console.log(` ${import_picocolors7.default.bold("node:")} ${node.version || import_picocolors7.default.dim("nao encontrado")}`);
|
|
4027
3156
|
if (node.manager) {
|
|
4028
|
-
console.log(` ${
|
|
3157
|
+
console.log(` ${import_picocolors7.default.dim(`gerenciado por: ${node.manager}`)}`);
|
|
4029
3158
|
}
|
|
4030
3159
|
console.log();
|
|
4031
3160
|
if (volta.installed && !fnm.installed && !nvm.installed) {
|
|
4032
3161
|
M2.success("Ambiente OK! Volta instalado e configurado.");
|
|
4033
|
-
Se(
|
|
3162
|
+
Se(import_picocolors7.default.green("Nada a fazer."));
|
|
4034
3163
|
return;
|
|
4035
3164
|
}
|
|
4036
3165
|
if (checkOnly) {
|
|
4037
3166
|
if (fnm.installed || nvm.installed) {
|
|
4038
|
-
console.log(
|
|
4039
|
-
console.log(
|
|
3167
|
+
console.log(import_picocolors7.default.yellow(" Recomendacao: migre para Volta"));
|
|
3168
|
+
console.log(import_picocolors7.default.dim(" Execute: nimbus setup node"));
|
|
4040
3169
|
}
|
|
4041
3170
|
Se("");
|
|
4042
3171
|
return;
|
|
@@ -4044,15 +3173,15 @@ async function setupNode(args) {
|
|
|
4044
3173
|
const hasOldManager = fnm.installed || nvm.installed;
|
|
4045
3174
|
const globalPackages = getGlobalPackages();
|
|
4046
3175
|
if (hasOldManager) {
|
|
4047
|
-
console.log(
|
|
3176
|
+
console.log(import_picocolors7.default.yellow(" Gerenciadores antigos detectados!"));
|
|
4048
3177
|
console.log();
|
|
4049
|
-
console.log(
|
|
4050
|
-
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."));
|
|
4051
3180
|
console.log();
|
|
4052
3181
|
if (globalPackages.length > 0) {
|
|
4053
|
-
console.log(
|
|
3182
|
+
console.log(import_picocolors7.default.bold(" Pacotes globais encontrados:"));
|
|
4054
3183
|
for (const pkg of globalPackages) {
|
|
4055
|
-
console.log(
|
|
3184
|
+
console.log(import_picocolors7.default.dim(` - ${pkg}`));
|
|
4056
3185
|
}
|
|
4057
3186
|
console.log();
|
|
4058
3187
|
}
|
|
@@ -4067,9 +3196,9 @@ async function setupNode(args) {
|
|
|
4067
3196
|
actions.push("Instalar Node.js via Volta");
|
|
4068
3197
|
if (globalPackages.length > 0)
|
|
4069
3198
|
actions.push(`Reinstalar ${globalPackages.length} pacotes globais`);
|
|
4070
|
-
console.log(
|
|
3199
|
+
console.log(import_picocolors7.default.bold(" O que sera feito:"));
|
|
4071
3200
|
for (const action of actions) {
|
|
4072
|
-
console.log(
|
|
3201
|
+
console.log(import_picocolors7.default.cyan(` -> ${action}`));
|
|
4073
3202
|
}
|
|
4074
3203
|
console.log();
|
|
4075
3204
|
const confirm = await ye({
|
|
@@ -4082,60 +3211,60 @@ async function setupNode(args) {
|
|
|
4082
3211
|
}
|
|
4083
3212
|
console.log();
|
|
4084
3213
|
if (fnm.installed) {
|
|
4085
|
-
console.log(
|
|
3214
|
+
console.log(import_picocolors7.default.bold(" Removendo fnm..."));
|
|
4086
3215
|
await removeFnm(fnm);
|
|
4087
3216
|
console.log();
|
|
4088
3217
|
}
|
|
4089
3218
|
if (nvm.installed) {
|
|
4090
|
-
console.log(
|
|
3219
|
+
console.log(import_picocolors7.default.bold(" Removendo nvm..."));
|
|
4091
3220
|
await removeNvm(nvm);
|
|
4092
3221
|
console.log();
|
|
4093
3222
|
}
|
|
4094
3223
|
if (!volta.installed) {
|
|
4095
|
-
console.log(
|
|
3224
|
+
console.log(import_picocolors7.default.bold(" Instalando Volta..."));
|
|
4096
3225
|
const installed = await installVolta();
|
|
4097
3226
|
if (!installed) {
|
|
4098
|
-
Se(
|
|
3227
|
+
Se(import_picocolors7.default.red("Falha na instalacao. Tente manualmente."));
|
|
4099
3228
|
return;
|
|
4100
3229
|
}
|
|
4101
3230
|
console.log();
|
|
4102
3231
|
}
|
|
4103
|
-
console.log(
|
|
3232
|
+
console.log(import_picocolors7.default.bold(" Instalando Node.js..."));
|
|
4104
3233
|
await installNodeWithVolta();
|
|
4105
3234
|
console.log();
|
|
4106
3235
|
if (globalPackages.length > 0) {
|
|
4107
|
-
console.log(
|
|
3236
|
+
console.log(import_picocolors7.default.bold(" Reinstalando pacotes globais..."));
|
|
4108
3237
|
await reinstallGlobalPackages(globalPackages);
|
|
4109
3238
|
console.log();
|
|
4110
3239
|
}
|
|
4111
|
-
console.log(
|
|
4112
|
-
console.log(
|
|
4113
|
-
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(" ====================================="));
|
|
4114
3243
|
console.log();
|
|
4115
3244
|
if (IS_WINDOWS) {
|
|
4116
|
-
console.log(
|
|
3245
|
+
console.log(import_picocolors7.default.yellow(" IMPORTANTE: Reinicie o terminal!"));
|
|
4117
3246
|
console.log();
|
|
4118
|
-
console.log(
|
|
4119
|
-
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."));
|
|
4120
3249
|
} else {
|
|
4121
|
-
console.log(
|
|
3250
|
+
console.log(import_picocolors7.default.yellow(" IMPORTANTE: Reinicie o terminal ou execute:"));
|
|
4122
3251
|
console.log();
|
|
4123
|
-
console.log(
|
|
4124
|
-
console.log(
|
|
4125
|
-
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"));
|
|
4126
3255
|
}
|
|
4127
3256
|
console.log();
|
|
4128
|
-
console.log(
|
|
4129
|
-
console.log(
|
|
4130
|
-
console.log(
|
|
4131
|
-
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"));
|
|
4132
3261
|
console.log();
|
|
4133
|
-
Se(
|
|
3262
|
+
Se(import_picocolors7.default.green("Pronto! Volta configurado."));
|
|
4134
3263
|
}
|
|
4135
3264
|
|
|
4136
3265
|
// src/index.ts
|
|
4137
3266
|
var PACKAGE_NAME2 = "@nimbuslab/cli";
|
|
4138
|
-
var CURRENT_VERSION = "0.
|
|
3267
|
+
var CURRENT_VERSION = "1.0.0";
|
|
4139
3268
|
var LOGO = `
|
|
4140
3269
|
\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
4141
3270
|
\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D
|
|
@@ -4171,18 +3300,18 @@ function showUpdateNotice(latestVersion) {
|
|
|
4171
3300
|
const line2 = ` Atualize com: ${command}`;
|
|
4172
3301
|
const maxLen = Math.max(line1.length, line2.length);
|
|
4173
3302
|
const border = "\u2500".repeat(maxLen + 2);
|
|
4174
|
-
console.log(
|
|
4175
|
-
console.log(
|
|
4176
|
-
console.log(
|
|
4177
|
-
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`));
|
|
4178
3307
|
console.log();
|
|
4179
3308
|
}
|
|
4180
3309
|
async function main() {
|
|
4181
3310
|
const args = process.argv.slice(2);
|
|
4182
3311
|
const command = args[0];
|
|
4183
|
-
console.log(
|
|
4184
|
-
console.log(
|
|
4185
|
-
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"));
|
|
4186
3315
|
console.log();
|
|
4187
3316
|
const latestVersion = await checkForUpdates();
|
|
4188
3317
|
if (latestVersion) {
|
|
@@ -4196,15 +3325,13 @@ async function main() {
|
|
|
4196
3325
|
await upgrade(args.slice(1));
|
|
4197
3326
|
} else if (command === "update") {
|
|
4198
3327
|
await update(args.slice(1));
|
|
4199
|
-
} else if (command === "lola") {
|
|
4200
|
-
await lola(args.slice(1));
|
|
4201
3328
|
} else if (command === "setup") {
|
|
4202
3329
|
const subcommand = args[1];
|
|
4203
3330
|
if (subcommand === "node") {
|
|
4204
3331
|
await setupNode(args.slice(2));
|
|
4205
3332
|
} else {
|
|
4206
|
-
console.log(
|
|
4207
|
-
console.log(
|
|
3333
|
+
console.log(import_picocolors8.default.red(`Subcomando desconhecido: ${subcommand || "(vazio)"}`));
|
|
3334
|
+
console.log(import_picocolors8.default.dim(" Uso: nimbus setup node"));
|
|
4208
3335
|
process.exit(1);
|
|
4209
3336
|
}
|
|
4210
3337
|
} else if (command === "help" || command === "--help" || command === "-h") {
|
|
@@ -4212,16 +3339,16 @@ async function main() {
|
|
|
4212
3339
|
} else if (command === "version" || command === "--version" || command === "-v") {
|
|
4213
3340
|
showVersion();
|
|
4214
3341
|
} else {
|
|
4215
|
-
console.log(
|
|
3342
|
+
console.log(import_picocolors8.default.red(`Comando desconhecido: ${command}`));
|
|
4216
3343
|
showHelp();
|
|
4217
3344
|
process.exit(1);
|
|
4218
3345
|
}
|
|
4219
3346
|
}
|
|
4220
3347
|
function showHelp() {
|
|
4221
3348
|
console.log(`
|
|
4222
|
-
${
|
|
3349
|
+
${import_picocolors8.default.bold("Uso:")} nimbus [comando] [op\xE7\xF5es]
|
|
4223
3350
|
|
|
4224
|
-
${
|
|
3351
|
+
${import_picocolors8.default.bold("Comandos:")}
|
|
4225
3352
|
create [nome] Criar novo projeto
|
|
4226
3353
|
analyze [dir] Analisar stack do projeto
|
|
4227
3354
|
upgrade [alvo] Atualizar depend\xEAncias
|
|
@@ -4231,52 +3358,52 @@ ${import_picocolors9.default.bold("Comandos:")}
|
|
|
4231
3358
|
help Mostrar esta ajuda
|
|
4232
3359
|
version Mostrar vers\xE3o
|
|
4233
3360
|
|
|
4234
|
-
${
|
|
3361
|
+
${import_picocolors8.default.bold("Templates:")}
|
|
4235
3362
|
--landing Landing page (Next.js 16 + Tailwind 4 + shadcn)
|
|
4236
3363
|
--app Web app (Landing + Better Auth + Drizzle)
|
|
4237
3364
|
--turborepo Monorepo (Turborepo + apps/packages)
|
|
4238
3365
|
|
|
4239
|
-
${
|
|
3366
|
+
${import_picocolors8.default.bold("Analyze & Upgrade:")}
|
|
4240
3367
|
analyze . Detectar stack e mostrar recomenda\xE7\xF5es
|
|
4241
3368
|
analyze --json Output em JSON
|
|
4242
3369
|
upgrade --plan Mostrar plano de upgrade
|
|
4243
3370
|
upgrade next Atualizar Next.js
|
|
4244
3371
|
upgrade tailwind Atualizar Tailwind CSS
|
|
4245
3372
|
|
|
4246
|
-
${
|
|
3373
|
+
${import_picocolors8.default.bold("Update (CLI):")}
|
|
4247
3374
|
update Atualizar para ultima versao
|
|
4248
3375
|
update 0.11.0 Instalar versao especifica
|
|
4249
3376
|
update --list Listar versoes disponiveis
|
|
4250
3377
|
update --force Forcar reinstalacao (limpa cache)
|
|
4251
3378
|
|
|
4252
|
-
${
|
|
3379
|
+
${import_picocolors8.default.bold("Setup (Ambiente):")}
|
|
4253
3380
|
setup node Migrar para Volta (remove fnm/nvm)
|
|
4254
3381
|
setup node --check Verificar ambiente atual
|
|
4255
3382
|
|
|
4256
|
-
${
|
|
3383
|
+
${import_picocolors8.default.bold("Op\xE7\xF5es:")}
|
|
4257
3384
|
-y, --yes Aceitar padr\xF5es
|
|
4258
3385
|
--no-git N\xE3o inicializar Git
|
|
4259
3386
|
--no-install N\xE3o instalar depend\xEAncias
|
|
4260
3387
|
--template <url> Usar template customizado
|
|
4261
3388
|
|
|
4262
|
-
${
|
|
3389
|
+
${import_picocolors8.default.bold("Lola (Code Agent):")}
|
|
4263
3390
|
lola install Instalar/atualizar Lola
|
|
4264
3391
|
lola suggest Sugerir melhoria (cria issue)
|
|
4265
3392
|
|
|
4266
|
-
${
|
|
4267
|
-
${
|
|
4268
|
-
${
|
|
4269
|
-
${
|
|
4270
|
-
${
|
|
4271
|
-
${
|
|
4272
|
-
${
|
|
4273
|
-
${
|
|
3393
|
+
${import_picocolors8.default.bold("Exemplos:")}
|
|
3394
|
+
${import_picocolors8.default.dim("$")} nimbus create my-landing --landing
|
|
3395
|
+
${import_picocolors8.default.dim("$")} nimbus create my-app --app
|
|
3396
|
+
${import_picocolors8.default.dim("$")} nimbus analyze ./my-project
|
|
3397
|
+
${import_picocolors8.default.dim("$")} nimbus upgrade --plan
|
|
3398
|
+
${import_picocolors8.default.dim("$")} nimbus update
|
|
3399
|
+
${import_picocolors8.default.dim("$")} nimbus setup node
|
|
3400
|
+
${import_picocolors8.default.dim("$")} nimbus lola install
|
|
4274
3401
|
`);
|
|
4275
3402
|
}
|
|
4276
3403
|
function showVersion() {
|
|
4277
3404
|
console.log(`${PACKAGE_NAME2} v${CURRENT_VERSION}`);
|
|
4278
3405
|
}
|
|
4279
3406
|
main().catch((err) => {
|
|
4280
|
-
console.error(
|
|
3407
|
+
console.error(import_picocolors8.default.red("Erro:"), err.message);
|
|
4281
3408
|
process.exit(1);
|
|
4282
3409
|
});
|