ozali 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -137,7 +137,8 @@ interactivo te pregunta (default sí), y con `--yes` lo instala automáticamente
137
137
  descarga el **binario precompilado** correcto según tu arquitectura (amd64/arm64) a `~/.local/bin`
138
138
  (sin sudo); en **macOS** usa brew → `go install` con el binario como fallback; en **Windows**
139
139
  usa `go install`. Si algún paso falla, imprime instrucciones específicas de tu SO. Si prefieres no
140
- instalarlo, pasa `--no-engram` (arranca en modo `docs`). Opcionalmente habilita **Engram Cloud**
140
+ instalarlo, pasa `--no-engram` (arranca en modo `docs`). Más tarde puedes instalarlo con
141
+ `ozali install-engram` bajo demanda. Opcionalmente habilita **Engram Cloud**
141
142
  (réplica de equipo opt-in) además del git-sync.
142
143
 
143
144
  `init` también crea **ozali-jarvis**, un **orquestador always-on**: persona en `CLAUDE.md`/`AGENTS.md`
package/cli/bin/ozali.mjs CHANGED
@@ -3,7 +3,7 @@
3
3
  // Seguridad: sin dependencias ni scripts de instalación. Ejecuta seguro con
4
4
  // `pnpm dlx ozali` o `npx --ignore-scripts ozali`. Ver docs/security.md.
5
5
  import { c, err, pkgVersion } from "../lib/util.mjs";
6
- import { init, doctor, update, sync, audit, cloud, workspace } from "../lib/commands.mjs";
6
+ import { init, doctor, update, sync, audit, cloud, workspace, installEngramCmd } from "../lib/commands.mjs";
7
7
 
