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 +2 -1
- package/cli/bin/ozali.mjs +6 -1
- package/cli/lib/commands.mjs +77 -0
- package/docs/guia-de-uso.md +3 -3
- package/package.json +1 -1
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`).
|
|
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;
|
package/cli/lib/commands.mjs
CHANGED
|
@@ -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`);
|
package/docs/guia-de-uso.md
CHANGED
|
@@ -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,
|
|
150
|
-
`hybrid`
|
|
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.
|
|
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": {
|