@nimbuslab/cli 0.13.5 → 0.14.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 +103 -25
- package/package.json +1 -1
- package/src/commands/create.ts +28 -18
- package/src/commands/lola.ts +87 -4
- package/src/index.ts +2 -2
package/dist/index.js
CHANGED
|
@@ -150,7 +150,7 @@ var require_src = __commonJS((exports, module) => {
|
|
|
150
150
|
var require_package = __commonJS((exports, module) => {
|
|
151
151
|
module.exports = {
|
|
152
152
|
name: "@nimbuslab/cli",
|
|
153
|
-
version: "0.
|
|
153
|
+
version: "0.14.0",
|
|
154
154
|
description: "CLI para criar projetos nimbuslab",
|
|
155
155
|
type: "module",
|
|
156
156
|
bin: {
|
|
@@ -1328,15 +1328,18 @@ async function promptConfig(initialName, flags) {
|
|
|
1328
1328
|
console.log();
|
|
1329
1329
|
console.log(import_picocolors3.default.dim(" nimbus-core: Motor para projetos externos (stealth mode)"));
|
|
1330
1330
|
console.log();
|
|
1331
|
-
const
|
|
1332
|
-
message: "Create
|
|
1333
|
-
|
|
1331
|
+
const repoOption = await ve({
|
|
1332
|
+
message: "Create repository for this project?",
|
|
1333
|
+
options: [
|
|
1334
|
+
{ value: "github", label: "GitHub (nimbuslab, private)", hint: "recommended" },
|
|
1335
|
+
{ value: "none", label: "No repository", hint: "just local" }
|
|
1336
|
+
]
|
|
1334
1337
|
});
|
|
1335
|
-
if (pD(
|
|
1336
|
-
return
|
|
1338
|
+
if (pD(repoOption))
|
|
1339
|
+
return repoOption;
|
|
1337
1340
|
const clientRepo = await he({
|
|
1338
|
-
message: "Client repo URL (
|
|
1339
|
-
placeholder: "git@github.com:client/repo.git"
|
|
1341
|
+
message: "Client repo URL (to clone in workspace):",
|
|
1342
|
+
placeholder: "git@github.com:client/repo.git ou Azure DevOps URL"
|
|
1340
1343
|
});
|
|
1341
1344
|
if (pD(clientRepo))
|
|
1342
1345
|
return clientRepo;
|
|
@@ -1346,7 +1349,7 @@ async function promptConfig(initialName, flags) {
|
|
|
1346
1349
|
monorepo: false,
|
|
1347
1350
|
git: true,
|
|
1348
1351
|
install: false,
|
|
1349
|
-
github:
|
|
1352
|
+
github: repoOption === "github",
|
|
1350
1353
|
githubOrg: "nimbuslab",
|
|
1351
1354
|
githubDescription: `nimbus-core for ${name} - external project`,
|
|
1352
1355
|
theme: "dark",
|
|
@@ -1359,7 +1362,8 @@ async function promptConfig(initialName, flags) {
|
|
|
1359
1362
|
railwayToken: "",
|
|
1360
1363
|
stagingUrl: "",
|
|
1361
1364
|
productionUrl: "",
|
|
1362
|
-
customTemplate:
|
|
1365
|
+
customTemplate: null,
|
|
1366
|
+
clientRepoUrl: clientRepo || null
|
|
1363
1367
|
};
|
|
1364
1368
|
}
|
|
1365
1369
|
let monorepo = false;
|
|
@@ -1688,11 +1692,17 @@ async function createProject(config) {
|
|
|
1688
1692
|
s.stop("Error cloning template");
|
|
1689
1693
|
throw new Error(`Failed to clone template ${templateRepo}. Check your connection or repository access.`);
|
|
1690
1694
|
}
|
|
1691
|
-
if (config.type === "nimbus-core" && config.
|
|
1692
|
-
const clientRepoUrl = config.
|
|
1695
|
+
if (config.type === "nimbus-core" && config.clientRepoUrl) {
|
|
1696
|
+
const clientRepoUrl = config.clientRepoUrl;
|
|
1693
1697
|
s.start(`Cloning client repo in workspace...`);
|
|
1694
1698
|
try {
|
|
1695
|
-
|
|
1699
|
+
let projectName = "client-project";
|
|
1700
|
+
if (clientRepoUrl.includes("visualstudio.com") || clientRepoUrl.includes("dev.azure.com")) {
|
|
1701
|
+
const parts = clientRepoUrl.split("/");
|
|
1702
|
+
projectName = parts[parts.length - 1] || "client-project";
|
|
1703
|
+
} else {
|
|
1704
|
+
projectName = clientRepoUrl.split("/").pop()?.replace(".git", "") || "client-project";
|
|
1705
|
+
}
|
|
1696
1706
|
await $2`git clone ${clientRepoUrl} ${config.name}/workspace/${projectName}`.quiet();
|
|
1697
1707
|
s.stop(`Client repo cloned: workspace/${projectName}`);
|
|
1698
1708
|
} catch (error) {
|
|
@@ -1870,13 +1880,8 @@ function showNextSteps(config) {
|
|
|
1870
1880
|
console.log();
|
|
1871
1881
|
console.log(import_picocolors3.default.dim(" nimbus-core: Motor para projetos externos"));
|
|
1872
1882
|
console.log();
|
|
1873
|
-
console.log(import_picocolors3.default.dim(" Para clonar repo do cliente:"));
|
|
1874
|
-
console.log(` ${import_picocolors3.default.cyan("cd")} workspace`);
|
|
1875
|
-
console.log(` ${import_picocolors3.default.cyan("git clone")} <repo-do-cliente>`);
|
|
1876
|
-
console.log();
|
|
1877
1883
|
console.log(import_picocolors3.default.dim(" Para usar a Lola:"));
|
|
1878
|
-
console.log(` ${import_picocolors3.default.cyan("
|
|
1879
|
-
console.log(` ${import_picocolors3.default.cyan("claude --append-system-prompt-file .claude/agents/lola.md")}`);
|
|
1884
|
+
console.log(` ${import_picocolors3.default.cyan("lola")}`);
|
|
1880
1885
|
console.log();
|
|
1881
1886
|
console.log(import_picocolors3.default.yellow(" STEALTH MODE: Commits sem mencao a nimbuslab/Lola/IA"));
|
|
1882
1887
|
console.log();
|
|
@@ -2475,6 +2480,53 @@ var HOME = homedir();
|
|
|
2475
2480
|
var LOLA_DIR = join3(HOME, ".lola");
|
|
2476
2481
|
var LOLA_REPO = "git@github.com:nimbuslab/lola.git";
|
|
2477
2482
|
var USER_MEMORY = join3(HOME, ".claude", "USER_MEMORY.md");
|
|
2483
|
+
var LOLA_MEMORY_URL = "https://lola.nimbuslab.com.br/sse";
|
|
2484
|
+
var LOLA_MEMORY_NAME = "lola-memory";
|
|
2485
|
+
async function installLolaMemoryMCP() {
|
|
2486
|
+
console.log();
|
|
2487
|
+
console.log(import_picocolors7.default.cyan(" Configurando lola-memory MCP..."));
|
|
2488
|
+
const claudeCheck = Bun.spawnSync(["which", "claude"], { stdout: "pipe" });
|
|
2489
|
+
if (claudeCheck.exitCode !== 0) {
|
|
2490
|
+
console.log(import_picocolors7.default.yellow(" Claude CLI nao encontrado, pulando MCP"));
|
|
2491
|
+
console.log(import_picocolors7.default.dim(" Instale o Claude CLI e rode 'nimbus lola install' novamente"));
|
|
2492
|
+
return;
|
|
2493
|
+
}
|
|
2494
|
+
const mcpList = Bun.spawnSync(["claude", "mcp", "list"], { stdout: "pipe", stderr: "pipe" });
|
|
2495
|
+
const mcpOutput = mcpList.stdout.toString();
|
|
2496
|
+
if (mcpOutput.includes(LOLA_MEMORY_NAME)) {
|
|
2497
|
+
console.log(import_picocolors7.default.green(" MCP lola-memory ja configurado"));
|
|
2498
|
+
return;
|
|
2499
|
+
}
|
|
2500
|
+
console.log(import_picocolors7.default.dim(" Adicionando MCP lola-memory..."));
|
|
2501
|
+
const result = Bun.spawnSync([
|
|
2502
|
+
"claude",
|
|
2503
|
+
"mcp",
|
|
2504
|
+
"add",
|
|
2505
|
+
"-t",
|
|
2506
|
+
"sse",
|
|
2507
|
+
"-s",
|
|
2508
|
+
"user",
|
|
2509
|
+
LOLA_MEMORY_NAME,
|
|
2510
|
+
"--",
|
|
2511
|
+
"bunx",
|
|
2512
|
+
"mcp-remote",
|
|
2513
|
+
LOLA_MEMORY_URL
|
|
2514
|
+
], {
|
|
2515
|
+
stdout: "inherit",
|
|
2516
|
+
stderr: "inherit"
|
|
2517
|
+
});
|
|
2518
|
+
if (result.exitCode !== 0) {
|
|
2519
|
+
console.log(import_picocolors7.default.yellow(" Erro ao adicionar MCP, pode ser adicionado manualmente:"));
|
|
2520
|
+
console.log(import_picocolors7.default.dim(` claude mcp add -t sse -s user ${LOLA_MEMORY_NAME} -- bunx mcp-remote ${LOLA_MEMORY_URL}`));
|
|
2521
|
+
return;
|
|
2522
|
+
}
|
|
2523
|
+
console.log(import_picocolors7.default.green(" MCP lola-memory instalado!"));
|
|
2524
|
+
console.log();
|
|
2525
|
+
console.log(import_picocolors7.default.dim(" Comandos disponiveis:"));
|
|
2526
|
+
console.log(import_picocolors7.default.dim(' remember "query" - Buscar conhecimento'));
|
|
2527
|
+
console.log(import_picocolors7.default.dim(' learn "content" - Salvar conhecimento'));
|
|
2528
|
+
console.log(import_picocolors7.default.dim(" memory_stats - Ver estatisticas"));
|
|
2529
|
+
}
|
|
2478
2530
|
async function installLola() {
|
|
2479
2531
|
console.log();
|
|
2480
2532
|
console.log(import_picocolors7.default.cyan(" Lola - Code Agent da nimbuslab"));
|
|
@@ -2596,10 +2648,17 @@ fi
|
|
|
2596
2648
|
console.log(import_picocolors7.default.green(" Script lola ja existe"));
|
|
2597
2649
|
}
|
|
2598
2650
|
}
|
|
2651
|
+
await installLolaMemoryMCP();
|
|
2599
2652
|
const claudeDir = join3(HOME, ".claude");
|
|
2600
2653
|
if (!existsSync2(USER_MEMORY)) {
|
|
2601
2654
|
console.log();
|
|
2602
|
-
console.log(import_picocolors7.default.cyan("
|
|
2655
|
+
console.log(import_picocolors7.default.cyan(" Configurando USER_MEMORY.md..."));
|
|
2656
|
+
const gitUserResult = Bun.spawnSync(["git", "config", "user.name"], { stdout: "pipe" });
|
|
2657
|
+
const gitEmailResult = Bun.spawnSync(["git", "config", "user.email"], { stdout: "pipe" });
|
|
2658
|
+
const gitUser = gitUserResult.stdout.toString().trim() || "Dev";
|
|
2659
|
+
const gitEmail = gitEmailResult.stdout.toString().trim() || "";
|
|
2660
|
+
const hostname = process.env.HOSTNAME || process.env.COMPUTERNAME || "local";
|
|
2661
|
+
const today = new Date().toISOString().split("T")[0];
|
|
2603
2662
|
await Bun.$`mkdir -p ${claudeDir}`;
|
|
2604
2663
|
const content = `# User Memory
|
|
2605
2664
|
|
|
@@ -2607,6 +2666,15 @@ Memoria persistente para sessoes Claude Code
|
|
|
2607
2666
|
|
|
2608
2667
|
---
|
|
2609
2668
|
|
|
2669
|
+
## Dev
|
|
2670
|
+
|
|
2671
|
+
**Nome:** ${gitUser}
|
|
2672
|
+
**Email:** ${gitEmail}
|
|
2673
|
+
**Maquina:** ${hostname}
|
|
2674
|
+
**Instalacao:** ${today}
|
|
2675
|
+
|
|
2676
|
+
---
|
|
2677
|
+
|
|
2610
2678
|
## Configuracoes da Lola
|
|
2611
2679
|
|
|
2612
2680
|
\`\`\`
|
|
@@ -2622,14 +2690,18 @@ lola_profile: millennial
|
|
|
2622
2690
|
---
|
|
2623
2691
|
`;
|
|
2624
2692
|
await Bun.write(USER_MEMORY, content);
|
|
2625
|
-
console.log(import_picocolors7.default.green(
|
|
2693
|
+
console.log(import_picocolors7.default.green(` USER_MEMORY.md criado para ${gitUser}!`));
|
|
2626
2694
|
}
|
|
2627
2695
|
console.log();
|
|
2628
2696
|
console.log(import_picocolors7.default.green(" Instalacao concluida!"));
|
|
2629
2697
|
console.log();
|
|
2630
2698
|
console.log(import_picocolors7.default.bold(" Para usar a Lola:"));
|
|
2631
2699
|
console.log(import_picocolors7.default.dim(" lola ") + import_picocolors7.default.white("# Iniciar sessao"));
|
|
2632
|
-
console.log(
|
|
2700
|
+
console.log();
|
|
2701
|
+
console.log(import_picocolors7.default.bold(" lola-memory (conhecimento compartilhado):"));
|
|
2702
|
+
console.log(import_picocolors7.default.dim(' remember "query" ') + import_picocolors7.default.white("# Buscar conhecimento"));
|
|
2703
|
+
console.log(import_picocolors7.default.dim(' learn "content" ') + import_picocolors7.default.white("# Salvar conhecimento"));
|
|
2704
|
+
console.log(import_picocolors7.default.dim(" memory_stats ") + import_picocolors7.default.white("# Ver estatisticas"));
|
|
2633
2705
|
console.log();
|
|
2634
2706
|
console.log(import_picocolors7.default.bold(" Para mudar perfil, edite ~/.claude/USER_MEMORY.md:"));
|
|
2635
2707
|
console.log(import_picocolors7.default.dim(" lola_profile: millennial|genz|profissional|nerd|chill"));
|
|
@@ -2981,7 +3053,7 @@ function showLolaHelp() {
|
|
|
2981
3053
|
console.log(import_picocolors7.default.bold(" Uso:") + " nimbus lola [subcomando]");
|
|
2982
3054
|
console.log();
|
|
2983
3055
|
console.log(import_picocolors7.default.bold(" Subcomandos:"));
|
|
2984
|
-
console.log(import_picocolors7.default.dim(" install ") + import_picocolors7.default.white("Instalar/atualizar Lola"));
|
|
3056
|
+
console.log(import_picocolors7.default.dim(" install ") + import_picocolors7.default.white("Instalar/atualizar Lola + MCP"));
|
|
2985
3057
|
console.log(import_picocolors7.default.dim(" sync ") + import_picocolors7.default.white("Alias para install"));
|
|
2986
3058
|
console.log(import_picocolors7.default.dim(" onboard ") + import_picocolors7.default.white("Configurar perfil (novos devs)"));
|
|
2987
3059
|
console.log(import_picocolors7.default.dim(" quiz ") + import_picocolors7.default.white("Quiz sobre a nimbuslab"));
|
|
@@ -2994,6 +3066,12 @@ function showLolaHelp() {
|
|
|
2994
3066
|
console.log(import_picocolors7.default.dim(" $ nimbus lola quiz"));
|
|
2995
3067
|
console.log(import_picocolors7.default.dim(' $ nimbus lola suggest "adicionar suporte a X"'));
|
|
2996
3068
|
console.log();
|
|
3069
|
+
console.log(import_picocolors7.default.bold(" lola-memory (dentro do Claude):"));
|
|
3070
|
+
console.log(import_picocolors7.default.dim(' remember "query" ') + import_picocolors7.default.white("Buscar conhecimento"));
|
|
3071
|
+
console.log(import_picocolors7.default.dim(' learn "content" ') + import_picocolors7.default.white("Salvar conhecimento"));
|
|
3072
|
+
console.log(import_picocolors7.default.dim(" memory_stats ") + import_picocolors7.default.white("Ver estatisticas"));
|
|
3073
|
+
console.log(import_picocolors7.default.dim(" get_context ") + import_picocolors7.default.white("Perfil + memorias recentes"));
|
|
3074
|
+
console.log();
|
|
2997
3075
|
}
|
|
2998
3076
|
|
|
2999
3077
|
// src/index.ts
|
|
@@ -3036,8 +3114,8 @@ function showUpdateNotice(latestVersion) {
|
|
|
3036
3114
|
const maxLen = Math.max(line1.length, line2.length);
|
|
3037
3115
|
const border = "\u2500".repeat(maxLen + 2);
|
|
3038
3116
|
console.log(import_picocolors8.default.yellow(` \u250C${border}\u2510`));
|
|
3039
|
-
console.log(import_picocolors8.default.yellow(` \u2502`) + import_picocolors8.default.white(line1.padEnd(maxLen +
|
|
3040
|
-
console.log(import_picocolors8.default.yellow(` \u2502`) + import_picocolors8.default.cyan(line2.padEnd(maxLen +
|
|
3117
|
+
console.log(import_picocolors8.default.yellow(` \u2502`) + import_picocolors8.default.white(line1.padEnd(maxLen + 2)) + import_picocolors8.default.yellow(`\u2502`));
|
|
3118
|
+
console.log(import_picocolors8.default.yellow(` \u2502`) + import_picocolors8.default.cyan(line2.padEnd(maxLen + 2)) + import_picocolors8.default.yellow(`\u2502`));
|
|
3041
3119
|
console.log(import_picocolors8.default.yellow(` \u2514${border}\u2518`));
|
|
3042
3120
|
console.log();
|
|
3043
3121
|
}
|
package/package.json
CHANGED
package/src/commands/create.ts
CHANGED
|
@@ -196,6 +196,8 @@ interface ProjectConfig {
|
|
|
196
196
|
productionUrl: string
|
|
197
197
|
// Template customizado
|
|
198
198
|
customTemplate: string | null
|
|
199
|
+
// nimbus-core: URL do repo do cliente
|
|
200
|
+
clientRepoUrl?: string | null
|
|
199
201
|
}
|
|
200
202
|
|
|
201
203
|
interface CreateFlags {
|
|
@@ -547,17 +549,20 @@ async function promptConfig(initialName?: string, flags?: CreateFlags): Promise<
|
|
|
547
549
|
console.log(pc.dim(" nimbus-core: Motor para projetos externos (stealth mode)"))
|
|
548
550
|
console.log()
|
|
549
551
|
|
|
550
|
-
//
|
|
551
|
-
const
|
|
552
|
-
message: "Create
|
|
553
|
-
|
|
552
|
+
// Perguntar se quer criar repo (GitHub ou nenhum)
|
|
553
|
+
const repoOption = await p.select({
|
|
554
|
+
message: "Create repository for this project?",
|
|
555
|
+
options: [
|
|
556
|
+
{ value: "github", label: "GitHub (nimbuslab, private)", hint: "recommended" },
|
|
557
|
+
{ value: "none", label: "No repository", hint: "just local" },
|
|
558
|
+
],
|
|
554
559
|
})
|
|
555
|
-
if (p.isCancel(
|
|
560
|
+
if (p.isCancel(repoOption)) return repoOption
|
|
556
561
|
|
|
557
562
|
// Perguntar URL do repo do cliente para clonar no workspace
|
|
558
563
|
const clientRepo = await p.text({
|
|
559
|
-
message: "Client repo URL (
|
|
560
|
-
placeholder: "git@github.com:client/repo.git",
|
|
564
|
+
message: "Client repo URL (to clone in workspace):",
|
|
565
|
+
placeholder: "git@github.com:client/repo.git ou Azure DevOps URL",
|
|
561
566
|
})
|
|
562
567
|
if (p.isCancel(clientRepo)) return clientRepo
|
|
563
568
|
|
|
@@ -567,7 +572,7 @@ async function promptConfig(initialName?: string, flags?: CreateFlags): Promise<
|
|
|
567
572
|
monorepo: false,
|
|
568
573
|
git: true, // sempre init git
|
|
569
574
|
install: false, // nimbus-core não tem package.json
|
|
570
|
-
github:
|
|
575
|
+
github: repoOption === "github",
|
|
571
576
|
githubOrg: "nimbuslab", // sempre na org nimbuslab
|
|
572
577
|
githubDescription: `nimbus-core for ${name} - external project`,
|
|
573
578
|
theme: "dark" as const,
|
|
@@ -580,7 +585,8 @@ async function promptConfig(initialName?: string, flags?: CreateFlags): Promise<
|
|
|
580
585
|
railwayToken: "",
|
|
581
586
|
stagingUrl: "",
|
|
582
587
|
productionUrl: "",
|
|
583
|
-
customTemplate:
|
|
588
|
+
customTemplate: null, // não usa template customizado
|
|
589
|
+
clientRepoUrl: (clientRepo as string) || null, // URL do cliente separada
|
|
584
590
|
}
|
|
585
591
|
}
|
|
586
592
|
|
|
@@ -972,11 +978,20 @@ async function createProject(config: ProjectConfig) {
|
|
|
972
978
|
}
|
|
973
979
|
|
|
974
980
|
// nimbus-core: clone client repo in workspace if provided
|
|
975
|
-
if (config.type === "nimbus-core" && config.
|
|
976
|
-
const clientRepoUrl = config.
|
|
981
|
+
if (config.type === "nimbus-core" && config.clientRepoUrl) {
|
|
982
|
+
const clientRepoUrl = config.clientRepoUrl
|
|
977
983
|
s.start(`Cloning client repo in workspace...`)
|
|
978
984
|
try {
|
|
979
|
-
|
|
985
|
+
// Extrair nome do projeto da URL (funciona com GitHub, GitLab, Azure DevOps)
|
|
986
|
+
let projectName = "client-project"
|
|
987
|
+
if (clientRepoUrl.includes("visualstudio.com") || clientRepoUrl.includes("dev.azure.com")) {
|
|
988
|
+
// Azure DevOps: serel@vs-ssh.visualstudio.com:v3/serel/Project/Repo
|
|
989
|
+
const parts = clientRepoUrl.split("/")
|
|
990
|
+
projectName = parts[parts.length - 1] || "client-project"
|
|
991
|
+
} else {
|
|
992
|
+
// GitHub/GitLab: git@github.com:org/repo.git
|
|
993
|
+
projectName = clientRepoUrl.split("/").pop()?.replace(".git", "") || "client-project"
|
|
994
|
+
}
|
|
980
995
|
await $`git clone ${clientRepoUrl} ${config.name}/workspace/${projectName}`.quiet()
|
|
981
996
|
s.stop(`Client repo cloned: workspace/${projectName}`)
|
|
982
997
|
} catch (error) {
|
|
@@ -1204,13 +1219,8 @@ function showNextSteps(config: ProjectConfig) {
|
|
|
1204
1219
|
console.log()
|
|
1205
1220
|
console.log(pc.dim(" nimbus-core: Motor para projetos externos"))
|
|
1206
1221
|
console.log()
|
|
1207
|
-
console.log(pc.dim(" Para clonar repo do cliente:"))
|
|
1208
|
-
console.log(` ${pc.cyan("cd")} workspace`)
|
|
1209
|
-
console.log(` ${pc.cyan("git clone")} <repo-do-cliente>`)
|
|
1210
|
-
console.log()
|
|
1211
1222
|
console.log(pc.dim(" Para usar a Lola:"))
|
|
1212
|
-
console.log(` ${pc.cyan("
|
|
1213
|
-
console.log(` ${pc.cyan("claude --append-system-prompt-file .claude/agents/lola.md")}`)
|
|
1223
|
+
console.log(` ${pc.cyan("lola")}`)
|
|
1214
1224
|
console.log()
|
|
1215
1225
|
console.log(pc.yellow(" STEALTH MODE: Commits sem mencao a nimbuslab/Lola/IA"))
|
|
1216
1226
|
console.log()
|
package/src/commands/lola.ts
CHANGED
|
@@ -8,6 +8,58 @@ const HOME = homedir()
|
|
|
8
8
|
const LOLA_DIR = join(HOME, ".lola")
|
|
9
9
|
const LOLA_REPO = "git@github.com:nimbuslab/lola.git"
|
|
10
10
|
const USER_MEMORY = join(HOME, ".claude", "USER_MEMORY.md")
|
|
11
|
+
const LOLA_MEMORY_URL = "https://lola.nimbuslab.com.br/sse"
|
|
12
|
+
const LOLA_MEMORY_NAME = "lola-memory"
|
|
13
|
+
|
|
14
|
+
async function installLolaMemoryMCP(): Promise<void> {
|
|
15
|
+
console.log()
|
|
16
|
+
console.log(pc.cyan(" Configurando lola-memory MCP..."))
|
|
17
|
+
|
|
18
|
+
// Verificar se claude CLI existe
|
|
19
|
+
const claudeCheck = Bun.spawnSync(["which", "claude"], { stdout: "pipe" })
|
|
20
|
+
if (claudeCheck.exitCode !== 0) {
|
|
21
|
+
console.log(pc.yellow(" Claude CLI nao encontrado, pulando MCP"))
|
|
22
|
+
console.log(pc.dim(" Instale o Claude CLI e rode 'nimbus lola install' novamente"))
|
|
23
|
+
return
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Verificar se MCP já está configurado
|
|
27
|
+
const mcpList = Bun.spawnSync(["claude", "mcp", "list"], { stdout: "pipe", stderr: "pipe" })
|
|
28
|
+
const mcpOutput = mcpList.stdout.toString()
|
|
29
|
+
|
|
30
|
+
if (mcpOutput.includes(LOLA_MEMORY_NAME)) {
|
|
31
|
+
console.log(pc.green(" MCP lola-memory ja configurado"))
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Adicionar MCP lola-memory
|
|
36
|
+
console.log(pc.dim(" Adicionando MCP lola-memory..."))
|
|
37
|
+
|
|
38
|
+
const result = Bun.spawnSync([
|
|
39
|
+
"claude", "mcp", "add",
|
|
40
|
+
"-t", "sse",
|
|
41
|
+
"-s", "user",
|
|
42
|
+
LOLA_MEMORY_NAME,
|
|
43
|
+
"--",
|
|
44
|
+
"bunx", "mcp-remote", LOLA_MEMORY_URL
|
|
45
|
+
], {
|
|
46
|
+
stdout: "inherit",
|
|
47
|
+
stderr: "inherit",
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
if (result.exitCode !== 0) {
|
|
51
|
+
console.log(pc.yellow(" Erro ao adicionar MCP, pode ser adicionado manualmente:"))
|
|
52
|
+
console.log(pc.dim(` claude mcp add -t sse -s user ${LOLA_MEMORY_NAME} -- bunx mcp-remote ${LOLA_MEMORY_URL}`))
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
console.log(pc.green(" MCP lola-memory instalado!"))
|
|
57
|
+
console.log()
|
|
58
|
+
console.log(pc.dim(" Comandos disponiveis:"))
|
|
59
|
+
console.log(pc.dim(" remember \"query\" - Buscar conhecimento"))
|
|
60
|
+
console.log(pc.dim(" learn \"content\" - Salvar conhecimento"))
|
|
61
|
+
console.log(pc.dim(" memory_stats - Ver estatisticas"))
|
|
62
|
+
}
|
|
11
63
|
|
|
12
64
|
async function installLola(): Promise<void> {
|
|
13
65
|
console.log()
|
|
@@ -162,11 +214,23 @@ fi
|
|
|
162
214
|
}
|
|
163
215
|
}
|
|
164
216
|
|
|
217
|
+
// Instalar MCP lola-memory
|
|
218
|
+
await installLolaMemoryMCP()
|
|
219
|
+
|
|
165
220
|
// Verificar USER_MEMORY.md
|
|
166
221
|
const claudeDir = join(HOME, ".claude")
|
|
167
222
|
if (!existsSync(USER_MEMORY)) {
|
|
168
223
|
console.log()
|
|
169
|
-
console.log(pc.cyan("
|
|
224
|
+
console.log(pc.cyan(" Configurando USER_MEMORY.md..."))
|
|
225
|
+
|
|
226
|
+
// Pegar info do git automaticamente
|
|
227
|
+
const gitUserResult = Bun.spawnSync(["git", "config", "user.name"], { stdout: "pipe" })
|
|
228
|
+
const gitEmailResult = Bun.spawnSync(["git", "config", "user.email"], { stdout: "pipe" })
|
|
229
|
+
|
|
230
|
+
const gitUser = gitUserResult.stdout.toString().trim() || "Dev"
|
|
231
|
+
const gitEmail = gitEmailResult.stdout.toString().trim() || ""
|
|
232
|
+
const hostname = process.env.HOSTNAME || process.env.COMPUTERNAME || "local"
|
|
233
|
+
const today = new Date().toISOString().split("T")[0]
|
|
170
234
|
|
|
171
235
|
await Bun.$`mkdir -p ${claudeDir}`
|
|
172
236
|
|
|
@@ -176,6 +240,15 @@ Memoria persistente para sessoes Claude Code
|
|
|
176
240
|
|
|
177
241
|
---
|
|
178
242
|
|
|
243
|
+
## Dev
|
|
244
|
+
|
|
245
|
+
**Nome:** ${gitUser}
|
|
246
|
+
**Email:** ${gitEmail}
|
|
247
|
+
**Maquina:** ${hostname}
|
|
248
|
+
**Instalacao:** ${today}
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
179
252
|
## Configuracoes da Lola
|
|
180
253
|
|
|
181
254
|
\`\`\`
|
|
@@ -191,7 +264,7 @@ lola_profile: millennial
|
|
|
191
264
|
---
|
|
192
265
|
`
|
|
193
266
|
await Bun.write(USER_MEMORY, content)
|
|
194
|
-
console.log(pc.green(
|
|
267
|
+
console.log(pc.green(` USER_MEMORY.md criado para ${gitUser}!`))
|
|
195
268
|
}
|
|
196
269
|
|
|
197
270
|
console.log()
|
|
@@ -199,7 +272,11 @@ lola_profile: millennial
|
|
|
199
272
|
console.log()
|
|
200
273
|
console.log(pc.bold(" Para usar a Lola:"))
|
|
201
274
|
console.log(pc.dim(" lola ") + pc.white("# Iniciar sessao"))
|
|
202
|
-
console.log(
|
|
275
|
+
console.log()
|
|
276
|
+
console.log(pc.bold(" lola-memory (conhecimento compartilhado):"))
|
|
277
|
+
console.log(pc.dim(" remember \"query\" ") + pc.white("# Buscar conhecimento"))
|
|
278
|
+
console.log(pc.dim(" learn \"content\" ") + pc.white("# Salvar conhecimento"))
|
|
279
|
+
console.log(pc.dim(" memory_stats ") + pc.white("# Ver estatisticas"))
|
|
203
280
|
console.log()
|
|
204
281
|
console.log(pc.bold(" Para mudar perfil, edite ~/.claude/USER_MEMORY.md:"))
|
|
205
282
|
console.log(pc.dim(" lola_profile: millennial|genz|profissional|nerd|chill"))
|
|
@@ -602,7 +679,7 @@ function showLolaHelp() {
|
|
|
602
679
|
console.log(pc.bold(" Uso:") + " nimbus lola [subcomando]")
|
|
603
680
|
console.log()
|
|
604
681
|
console.log(pc.bold(" Subcomandos:"))
|
|
605
|
-
console.log(pc.dim(" install ") + pc.white("Instalar/atualizar Lola"))
|
|
682
|
+
console.log(pc.dim(" install ") + pc.white("Instalar/atualizar Lola + MCP"))
|
|
606
683
|
console.log(pc.dim(" sync ") + pc.white("Alias para install"))
|
|
607
684
|
console.log(pc.dim(" onboard ") + pc.white("Configurar perfil (novos devs)"))
|
|
608
685
|
console.log(pc.dim(" quiz ") + pc.white("Quiz sobre a nimbuslab"))
|
|
@@ -615,4 +692,10 @@ function showLolaHelp() {
|
|
|
615
692
|
console.log(pc.dim(" $ nimbus lola quiz"))
|
|
616
693
|
console.log(pc.dim(" $ nimbus lola suggest \"adicionar suporte a X\""))
|
|
617
694
|
console.log()
|
|
695
|
+
console.log(pc.bold(" lola-memory (dentro do Claude):"))
|
|
696
|
+
console.log(pc.dim(" remember \"query\" ") + pc.white("Buscar conhecimento"))
|
|
697
|
+
console.log(pc.dim(" learn \"content\" ") + pc.white("Salvar conhecimento"))
|
|
698
|
+
console.log(pc.dim(" memory_stats ") + pc.white("Ver estatisticas"))
|
|
699
|
+
console.log(pc.dim(" get_context ") + pc.white("Perfil + memorias recentes"))
|
|
700
|
+
console.log()
|
|
618
701
|
}
|
package/src/index.ts
CHANGED
|
@@ -58,8 +58,8 @@ function showUpdateNotice(latestVersion: string) {
|
|
|
58
58
|
const border = "─".repeat(maxLen + 2)
|
|
59
59
|
|
|
60
60
|
console.log(pc.yellow(` ┌${border}┐`))
|
|
61
|
-
console.log(pc.yellow(` │`) + pc.white(line1.padEnd(maxLen +
|
|
62
|
-
console.log(pc.yellow(` │`) + pc.cyan(line2.padEnd(maxLen +
|
|
61
|
+
console.log(pc.yellow(` │`) + pc.white(line1.padEnd(maxLen + 2)) + pc.yellow(`│`))
|
|
62
|
+
console.log(pc.yellow(` │`) + pc.cyan(line2.padEnd(maxLen + 2)) + pc.yellow(`│`))
|
|
63
63
|
console.log(pc.yellow(` └${border}┘`))
|
|
64
64
|
console.log()
|
|
65
65
|
}
|