Reimplementación con arquitectura hexagonal pragmática del monitor de statusline para OpenCode, con identidad propia de Cobies.
Mantiene la idea original del proyecto:
- un plugin runtime para OpenCode que escribe estado y statusline
- un plugin TUI para visualizar subagentes dentro de OpenCode
Pero mejora:
- separación de responsabilidades
- mantenibilidad
- testabilidad
- seguridad del acceso a SQLite
- consistencia de tooling con Bun
Este proyecto está verificado con:
bun run typecheck✅bun test✅bun run build✅
Salidas generadas:
dist/runtime.jsdist/tui.js
- TypeScript
- Bun
- Vitest
- tsup
- OpenCode Plugin API
- OpenTUI / Solid
- bun:sqlite para acceso seguro a SQLite con prepared statements reales
src/
domain/ # lógica pura del negocio
application/ # casos de uso
ports/ # contratos/interfaces
adapters/ # OpenCode, SQLite, filesystem, TUI, statusline
entry/ # puntos de entrada runtime y TUIEl dominio no depende de:
- Node APIs
- Bun runtime APIs externas al dominio
- OpenCode
- SQLite
- Solid/OpenTUI
Las dependencias fluyen hacia adentro:
adapters -> application -> domainbun installbun run typecheckbun testbun run buildbun run devEste entry genera los archivos de salida de statusline:
state.jsonstatus.txt
Entry exportado:
./runtime
{
"plugin": ["cobies-opencode-statusline/runtime"]
}El runtime:
- recibe eventos del host
- los mapea al dominio
- actualiza el estado
- persiste snapshot
- escribe el resumen textual
Entry exportado:
./tui
{
"plugin": ["cobies-opencode-statusline/tui"]
}El plugin TUI está separado de la lógica de negocio. La UI renderiza a partir de un view-model y no concentra reglas críticas del dominio.
-
OPENCODE_SUBAGENT_STATUSLINE_STATE- path explícito para
state.json
- path explícito para
-
OPENCODE_SUBAGENT_STATUSLINE_PRESERVE_STATE=1- preserva el estado previo al iniciar
OPENCODE_SUBAGENT_STATUSLINE_OPENCODE_DB- permite indicar el path del
opencode.db
- permite indicar el path del
Si no se define, el proyecto intenta resolver la DB de OpenCode desde el directorio estándar de datos.
El acceso a SQLite ya no usa interpolación de strings ni shell escaping.
Ahora usa:
bun:sqliteDatabase.prepare()- placeholder
? - binding real con
stmt.get(sessionId)
Eso elimina el problema anterior de SQL injection que existía en el enfoque basado en CLI.
Actualmente el proyecto tiene cobertura de tests sobre:
- servicios de dominio
- transiciones de estado
- casos de uso principales
- mapper de eventos
- view-model del TUI
Agregar test de integración para el adapter SQLite con una base real de prueba.
Este proyecto está estandarizado para Bun.
Eso simplifica:
- lockfile
- runtime SQLite
- consistencia del tooling
Pero implica que el adapter SQLite depende de bun:sqlite y no está pensado para Node puro.
- menos acoplamiento
- runtime y TUI mejor separados
- lógica de negocio fuera de la UI
- acceso SQLite seguro
- tests presentes
- estructura lista para seguir creciendo sin convertir
tui.tsxen un monstruo
Usá esta versión como la base nueva del proyecto.
Si querés migrarla a producción o adoptarla como reemplazo del original, el siguiente paso razonable es:
- probarla dentro de OpenCode con tus eventos reales
- agregar README de migración si vas a reemplazar el paquete original
- agregar CI para
typecheck+test
bun install
bun run typecheck
bun test
bun run build