[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81571":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":12,"lastSyncTime":25,"discoverSource":26},81571,"github-sentinel","midudev\u002Fgithub-sentinel","midudev","Crea un centinela para tu GitHub que te avise de cositas",null,"TypeScript",33,2,24,0,4,9,1.43,false,"main",true,[],"2026-06-12 02:04:16","# GitHub Sentinel\n\nAgente local que vigila tus repositorios de GitHub, detecta nuevas issues y\nte prepara un resumen + propuesta de solución usando un LLM vía API compatible\ncon OpenAI, todo sin salir de tu red si apuntas a un servidor local.\n\nPensado para correr 24\u002F7 en un MiniPC o servidor (Windows o macOS).\n\n```\n ┌─ cron interno (cada N min) ──────────────────────────────────┐\n │   → GitHub REST API   (issues + metadata)                    │\n │   → SQLite local      (issues vistas, no duplicar)           │\n │   → LLM API compatible OpenAI (resumen + riesgo + propuesta) │\n │   → Dashboard React   (terminal-style, Geist Pixel \u002F Mono)   │\n └──────────────────────────────────────────────────────────────┘\n```\n\n---\n\n## Stack\n\n- **Runtime**: [Bun](https:\u002F\u002Fbun.com) (servidor + bundler + sqlite + .env loader)\n- **Frontend**: React 19 + Tailwind 4 + Geist Pixel \u002F Geist Mono\n- **Base de datos**: `bun:sqlite` (modo WAL)\n- **LLM**: API compatible con OpenAI (endpoint y modelo configurables)\n\nSin dependencias extra de Node.js, Express, dotenv, better-sqlite3 ni nada por el estilo.\n\n---\n\n## Funcionalidades (v0.1)\n\n- ✓ Vigila N repos cada N minutos (configurable).\n- ✓ Detecta issues nuevas y las guarda en SQLite.\n- ✓ Las analiza con LLM local: resumen, tipo (bug\u002Ffeature\u002Fdocs\u002Fquestion), riesgo (low\u002Fmed\u002Fhigh), archivos probables y propuesta de solución.\n- ✓ Dashboard minimalista con filtros y búsqueda.\n- ✓ Health check (`\u002Fapi\u002Fhealth`) y status (`\u002Fapi\u002Fstatus`).\n- ✓ Apagado limpio con SIGINT\u002FSIGTERM (cierra SQLite sin corromper el WAL).\n- ✓ Recuperación de errores (un repo que falla no para el resto).\n\n---\n\n## Quick start (desarrollo)\n\nRequisito: [Bun ≥ 1.3](https:\u002F\u002Fbun.com\u002Fdocs\u002Finstallation).\n\n```bash\nbun install\ncp .env.example .env       # edita y añade tu GITHUB_TOKEN\nbun dev                    # http:\u002F\u002Flocalhost:3741\n```\n\n`bun dev` arranca con HMR activo. Para producción local usa `bun start`.\n\n---\n\n## Variables de entorno\n\nBun carga `.env` automáticamente. Variables:\n\n| Variable | Por defecto | Descripción |\n|---|---|---|\n| `GITHUB_TOKEN` | _(vacío)_ | Fine-grained PAT con permisos read-only de Issues + Metadata sobre los repos a vigilar. **Recomendado**, sin token estás limitado a 60 req\u002Fh. |\n| `GITHUB_USER` | _(vacío)_ | Tu usuario, solo para mostrar en el header. Ej: `midudev`. |\n| `LLM_URL` | `http:\u002F\u002Flocalhost:1234\u002Fv1` | URL base del servidor compatible con OpenAI. Debe exponer `\u002Fmodels` y `\u002Fchat\u002Fcompletions`. Puede apuntar a otra máquina de la LAN. |\n| `LLM_MODEL` | `local-model` | Nombre del modelo a usar en las llamadas `chat\u002Fcompletions`. |\n| `LLM_API_KEY` | `sentinel-local` | Bearer token para servidores que lo requieran. Si tu servidor local no valida auth, puede ser cualquier string. |\n| `SENTINEL_INTERVAL_MS` | `1800000` (30 min) | Cada cuánto hacer el barrido. |\n| `SENTINEL_DB_PATH` | `data\u002Fsentinel.db` | Ruta al SQLite. Puede ser absoluta. |\n| `PORT` | `3741` | Puerto del servidor. |\n| `HOST` | `0.0.0.0` | Interfaz a la que bindear. Déjalo así para acceder desde la LAN. |\n\n> Token recomendado: [github.com\u002Fsettings\u002Fpersonal-access-tokens\u002Fnew](https:\u002F\u002Fgithub.com\u002Fsettings\u002Fpersonal-access-tokens\u002Fnew) → \"Only select repositories\" → solo los que quieras vigilar → permisos `Issues: Read-only` y `Metadata: Read-only`.\n\n---\n\n## Endpoints\n\n| Método | Ruta | Descripción |\n|---|---|---|\n| `GET` | `\u002Fapi\u002Fhealth` | Healthcheck simple (uptime, pid, plataforma). Útil para monitorización externa. |\n| `GET` | `\u002Fapi\u002Fstatus` | Estado completo: contadores, LLM, último scan. |\n| `GET` | `\u002Fapi\u002Frepos` | Lista repos vigilados. |\n| `POST` | `\u002Fapi\u002Frepos` | Añadir repo. Body: `{ \"repo\": \"owner\u002Fname\" }`. |\n| `DELETE` | `\u002Fapi\u002Frepos\u002F:id` | Dejar de vigilar. |\n| `GET` | `\u002Fapi\u002Fissues?limit=N` | Issues con su análisis. |\n| `POST` | `\u002Fapi\u002Fissues\u002F:id\u002Fanalyze` | Forzar análisis LLM de una issue. |\n| `POST` | `\u002Fapi\u002Fcheck` | Disparar un scan inmediato. |\n\n---\n\n## Estructura del proyecto\n\n```\nsrc\u002F\n  server\u002F\n    index.ts        # Bun.serve + rutas + shutdown handler\n    db.ts           # bun:sqlite, schema y queries preparadas\n    github.ts       # cliente GitHub REST (fetch, sin Octokit)\n    llm.ts          # cliente LLM compatible OpenAI, JSON forzado\n    sentinel.ts     # scheduler de polling + analyzer en background\n  client\u002F\n    index.html\n    main.tsx        # entry React\n    App.tsx\n    api.ts          # cliente tipado del API\n    styles.css      # @font-face + @theme Tailwind 4\n    utils.ts\n    fonts\u002F          # Geist Pixel + Geist Mono (.woff2)\n    components\u002F\n      Header.tsx\n      Stats.tsx\n      AddRepoForm.tsx\n      RepoList.tsx\n      IssueCard.tsx\npublic\u002F\n  favicon.svg\nscripts\u002F\n  service.ts             # wrapper cross-platform (Windows\u002FmacOS)\n  win\u002F\n    install.ps1          # NSSM install\n    uninstall.ps1        # NSSM uninstall\n  macos\u002F\n    sentinel.plist.template  # plantilla launchd\ndata\u002F                # generado en runtime (sqlite + logs)\n```\n\n---\n\n## Gestionar el servicio (Windows y macOS)\n\nTodo se hace con un único set de scripts de `package.json`. El wrapper\n[`scripts\u002Fservice.ts`](.\u002Fscripts\u002Fservice.ts) detecta la plataforma y delega\nen el backend correcto: **NSSM en Windows**, **launchd en macOS**.\n\n```bash\nbun service:install     # instala y arranca como servicio del sistema\nbun service:uninstall   # detiene, desinstala y opcionalmente borra data\u002F\nbun service:start\nbun service:stop\nbun service:restart\nbun service:status\nbun service:logs        # tail -f del log en data\u002Fsentinel.log\n```\n\nEn ambos sistemas, al instalar:\n\n- El servicio queda configurado para **arrancar automáticamente** al iniciar el equipo.\n- Si el proceso cae, se **reinicia solo** (NSSM en Windows, `KeepAlive` en launchd).\n- **Logs** centralizados en `data\u002Fsentinel.log`.\n- El stop envía **SIGTERM**, no `kill -9`, así que el shutdown handler cierra SQLite limpio.\n\n### Requisitos en Windows\n\n1. [Bun para Windows](https:\u002F\u002Fbun.com\u002Fdocs\u002Finstallation#windows) en el PATH (`%USERPROFILE%\\.bun\\bin\\bun.exe`).\n2. [NSSM](https:\u002F\u002Fnssm.cc\u002Fdownload) en el PATH:\n   - Chocolatey: `choco install nssm`\n   - Scoop: `scoop install nssm`\n3. PowerShell **elevado** (Administrador) para `service:install` y `service:uninstall`.\n\n```powershell\n# Desde la carpeta del proyecto, en PowerShell admin:\nbun install\nbun service:install\n```\n\nEl backend Windows ejecuta [`scripts\u002Fwin\u002Finstall.ps1`](.\u002Fscripts\u002Fwin\u002Finstall.ps1)\nque registra el servicio `GitHubSentinel` con NSSM:\n\n- Ejecutable: `bun.exe src\u002Fserver\u002Findex.ts`\n- Logs rotados: `data\\sentinel.log`, max 5 MB o 24 h por archivo.\n- Stop con Ctrl+C con 10 s de gracia, kill del árbol de procesos si no responde.\n- Reinicio automático tras 5 s si cae.\n\n### Requisitos en macOS\n\n1. Bun instalado (lo detecta en `~\u002F.bun\u002Fbin\u002Fbun`, Homebrew o `\u002Fusr\u002Flocal`).\n2. Nada más. No requiere `sudo` porque el servicio se instala como **LaunchAgent**\n   del usuario (`~\u002FLibrary\u002FLaunchAgents\u002Fcom.midudev.github-sentinel.plist`).\n\n```bash\nbun install\nbun service:install\n```\n\nEl backend macOS renderiza el plist desde [`scripts\u002Fmacos\u002Fsentinel.plist.template`](.\u002Fscripts\u002Fmacos\u002Fsentinel.plist.template),\nsustituye `__PROJECT_DIR__`, `__BUN_PATH__` y `__PATH__`, lo copia a\n`~\u002FLibrary\u002FLaunchAgents\u002F` y hace `launchctl load -w`. `KeepAlive=true` y\n`RunAtLoad=true` se encargan del resto.\n\n### Personalizar el nombre del servicio (Windows)\n\nSi quieres llamarlo de otra forma:\n\n```powershell\n$env:SENTINEL_SERVICE_NAME = \"MiSentinel\"\nbun service:install\n```\n\n### Comandos avanzados (si los necesitas)\n\nSi prefieres saltarte el wrapper, puedes invocar los scripts directamente:\n\n```powershell\n# Windows\n.\\scripts\\win\\install.ps1   -ServiceName GitHubSentinel\n.\\scripts\\win\\uninstall.ps1 -KeepData\n```\n\n```bash\n# macOS\nlaunchctl list | grep github-sentinel\nlaunchctl unload -w ~\u002FLibrary\u002FLaunchAgents\u002Fcom.midudev.github-sentinel.plist\n```\n\n### Otras alternativas en Windows (sin NSSM)\n\nSi no quieres NSSM, tienes dos opciones manuales:\n\n**Tarea Programada**: `taskschd.msc` → crear tarea \"Al iniciar el equipo\" →\nejecutar `C:\\Users\\TU_USUARIO\\.bun\\bin\\bun.exe src\u002Fserver\u002Findex.ts` desde\nla carpeta del proyecto. En propiedades marca \"Ejecutar con los privilegios\nmás altos\" y \"Reiniciar si falla\".\n\n**PM2**:\n```powershell\nnpm i -g pm2 pm2-windows-startup\npm2-startup install\npm2 start \"bun src\u002Fserver\u002Findex.ts\" --name github-sentinel --cwd C:\\ruta\\github-sentinel\npm2 save\n```\n\n---\n\n## Notas para Windows\n\n- **WAL en SSD local**. SQLite usa modo WAL (más rápido y resistente a cortes). No pongas el `data\u002F` en OneDrive, Dropbox ni unidades de red, no es seguro con WAL.\n- **Windows Defender**. Excluye la carpeta `data\\` de escaneo en tiempo real, si no se pondrá a leer el `.db-wal` constantemente y notarás latencia.\n- **Firewall**. Para acceder al dashboard desde otro equipo de la LAN:\n  ```powershell\n  New-NetFirewallRule -DisplayName \"GitHub Sentinel\" -Direction Inbound -Protocol TCP -LocalPort 3741 -Action Allow\n  ```\n  Luego: `http:\u002F\u002FIP-DEL-MINIPC:3741`.\n- **Suspensión**. Desactívala en Configuración → Sistema → Inicio\u002Fapagado → \"Nunca\" para PC y para suspensión.\n- **LLM API**. Si el servidor vive en otra máquina, pon `LLM_URL=http:\u002F\u002F192.168.x.x:PUERTO\u002Fv1` en `.env` y abre ese puerto en su firewall.\n\n---\n\n## Scripts disponibles\n\n```bash\n# Desarrollo\nbun dev                  # servidor con HMR\nbun start                # producción simple\nbun start:prod           # producción con NODE_ENV=production\nbun build                # build estático del cliente (opcional)\n\n# Gestión del servicio (Windows + macOS)\nbun service:install      # instala y arranca como servicio del sistema\nbun service:uninstall    # desinstala (pregunta si borrar data\u002F)\nbun service:start\nbun service:stop\nbun service:restart\nbun service:status\nbun service:logs         # tail -f data\u002Fsentinel.log\n```\n\n---\n\n## Roadmap\n\n- v0.2 — clonar repo y aportar contexto real al LLM (ripgrep + heurística)\n- v0.3 — ejecutar tests en Docker para validar propuestas\n- v0.4 — generar patch (`git diff`) en lugar de prosa\n- v0.5 — abrir PR en draft desde el sentinel\n- v0.6 — soporte de webhooks (push-based en vez de polling)\n- v0.7 — notificaciones a Telegram \u002F Discord\n\n---\n\n## Licencia\n\nMIT\n","GitHub Sentinel 是一个本地代理工具，用于监控你的GitHub仓库并提醒你有关新问题的信息。它通过GitHub REST API定期检查新issue，并使用兼容OpenAI API的LLM（大语言模型）生成摘要和解决方案建议，所有操作均在本地网络中完成以保证数据安全。该项目采用TypeScript编写，基于Bun运行时环境，前端使用React构建界面，后端则利用SQLite存储数据。特别适合需要持续关注多个GitHub项目动态的技术团队或个人开发者，在保持隐私的同时获得高效的问题管理支持。","2026-06-11 04:05:32","CREATED_QUERY"]