8
8
  const HELP = `
9
9
  ${c.bold("ozali")} ${c.dim("v" + pkgVersion())} — bootstrap de IA por equipo (TDD/SDD + memoria Engram)
@@ -14,6 +14,9 @@ ${c.bold("Uso:")}
14
14
  ${c.bold("Comandos:")}
15
15
  init Detecta el agente (Claude Code/opencode), instala las skills ozali y
16
16
  ozali-commit, aísla el histórico, configura Engram y el repo de conocimiento.
17
+ install-engram
18
+ Instala (o reinstala) Engram bajo demanda, registra su MCP en el agente
19
+ y activa modo hybrid. Úsalo cuando saltaste la instalación en init.
17
20
  workspace Multi-repo: escanea los repos de la carpeta raíz, remedia los que no tienen
18
21
  ozali init, guía la calibración y escribe la config para trabajar en conjunto.
19
22
  Con --doctor / --update opera sobre TODOS los repos miembros desde la raíz.
@@ -64,6 +67,7 @@ function parseArgs(argv) {
64
67
  else if (a === "--push") opts.push = true;
65
68
  else if (a === "--cloud") opts.cloud = true;
66
69
  else if (a === "--obsidian") opts.obsidian = true;
70
+ else if (a === "--force") opts.force = true;
67
71
  else if (a === "--no-engram") opts.noEngram = true;
68
72
  else if (a === "--no-trust") opts.noTrust = true;
69
73
  else if (a === "--no-jarvis") opts.noJarvis = true;
@@ -105,6 +109,7 @@ async function main() {
105
109
  case "sync": return await sync(cwd, opts);
106
110
  case "audit": return await audit(cwd, opts);
107
111
  case "cloud": return await cloud(cwd, opts);
112
+ case "install-engram": return await installEngramCmd(cwd, opts);
108
113
  default:
109
114
  err(`comando desconocido "${cmd}". Usa ${c.bold("ozali --help")}.`);
110
115
  return 1;
@@ -1395,6 +1395,83 @@ function cdkCanonicalVersion() {
1395
1395
  }
1396
1396
  }
1397
1397
 
1398
+ // =========================================================== install-engram ===
1399
+ export async function installEngramCmd(cwd, opts) {
1400
+ step("ozali install-engram — instalar o reparar Engram bajo demanda");
1401
+ const env = detectAll(cwd);
1402
+ const cfg = readJSON(CONFIG_PATH(cwd));
1403
+ let needsInstall = !env.engram.available;
1404
+
1405
+ if (env.engram.available) {
1406
+ const online = tryExec("engram", ["doctor"], { cwd }) !== null;
1407
+ if (online && !opts.force) {
1408
+ ok(`Engram ya está instalado y responde (${env.engram.bin}).`);
1409
+ info("Usa --force si quieres forzar una reinstalación.");
1410
+ } else if (online && opts.force) {
1411
+ warn("Forzando reinstalación de Engram (--force)…");
1412
+ needsInstall = true;
1413
+ } else {
1414
+ warn("Engram está en PATH pero no responde (engram doctor falló). Reinstalando…");
1415
+ needsInstall = true;
1416
+ }
1417
+ }
1418
+
1419
+ if (needsInstall) {
1420
+ if (opts.dryRun) {
1421
+ info("(dry-run) Aquí instalaría Engram.");
1422
+ return 0;
1423
+ }
1424
+ const installed = installEngram();
1425
+ if (!installed) {
1426
+ warn("No se pudo instalar Engram automáticamente.");
1427
+ printEngramManualInstructions(cfg?.agent || "both");
1428
+ return 1;
1429
+ }
1430
+ }
1431
+
1432
+ // Configurar agente MCP
1433
+ let agent = opts.agent || (cfg && cfg.agent);
1434
+ if (!agent && !opts.yes) {
1435
+ agent = await select("¿Para qué agente configuro Engram?", [
1436
+ { value: "claude-code", label: "Claude Code" },
1437
+ { value: "opencode", label: "opencode" },
1438
+ { value: "both", label: "Ambos" },
1439
+ ], 2);
1440
+ } else if (!agent) {
1441
+ agent = "both";
1442
+ }
1443
+
1444
+ if (agent === "claude-code" || agent === "both") {
1445
+ info("Registrando MCP en Claude Code…");
1446
+ spawnCmd("engram", ["setup", "claude-code"]);
1447
+ }
1448
+ if (agent === "opencode" || agent === "both") {
1449
+ info("Registrando MCP en opencode…");
1450
+ spawnCmd("engram", ["setup", "opencode"]);
1451
+ }
1452
+
1453
+ // Actualizar config de ozali si existe
1454
+ if (cfg) {
1455
+ let wrote = false;
1456
+ if (cfg.memoryMode === "docs") {
1457
+ cfg.memoryMode = "hybrid";
1458
+ wrote = true;
1459
+ ok("Modo de memoria actualizado a " + c.bold("hybrid") + " en .ozali/config.json.");
1460
+ }
1461
+ if (!cfg.agent) {
1462
+ cfg.agent = agent;
1463
+ wrote = true;
1464
+ }
1465
+ if (wrote) writeJSON(CONFIG_PATH(cwd), cfg);
1466
+ } else {
1467
+ warn("No hay configuración de ozali en esta ruta (corre " + c.bold("ozali init") + " para completar el setup).");
1468
+ info("Engram quedó instalado; solo falta el config de ozali para integrarlo al flujo.");
1469
+ }
1470
+
1471
+ ok("Engram listo. Reinicia tu agente para que cargue el servidor MCP de Engram.");
1472
+ return 0;
1473
+ }
1474
+
1398
1475
  // ============================================================= sync ===========
1399
1476
  export async function sync(cwd, opts) {
1400
1477
  step(`ozali sync${opts.import ? " --import" : ""}${opts.cloud ? " --cloud" : ""} — histórico ↔ repo de conocimiento`);
@@ -81,11 +81,11 @@ Lleva el histórico y la memoria al repo de conocimiento del equipo. Tus compañ
81
81
  | Comando | Qué hace |
82
82
  |---|---|
83
83
  | `ozali init` | Prepara el proyecto (lo corres una vez por repo). |
84
+ | `ozali install-engram` | Instala (o reinstala) Engram y registra su MCP cuando saltaste la instalación en `init`. |
84
85
  | `ozali workspace` | Configura varios repos de una carpeta para trabajar en conjunto (lo corres en la carpeta raíz). |
85
86
  | `ozali doctor` | Revisa que todo esté bien. Es solo lectura, no cambia nada. |
86
87
  | `ozali update` | Actualiza skill ozali + ozali-jarvis + permisos (y guía cómo regenerar cdk). |
87
88
  | `ozali sync` | Sube el histórico/memoria al repo de equipo. |
88
- | `ozali sync --import` | Baja lo que el equipo ya guardó. |
89
89
  | `ozali audit` | Navega/audita la memoria de Engram (qué se ha hecho). |
90
90
 
91
91
  ¿Algo no funciona? Corre **`ozali doctor`** primero: te dice qué falta y cómo arreglarlo.
@@ -146,8 +146,8 @@ no puede, te deja las instrucciones. Con Engram, tu agente **recuerda** decision
146
146
  convenciones — y los recupera en futuras sesiones.
147
147
 
148
148
  ¿No quieres Engram ahora? Pasa `--no-engram` y ozali arranca en modo `docs` (la memoria se queda en
149
- documentos legibles). Cuando quieras activarlo, instálalo y corre `ozali doctor`: el modo sube a
150
- `hybrid` solo.
149
+ documentos legibles). Cuando quieras activarlo, corre `ozali install-engram` lo instala, configura
150
+ el MCP en tu agente y sube el modo a `hybrid` de una vez.
151
151
 
152
152
  Dos detalles si lo usas en equipo:
153
153
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ozali",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Bootstrap interactivo de IA por equipo: calibra el proyecto, genera la skill de ejecución (cdk) con TDD/SDD, y mantiene memoria de equipo (Engram) con histórico aislado.",
5
5
  "type": "module",
6
6
  "bin": {