Plugin fino (id osint-db) que habla HTTP con el service local osint_db (FastAPI + DuckDB) y renderiza tablas de datos en las notas del vault osint mediante el code block osintdb. Incluye parser puro de directivas con tests (node --test), settings tab, comando de paleta, enlaces internos para columnas note_path, build con esbuild + tsc y deploy.sh al vault. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.9 KiB
name, lang, domain, version, description, tags, uses_functions, uses_types, framework, entry_point, dir_path, repo_url, e2e_checks
| name | lang | domain | version | description | tags | uses_functions | uses_types | framework | entry_point | dir_path | repo_url | e2e_checks | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| osint_obsidian_plugin | ts | osint | 0.1.0 | Plugin de Obsidian (id osint-db) para el vault osint: ejecuta queries SQL y queries nombradas contra el service local osint_db (FastAPI + DuckDB) via HTTP y renderiza tablas de datos dentro de las notas mediante el code block osintdb. Plugin fino: no embebe ninguna base de datos. |
|
obsidian-plugin | main.ts | projects/osint/apps/osint_obsidian_plugin | https://gitea-dgg044oo04woo4ggcsws4gk0.organic-machine.com/dataforge/osint_obsidian_plugin |
|
osint_obsidian_plugin
Plugin de Obsidian para el vault ~/Obsidian/osint. Es deliberadamente fino: no embebe
DuckDB ni ninguna otra base de datos. Toda la lógica de datos vive en el service local
osint_db (FastAPI, dueño de la DuckDB con datos OSINT), con el que el plugin habla por
HTTP usando requestUrl de la API de Obsidian (evita CORS; nunca fetch).
Qué hace
- Code block
osintdb: dentro de cualquier nota, un bloque de código con lenguajeosintdbse renderiza como una tabla de datos. Dos formas de contenido:- SQL crudo (el bloque entero es un SELECT, va a
POST /api/query). - Directivas
clave: valoral inicio del bloque:query(nombre de query guardada, va aPOST /api/query/named),max_rowsytitle.
- SQL crudo (el bloque entero es un SELECT, va a
- Render seguro: tabla HTML construida con
createEl(los valores se insertan como texto, nunca como HTML crudo), header sticky, conteo de filas y nota "(truncado)" cuando el service recorta el resultado. Errores del service y service caído se muestran con mensajes claros, incluido el comando para arrancarosint_db. - Botón "Refrescar" por bloque: re-ejecuta la query sin recargar la nota.
- Enlaces a notas: si una columna se llama
note_pathy el valor termina en.md, la celda se renderiza como enlace interno de Obsidian que abre la nota al hacer clic. - Settings tab: URL base del service (default
http://127.0.0.1:8771) ymax_rowspor defecto (500), persistidos conloadData/saveData. - Comando de paleta "OSINT DB: Insertar bloque de query": inserta una plantilla de
bloque
osintdben el editor.
Ejemplo de bloque
Forma con SQL crudo:
```osintdb
title: Personas del caso X
max_rows: 100
SELECT nombre, contexto, note_path FROM main.personas WHERE contexto = 'caso_x';
```
Forma con query nombrada (definida en el service):
```osintdb
query: personas_por_contexto
max_rows: 100
```
Contrato API del service osint_db
Base URL por defecto: http://127.0.0.1:8771. El service responde siempre HTTP 200 y el
plugin decide por el campo status del body.
GET /api/health→{"status":"ok","db_path":"...","tables":N}GET /api/tables→ listado de tablas con schema, kind, row_count y columnas.POST /api/querybody{"sql":"SELECT ...","params":[],"max_rows":500}→{"status":"ok","columns":[...],"rows":[...],"row_count":N,"truncated":bool}o{"status":"error","error":"..."}.GET /api/queries→ queries nombradas disponibles.POST /api/query/namedbody{"name":"...","max_rows":500}→ misma shape que/api/query.
Cómo construir
cd projects/osint/apps/osint_obsidian_plugin
pnpm install
pnpm build # tsc --noEmit + esbuild -> main.js
pnpm test # tests del parser de bloques (node --test, sin Obsidian)
Requiere Node >= 23 para los tests (usa el type stripping nativo de node --test sobre
archivos .ts).
Cómo desplegar
./deploy.sh
Copia manifest.json, main.js y styles.css a
/home/enmanuel/Obsidian/osint/.obsidian/plugins/osint-db/.
Activación manual (la hace el humano, no un agente): tras el deploy, abrir Obsidian →
Settings → Community plugins → activar "OSINT DB". Si Obsidian ya estaba abierto, hace
falta recargar la app (Ctrl+R) o reiniciarla para que detecte el plugin nuevo o la
versión nueva de main.js.
Estructura
main.ts— plugin completo (processor, render, settings, comando).parse.ts— parser puro del contenido de los bloquesosintdb(testeable sin Obsidian).tests/parse.test.ts— tests del parser connode --test.esbuild.config.mjs— bundle CommonJS amain.jsconobsidiancomo external.deploy.sh— copia los artefactos al vault.
Gotchas
- El plugin no arranca el service: si
osint_dbno está corriendo, los bloques muestran "osint_db no responde en " con el comando de arranque como hint. main.jses artefacto de build (gitignored): siemprepnpm buildantes dedeploy.sh.isDesktopOnly: trueen el manifest — el service es local, no tiene sentido en móvil.