opencode-flema-engram-sidebar 0.1.8 → 0.3.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
@@ -1,20 +1,20 @@
1
- # Flema Engram para OpenCode
1
+ # Flema Engram para OpenCode y Pi
2
2
 
3
3
  [![CI](https://github.com/oniricosistemas/flema-engram/actions/workflows/ci.yml/badge.svg)](https://github.com/oniricosistemas/flema-engram/actions/workflows/ci.yml)
4
4
  [![npm](https://img.shields.io/npm/v/opencode-flema-engram-sidebar?logo=npm)](https://www.npmjs.com/package/opencode-flema-engram-sidebar)
5
5
  [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D22-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org/)
6
6
  [![License: MIT](https://img.shields.io/github/license/oniricosistemas/flema-engram)](https://github.com/oniricosistemas/flema-engram/blob/main/LICENSE)
7
7
 
8
- Un sidebar local y de solo lectura que mantiene visible el contexto reciente de
9
- [Engram](https://github.com/Gentleman-Programming/engram) mientras trabajás dentro de OpenCode.
8
+ Una integración local y de solo lectura que mantiene visible el contexto reciente de
9
+ [Engram](https://github.com/Gentleman-Programming/engram) mientras trabajás dentro de OpenCode o Pi/Gentle Shell.
10
10
 
11
11
  La canción **“Y aún yo te recuerdo”** inspiró artísticamente la idea central: que la
12
12
  última memoria guardada siga presente en el contexto de desarrollo. Esta referencia
13
13
  es un homenaje a esa inspiración; no implica afiliación, patrocinio ni titularidad
14
14
  sobre la obra.
15
15
 
16
- > **English summary:** Flema Engram is a local-first, read-only OpenCode
17
- > plugin/sidebar that surfaces Engram health, project context, recent memories,
16
+ > **English summary:** Flema Engram is a local-first, read-only OpenCode and Pi
17
+ > integration that surfaces Engram health, project context, recent memories,
18
18
  > blockers, and ODD task progress by default. An MCP stdio adapter is included only as an optional
19
19
  > integration path.
20
20
 
@@ -36,18 +36,58 @@ Configuración mínima:
36
36
  ```json
37
37
  {
38
38
  "$schema": "https://opencode.ai/tui.json",
39
- "plugin": ["opencode-flema-engram-sidebar"]
39
+ "plugin": ["opencode-flema-engram-sidebar@0.3.0"]
40
40
  }
41
41
  ```
42
42
 
43
- > Puedes encontrar la ruta completa de tu archivo `tui.json` ejecutando `opencode debug tui-path`.
43
+ Fijá una versión exacta. OpenCode 1.18.x conserva paquetes npm en caché y una entrada
44
+ sin versión o con `@latest` puede seguir resolviendo una release anterior después de
45
+ que npm publique otra. El plugin no puede actualizarse a sí mismo porque OpenCode lo
46
+ resuelve e importa antes de ejecutar su código.
44
47
 
45
- Una vez guardado el archivo, reinicia OpenCode para que el plugin se cargue.
48
+ Para ubicar el archivo global, ejecutá `opencode debug paths` y abrí `tui.json` dentro
49
+ de la ruta `config`. Una vez guardado, cerrá completamente OpenCode y abrí un proceso
50
+ nuevo para que el plugin se cargue.
51
+
52
+ #### Diagnosticar y actualizar una instalación
53
+
54
+ La CLI de mantenimiento consulta las rutas que informa OpenCode, inspecciona la
55
+ configuración y compara los wrappers de caché con npm sin mostrar opciones del plugin:
56
+
57
+ ```sh
58
+ npx --yes --package opencode-flema-engram-sidebar@latest flema-engram doctor
59
+ ```
60
+
61
+ Previsualizá siempre la actualización. `--dry-run` no cambia archivos:
62
+
63
+ ```sh
64
+ npx --yes --package opencode-flema-engram-sidebar@latest \
65
+ flema-engram update --dry-run
66
+ ```
67
+
68
+ Luego cerrá OpenCode y aplicá el mismo plan:
69
+
70
+ ```sh
71
+ npx --yes --package opencode-flema-engram-sidebar@latest \
72
+ flema-engram update
73
+ ```
74
+
75
+ La CLI pide una confirmación, respalda `tui.json`, invoca el instalador oficial con
76
+ la versión npm exacta y un límite de 60 segundos, elimina solamente wrappers obsoletos
77
+ que conservan el mismo manifiesto observado en el preview y verifica el resultado. Si
78
+ el instalador agota ese límite, la CLI lo detiene por la fuerza e informa la ruta
79
+ exacta del backup retenido. Para automatización
80
+ controlada, `flema-engram update --yes` omite únicamente la pregunta: conserva el
81
+ preview, las validaciones y el backup. `--json` produce una salida estructurada.
82
+
83
+ OpenCode 1.18.x no actualiza confiablemente una entrada sin versión o con `@latest`.
84
+ OpenCode 2 dispone además de `opencode plugin check` y `opencode plugin update`; la
85
+ CLI usa la sintaxis nativa correspondiente a la versión detectada.
46
86
 
47
87
  #### Usando `opencode attach`
48
88
  Si vas a conectarte a una instancia remota de OpenCode mediante `opencode attach <url>`, el plugin funcionará siempre que:
49
89
  - El servicio Engram en la máquina remota sea accesible en el puerto 7437 (por defecto solo escucha en 127.0.0.1; se recomienda crear un puente TCP como se describe en los documentos internos o usar `engram-bridge.service`).
50
- - El plugin descargará automáticamente la versión más reciente desde NPM al iniciar el attach.
90
+ - Usá una versión exacta del plugin y actualizala explícitamente; `opencode attach` puede reutilizar una copia npm ya resuelta en la caché local.
51
91
  - La detección automática usa el host recibido por `opencode attach`; si el puente de Engram usa otra URL, configurá `baseUrl` explícitamente en `tui.json`.
52
92
  - Verás en el sidebar la línea `🔌 Target: Local=<host>:7437 | Cloud=<URL>` para confirmar a qué endpoints se está conectando.
53
93
 
@@ -56,18 +96,53 @@ Si vas a conectarte a una instancia remota de OpenCode mediante `opencode attach
56
96
  El sidebar hace una carga inicial, vuelve a consultar cada 30 segundos de forma
57
97
  predeterminada y permite refrescar manualmente con <kbd>Alt</kbd>+<kbd>R</kbd>.
58
98
 
99
+ ## Viewer para Pi / Gentle Shell
100
+
101
+ El mismo paquete incluye una extensión Pi de solo lectura. Instalá una versión exacta
102
+ compatible con esta documentación:
103
+
104
+ ```sh
105
+ pi install npm:opencode-flema-engram-sidebar@0.3.0
106
+ ```
107
+
108
+ La extensión publica un status breve y un widget compacto debajo del editor. Refresca
109
+ al iniciar, reanudar o recargar una sesión, después de que `mem_save` (o el alias
110
+ `save_memory`) termina correctamente y mediante el comando:
111
+
112
+ ```text
113
+ /engram-refresh
114
+ ```
115
+
116
+ No usa polling periódico y no agrega herramientas para escribir memorias. En modos
117
+ sin UI no consulta Engram ni intenta renderizar componentes terminales. En RPC usa
118
+ solamente status y widgets de líneas de texto, sin iniciar una segunda TUI.
119
+
120
+ La resolución del endpoint usa `ENGRAM_URL`, luego `ENGRAM_BASE_URL` y finalmente
121
+ `http://127.0.0.1:7437`. `ENGRAM_PROJECT` puede fijar el candidato de proyecto; de lo
122
+ contrario se valida el nombre del directorio actual contra Engram. Los fallos de
123
+ inicialización se contienen en un estado `Engram unavailable` sin mostrar URLs,
124
+ tokens ni diagnósticos con credenciales.
125
+
126
+ Para desarrollo local, después de compilar el paquete:
127
+
128
+ ```sh
129
+ npm run build
130
+ pi --extension ./dist/pi.js
131
+ ```
132
+
59
133
  ## Qué es — y qué no es
60
134
 
61
135
  | Sí es | No es |
62
136
  | --- | --- |
63
- | Un plugin para el slot `sidebar_content` de OpenCode | Una TUI independiente |
137
+ | Un plugin para `sidebar_content` de OpenCode y una extensión Pi | Una TUI independiente |
64
138
  | Una vista local y de solo lectura sobre Engram | Un reemplazo de Engram |
65
139
  | Project context, activity, and ODD task progress | A memory editor or manager |
66
140
  | Un cliente del HTTP local de Engram | Un servicio cloud o de sincronización |
67
141
  | Un paquete con un adaptador MCP stdio opcional | Un producto centrado en MCP |
68
142
 
69
- El sidebar es el producto principal. El comando MCP existe para integraciones
70
- avanzadas y puede ignorarse por completo al usar el plugin de OpenCode.
143
+ Los viewers de OpenCode y Pi son las integraciones visuales principales. El comando
144
+ MCP existe para integraciones avanzadas y puede ignorarse por completo al usar cualquiera
145
+ de los viewers.
71
146
 
72
147
  ## Cómo funciona
73
148
 
@@ -108,7 +183,7 @@ Usá la forma `[plugin, options]` solamente cuando necesites opciones:
108
183
  "$schema": "https://opencode.ai/tui.json",
109
184
  "plugin": [
110
185
  [
111
- "opencode-flema-engram-sidebar",
186
+ "opencode-flema-engram-sidebar@0.3.0",
112
187
  {
113
188
  "enabled": true,
114
189
  "project": "mi-proyecto",
@@ -263,7 +338,7 @@ Si Engram conoce `mi-proyecto`, el sidebar valida ese nombre y carga sus memoria
263
338
  {
264
339
  "$schema": "https://opencode.ai/tui.json",
265
340
  "plugin": [
266
- ["opencode-flema-engram-sidebar", { "project": "backend-api" }]
341
+ ["opencode-flema-engram-sidebar@0.3.0", { "project": "backend-api" }]
267
342
  ]
268
343
  }
269
344
  ```
@@ -277,7 +352,7 @@ Engram. El valor debe coincidir; una configuración incorrecta queda como `unres
277
352
  {
278
353
  "$schema": "https://opencode.ai/tui.json",
279
354
  "plugin": [
280
- ["opencode-flema-engram-sidebar", { "pollInterval": 60000 }]
355
+ ["opencode-flema-engram-sidebar@0.3.0", { "pollInterval": 60000 }]
281
356
  ]
282
357
  }
283
358
  ```
@@ -358,11 +433,57 @@ Preservá el resto de tus plugins y opciones al fusionar la configuración.
358
433
  - Cerrá y reiniciá OpenCode después de cambiar `tui.json`.
359
434
  - Validá el JSON y la ruta del plugin.
360
435
  - Confirmá Node.js 22+ y OpenCode 1.18.25+.
361
- - Para npm, usá el nombre exacto `opencode-flema-engram-sidebar`.
436
+ - Para npm, usá `opencode-flema-engram-sidebar@<version>` con una versión publicada exacta.
362
437
  - Para fuente local, ejecutá `npm install` y comprobá que la ruta termine en
363
438
  `src/sidebar/plugin.tsx`.
364
439
  - Revisá la salida de arranque de OpenCode. El plugin no crea archivos de log propios.
365
440
 
441
+ ### El sidebar muestra una versión anterior
442
+
443
+ 1. Cerrá todos los procesos OpenCode.
444
+ 2. Ejecutá `opencode debug paths` y anotá las rutas `config` y `cache`.
445
+ 3. Confirmá que `config/tui.json` use `opencode-flema-engram-sidebar@<version>`.
446
+ 4. Instalá de nuevo esa versión exacta:
447
+
448
+ ```sh
449
+ opencode plugin opencode-flema-engram-sidebar@<version> --force --global
450
+ ```
451
+
452
+ 5. Si el sidebar todavía muestra la release anterior, inspeccioná dentro de
453
+ `cache/packages` los wrappers `opencode-flema-engram-sidebar@*`. Eliminá solamente
454
+ el wrapper obsoleto `opencode-flema-engram-sidebar@latest` después de confirmar que
455
+ su `node_modules/opencode-flema-engram-sidebar/package.json` contiene la versión
456
+ vieja. Conservá el wrapper exacto y repetí el comando anterior.
457
+ 6. Abrí un proceso OpenCode nuevo; los procesos existentes no recargan plugins.
458
+
459
+ En PowerShell, reemplazá `<old-version>` por la versión anterior que esperás borrar.
460
+ El comando se niega a eliminar el wrapper si su manifiesto contiene otro valor:
461
+
462
+ ```powershell
463
+ $cache = (opencode debug paths | Select-String '^cache\s+').Line -replace '^cache\s+', ''
464
+ $stale = Join-Path $cache 'packages\opencode-flema-engram-sidebar@latest'
465
+ $manifest = Join-Path $stale 'node_modules\opencode-flema-engram-sidebar\package.json'
466
+ $staleVersion = (Get-Content -LiteralPath $manifest -Raw | ConvertFrom-Json).version
467
+ if ($staleVersion -ne '<old-version>') { throw "Refusing to remove wrapper: found $staleVersion" }
468
+ Remove-Item -LiteralPath $stale -Recurse -Force
469
+ ```
470
+
471
+ En shells POSIX, reemplazá `<cache>` y `<old-version>` por los valores confirmados:
472
+
473
+ ```sh
474
+ stale='<cache>/packages/opencode-flema-engram-sidebar@latest'
475
+ manifest="$stale/node_modules/opencode-flema-engram-sidebar/package.json"
476
+ stale_version="$(node -e 'const fs = require("node:fs"); console.log(JSON.parse(fs.readFileSync(process.argv[1], "utf8")).version)' "$manifest")"
477
+ [ "$stale_version" = '<old-version>' ] || {
478
+ printf 'Refusing to remove wrapper: found %s\n' "$stale_version" >&2
479
+ exit 1
480
+ }
481
+ rm -rf -- "$stale"
482
+ ```
483
+
484
+ No borres el directorio completo de caché: puede contener otros plugins, servidores de
485
+ lenguaje y modelos descargados.
486
+
366
487
  ### OpenCode no encuentra el export del paquete
367
488
 
368
489
  - Confirmá que la versión instalada tiene un export raíz por defecto con `id` y `tui`.
package/dist/core.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./adapters/types.js";
2
+ export * from "./viewer/core.js";
3
+ export { resolveProject, resolveProjectName, type ProjectResolution, type ProjectResolutionOptions, type ProjectValidation, } from "./utils/project-resolver.js";
4
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,GACvB,MAAM,6BAA6B,CAAC"}
package/dist/core.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./adapters/types.js";
2
+ export * from "./viewer/core.js";
3
+ export { resolveProject, resolveProjectName, } from "./utils/project-resolver.js";
4
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,kBAAkB,GAInB,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface MaintenanceCommandResult {
2
+ code: number;
3
+ stdout: string;
4
+ stderr: string;
5
+ }
6
+ export interface MaintenanceCommandOptions {
7
+ signal?: AbortSignal;
8
+ }
9
+ export type MaintenanceCommandRunner = (command: string, args: string[], options?: MaintenanceCommandOptions) => Promise<MaintenanceCommandResult>;
10
+ export interface MaintenanceCliDependencies {
11
+ cwd?: string;
12
+ runCommand?: MaintenanceCommandRunner;
13
+ fetchLatestVersion?: () => Promise<string>;
14
+ confirm?: (message: string) => Promise<boolean>;
15
+ now?: () => Date;
16
+ installerTimeoutMs?: number;
17
+ stdout?: (text: string) => void;
18
+ stderr?: (text: string) => void;
19
+ }
20
+ export declare function runMaintenanceCli(argv: string[], dependencies?: MaintenanceCliDependencies): Promise<number>;
21
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/maintenance/cli.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,yBAAyB,KAChC,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAEvC,MAAM,WAAW,0BAA0B;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AA6dD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EAAE,EACd,YAAY,GAAE,0BAA+B,GAC5C,OAAO,CAAC,MAAM,CAAC,CA6IjB"}