feat(shell): auto-commit con 31 cambios

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-14 23:55:16 +02:00
parent 1430039688
commit e1e9bb7499
31 changed files with 3917 additions and 0 deletions
+2
View File
@@ -56,6 +56,8 @@ Indice de grupos de capacidades del registry. Cada grupo agrupa >=3 funciones qu
| [recon](recon.md) | 8 | Reconocimiento de red OSINT: whois, rdap, dns (dig), ping, traceroute, nmap por perfiles. Cada scan se archiva en OSINT (nota vault + tabla DuckDB network_scans) via el sink save_scan_to_osint o el pipeline one-shot recon_osint. Perfiles nmap pesados (full-tcp/vuln/udp-top) en segundo plano. No es framework de explotacion; solo hosts autorizados |
| [osint-passive](osint-passive.md) | 8 | Recoleccion OSINT pasiva (fuentes publicas, no intrusiva): EXIF/PDF metadata, whois RDAP, DNS, subdominios crt.sh, guess emails, username enumeration, search dorks |
| [osint-enrich](osint-enrich.md) | 3 | Orquestadores de enriquecimiento OSINT: componen osint-passive para aumentar datapoints de personas (emails/usernames/dorks), orgs (whois+dns+subdominios) y metadatos de attachments |
| [market-intel](market-intel.md) | 8 | Inteligencia de mercado para captacion de clientes: scrapers de tendencias de productos/nichos (Amazon, Google Trends, TikTok, AliExpress) + precios de competencia, aterrizados en Postgres (pg_insert_rows/pg_apply_sql) y analizados en Metabase. Dispatcher ingest_market_trends invocado por dag_engine. TikTok/AliExpress por HTTP caen (anti-bot); pendiente browser CDP |
| [onlyoffice](onlyoffice.md) | 3 | Operar ONLYOFFICE Desktop Editors (binario onlyoffice-desktopeditors) en Linux/X11 desde terminal via instancia aislada (slot HOME=/tmp/oo_<instance>): abrir un archivo en ventana propia, cerrar+reabrir para mostrar datos editados en disco (no hay reload nativo, Issue #2313), y matar el proceso del slot. Solo gestiona la ventana, NO edita ni crea archivos. Requiere X11 + wmctrl + xdotool. No confundir con el Document Server (web/Docker) |
## Como anadir grupo
+54
View File
@@ -0,0 +1,54 @@
# market-intel
Inteligencia de mercado para captación de clientes: scrapers de señales de demanda y
tendencias de productos/nichos desde varias fuentes públicas, más vigilancia de precios de
la competencia, aterrizados en Postgres y analizados con Metabase. Scheduling con
`dag_engine`. Origen: proyecto `captacion_clientes`.
## Funciones
| ID | Firma corta | Qué hace |
|---|---|---|
| `scrape_amazon_bestsellers_py_datascience` | `(marketplace, categories, list_type, max_items)` | Amazon Best Sellers + Movers & Shakers (ranking real de demanda). HTTP, funciona. |
| `scrape_google_trends_py_datascience` | `(keywords, geo, timeframe, include_related)` | Interés de búsqueda (0-100) + rising/top via pytrends. Backoff ante 429. |
| `scrape_tiktok_creative_py_datascience` | `(country, kind, limit, period)` | TikTok Creative Center (hashtags/songs/creators). **Bloqueado por anti-bot vía HTTP**; pendiente browser CDP. |
| `scrape_aliexpress_trending_py_datascience` | `(query, category, limit, ship_to)` | Productos populares AliExpress (orders/rating). **Bloqueado por captcha vía HTTP**; pendiente browser CDP. |
| `scrape_competitor_prices_py_datascience` | `(targets) -> list[dict]` | Precio actual de una lista de URLs de competidores (cascada: selector → JSON-LD → meta → heurística). |
| `pg_insert_rows_py_infra` | `(dsn, table, rows, add_snapshot_date=True)` | Insert append-only por lote en Postgres (execute_values parametrizado, añade snapshot_date). |
| `pg_apply_sql_py_infra` | `(dsn, sql_path) -> int` | Aplica un `.sql` de migración a Postgres (idempotente con IF NOT EXISTS). |
| `ingest_market_trends_py_pipelines` | `(source)` | Dispatcher: scrapea una fuente y la aterriza en su tabla. Lo invoca `dag_engine`. |
## Ejemplo canónico (end-to-end)
```bash
# 1. (una vez) Stack Metabase + Postgres en Docker
fn run init_metabase_go_infra --project captacion --metabase-port 3030 --pg-port 5433 \
--pg-user captacion --pg-password "$(pass show captacion/postgres | head -1)"
docker exec captacion-postgres psql -U captacion -d metabase -c "CREATE DATABASE trends OWNER captacion"
# 2. (una vez) Aplicar el schema
python3 -c "import sys; sys.path.insert(0,'python/functions'); from infra import pg_apply_sql; \
pg_apply_sql('postgresql://captacion:PW@localhost:5433/trends', 'projects/captacion_clientes/db/migrations/001_schema.sql')"
# 3. Ingesta una fuente (manual o vía dag_engine)
fn run ingest_market_trends_py_pipelines amazon
fn run ingest_market_trends_py_pipelines google_trends
# 4. dag_engine lo hace solo: dags market-intel-daily (06:30) y competitor-prices-hourly
```
## Fronteras
- NO hace explotación ni bypass agresivo de anti-bot: TikTok/AliExpress por HTTP-directo
caen desde datacenter; la vía robusta es el browser MCP/CDP (grupo `navegator`/`web-proxy`,
doctrina `flow_replay.md`), aún no implementada para estas dos fuentes.
- NO es un grupo de visualización: el análisis vive en Metabase (grupo `metabase`).
- NO gestiona el scheduling: eso es `dag_engine` (grupo `scheduler`).
- El DSN de Postgres y credenciales NO se hardcodean: van en `pass`/`.env` del proyecto.
## Notas
- Las tablas de `trends` son append-only particionadas por `snapshot_date` — pensadas para
series temporales en Metabase (qué tendencia sube/baja). No correr en bucle apretado.
- `competitor_prices` se nutre de la tabla `competitor_targets` (el usuario inserta los
objetivos a vigilar: competidor + product_key + URL).
+79
View File
@@ -0,0 +1,79 @@
# Capability group: onlyoffice
Operar **ONLYOFFICE Desktop Editors** (binario `/usr/bin/onlyoffice-desktopeditors`) en Linux/X11 desde terminal, gestionando la **ventana** de los archivos sin perturbar la instancia personal del usuario.
Este grupo NO es el ONLYOFFICE **Document Server** (web/Docker) — para eso ver `start_documentserver_bash_infra`, `documentserver_health_go_infra`, `onlyoffice_command_service_go_infra` y compañia. Este grupo es el editor de **escritorio**.
## Convencion de instancia aislada (slot)
ONLYOFFICE Desktop es **single-instance por usuario**: un segundo `onlyoffice-desktopeditors <file>` se reenvia a la instancia viva y abre el archivo como PESTAÑA en su ventana, no como ventana nueva. El lock single-instance NO se rompe con `XDG_CONFIG_HOME`, pero SI se rompe lanzando con `HOME` y `XDG_RUNTIME_DIR` propios.
Por eso las 3 funciones comparten un "slot" nombrado por `instance` (string, default `demo`):
```
HOME=/tmp/oo_<instance>
XDG_RUNTIME_DIR=/tmp/oo_<instance>_run (mkdir -p + chmod 700)
XDG_CONFIG_HOME=/tmp/oo_<instance>/.config
```
Lanzamiento canonico (identico en open y reload):
```bash
env HOME=/tmp/oo_<instance> XDG_RUNTIME_DIR=/tmp/oo_<instance>_run \
XDG_CONFIG_HOME=/tmp/oo_<instance>/.config \
setsid onlyoffice-desktopeditors <file> >/tmp/oo_<instance>.log 2>&1 </dev/null &
```
Usar el MISMO `instance` en todas las operaciones del slot: asi el relaunch reenvia a la instancia aislada viva y reabre rapido en vez de arrancar el motor de cero.
## Funciones
| ID | Firma corta | Que hace |
|---|---|---|
| `open_onlyoffice_file_bash_shell` | `open_onlyoffice_file <file> [instance]` | Abre un archivo existente en el slot aislado; espera la ventana por basename (~25s); JSON con wid/status. Idempotente, NO crea archivos. |
| `reload_onlyoffice_file_bash_shell` | `reload_onlyoffice_file <file> [instance]` | **Funcion estrella**: cierra (wmctrl -ic) y reabre el archivo en el slot para mostrar datos editados EN DISCO (ONLYOFFICE no tiene reload nativo, Issue #2313). JSON con wid_old/wid_new/elapsed_s/status. NO edita el archivo. |
| `close_onlyoffice_instance_bash_shell` | `close_onlyoffice_instance [instance] [--purge]` | Mata los procesos DesktopEditors del slot (por HOME=/tmp/oo_<instance> en /proc), SIGTERM->SIGKILL; con --purge borra /tmp/oo_<instance>*. JSON con killed_pids/status. |
## Ejemplo canonico (end-to-end)
Flujo completo "abrir -> editar el archivo en disco -> recargar la vista -> cerrar", todo sobre un slot aislado `demo` que no toca la instancia personal del usuario:
```bash
cd /home/enmanuel/fn_registry
# 0. El caller prepara el archivo (esta funcion NO crea archivos)
printf 'a,b\n1,2\n' > /tmp/demo_reload.csv
# 1. Abrir en el slot aislado 'demo' -> ventana propia
./fn run open_onlyoffice_file_bash_shell /tmp/demo_reload.csv demo
# {"instance":"demo","file":"/tmp/demo_reload.csv","wid":"0x3c00007","pid":12345,"status":"open"}
# 2. El caller edita el archivo EN DISCO (script, generador, otra herramienta)
printf 'a,b\n1,2\n3,4\n5,6\n' > /tmp/demo_reload.csv
# 3. Recargar la ventana para que muestre los datos nuevos (cierra+reabre)
./fn run reload_onlyoffice_file_bash_shell /tmp/demo_reload.csv demo
# {"instance":"demo","file":"/tmp/demo_reload.csv","wid_old":"0x3c00007","wid_new":"0x3c0000b","reopened":true,"elapsed_s":4,"status":"reloaded"}
# 4. Cerrar la instancia aislada y limpiar su estado
./fn run close_onlyoffice_instance_bash_shell demo --purge
# {"instance":"demo","killed_pids":[12345],"purged":true,"status":"closed"}
```
## Fronteras (que NO hace el grupo)
- **NO edita ni crea archivos**. Solo gestiona la VENTANA (abrir, cerrar+reabrir, matar proceso). El contenido lo prepara y modifica el caller en disco.
- **NO es el Document Server** (web/Docker/JWT/Command Service). Eso es otro conjunto de funciones (`*documentserver*`, `*onlyoffice_jwt*`, `onlyoffice_command_service_*`).
- **NO recarga in-place**: ONLYOFFICE Desktop no soporta reload de cambios externos (Issue #2313 abierto). `reload_onlyoffice_file` lo emula con cerrar+reabrir; no hay alternativa "sin parpadeo".
- **NO toca la instancia personal del usuario**: todo opera sobre el slot aislado (HOME=/tmp/oo_<instance>). `close` solo mata procesos cuyo HOME es del slot.
## Prerequisitos
- Linux con **X11** (o XWayland). En Wayland puro sin XWayland, `xdotool`/`wmctrl` no encuentran la ventana.
- Binarios en PATH: `onlyoffice-desktopeditors`, `wmctrl`, `xdotool`. Cada funcion comprueba `command -v` y falla con exit !=0 si falta alguno.
## Notas
- Las esperas son **por evento** (`xdotool search` + `read -t`), nunca `sleep` en foreground, para no colgar bajo `fn run` ni tests.
- El slot vive en `/tmp` y se pierde al reiniciar el PC (estado desechable). `--purge` lo borra explicitamente.
- `wmctrl -ic` puede disparar el dialogo "Guardar cambios" SOLO si se edito dentro de la app con cambios sin guardar; el flujo previsto edita en disco, asi que la ventana no tiene estado pendiente.