{"id":49222692,"url":"https://github.com/megaphone-tokyo/kioku","last_synced_at":"2026-04-24T05:00:35.367Z","repository":{"id":351795471,"uuid":"1212291889","full_name":"megaphone-tokyo/kioku","owner":"megaphone-tokyo","description":"Memory for Claude Code — auto-accumulate sessions into an Obsidian Wiki","archived":false,"fork":false,"pushed_at":"2026-04-24T01:27:57.000Z","size":959,"stargazers_count":3,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-24T02:32:09.046Z","etag":null,"topics":["ai","automation","claude","claude-code","claude-desktop","hooks","karpathy","knowledge-base","llm","mcp","mcp-server","obsidian","second-brain","wiki"],"latest_commit_sha":null,"homepage":"https://zenn.dev/megaphone/articles/af2b2a05531912","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/megaphone-tokyo.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.ja.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-16T08:29:36.000Z","updated_at":"2026-04-24T01:28:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/megaphone-tokyo/kioku","commit_stats":null,"previous_names":["megaphone-tokyo/kioku"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/megaphone-tokyo/kioku","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megaphone-tokyo%2Fkioku","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megaphone-tokyo%2Fkioku/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megaphone-tokyo%2Fkioku/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megaphone-tokyo%2Fkioku/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/megaphone-tokyo","download_url":"https://codeload.github.com/megaphone-tokyo/kioku/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megaphone-tokyo%2Fkioku/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32209895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T03:15:14.334Z","status":"ssl_error","status_checked_at":"2026-04-24T03:15:11.608Z","response_time":64,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","automation","claude","claude-code","claude-desktop","hooks","karpathy","knowledge-base","llm","mcp","mcp-server","obsidian","second-brain","wiki"],"created_at":"2026-04-24T05:00:28.075Z","updated_at":"2026-04-24T05:00:35.354Z","avatar_url":"https://github.com/megaphone-tokyo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Este manual está disponible en varios idiomas\n\n\u003e [!NOTE]\n\u003e **🌐 Otros idiomas:** [🇬🇧 English](README.md) · [🇯🇵 日本語](README.ja.md) · [🇹🇼 繁體中文](README.zh-TW.md) · [🇨🇳 简体中文](README.zh-CN.md) · [🇮🇳 हिन्दी](README.hi.md) · 🇪🇸 **Español** · [🇧🇷 Português](README.pt-BR.md) · [🇰🇷 한국어](README.ko.md) · [🇫🇷 Français](README.fr.md) · [🇷🇺 Русский](README.ru.md)\n\n\u003cbr\u003e\n\n# KIOKU\n### Memory for Claude Code\n\n\u003csub\u003e*KIOKU means \"memory\" in Japanese*\u003c/sub\u003e\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](../../LICENSE)\n[![Claude Code](https://img.shields.io/badge/Claude_Code-Max_Plan-orange)](https://claude.com/claude-code)\n[![Platform](https://img.shields.io/badge/platform-macOS_%7C_Linux-lightgrey)](#prerequisites)\n[![Follow @megaphone_tokyo](https://img.shields.io/twitter/follow/megaphone_tokyo?style=social)](https://x.com/megaphone_tokyo)\n\nClaude Code olvida el conocimiento adquirido en sesiones anteriores.\nclaude-brain **acumula automáticamente tus conversaciones en una Wiki** y **las recupera en la siguiente sesión**.\n\nYa no necesitas repetir las mismas explicaciones una y otra vez. Un 'second brain' que crece con cada uso — para tu Claude.\n\n\u003cbr\u003e\n\n### Notas importantes\n\n\u003e [!CAUTION]\n\u003e claude-brain actualmente requiere **Claude Code (plan Max)**. El sistema de Hooks (L0) y la inyeccion de contexto del Wiki son funcionalidades especificas de Claude Code. El pipeline de Ingest/Lint (L1/L2) puede funcionar con otras APIs de LLM sustituyendo la llamada a `claude -p` — esto esta planificado como una mejora futura.\n\n\u003e [!WARNING]\n\u003e **Entiende antes de instalar:** claude-brain se conecta a **toda la E/S de las sesiones de Claude Code**. Esto significa:\n\u003e - Los registros de sesión pueden contener **claves API, tokens o información personal** de tus prompts y la salida de herramientas. El enmascaramiento cubre los patrones principales pero no es exhaustivo — consulta [SECURITY.md](SECURITY.md)\n\u003e - Si `.gitignore` está mal configurado, los registros de sesión podrían ser **enviados accidentalmente a GitHub**\n\u003e - El pipeline de auto-ingest envía el contenido de los registros de sesión a Claude a través de `claude -p` para la extracción al Wiki\n\u003e\n\u003e Recomendamos comenzar con `KIOKU_DRY_RUN=1` para verificar el pipeline antes de habilitar la operación completa.\n\n\u003e [!IMPORTANT]\n\u003e Este software se proporciona **\"tal cual\"**, sin garantia de ningun tipo. Los autores no asumen **ninguna responsabilidad** por cualquier perdida de datos, incidentes de seguridad o danos derivados del uso de esta herramienta. Uselo bajo su propio riesgo. Consulte [LICENSE](../../LICENSE) para los terminos completos.\n\n\u003cbr\u003e\n\n## Qué hace\n\n```\n🗣️  Conversa con Claude Code como siempre\n         ↓  （todo se registra automáticamente — no necesitas hacer nada）\n📝  Los registros de sesión se guardan localmente\n         ↓  （una tarea programada le pide a la IA leer los registros y extraer conocimiento）\n📚  La Wiki crece con cada sesión — conceptos, decisiones, patrones\n         ↓  （sincronizado via Git）\n☁️  GitHub mantiene tu Wiki respaldada y compartida entre máquinas\n```\n\n1. **Captura automática (L0)**: Captura eventos de hooks de Claude Code (`UserPromptSubmit` / `Stop` / `PostToolUse` / `SessionEnd`) y escribe Markdown en `session-logs/`\n2. **Estructuración (L1)**: La ejecución programada (macOS LaunchAgent / Linux cron) hace que el LLM lea los logs no procesados y construya páginas de conceptos, páginas de proyectos y decisiones de diseño en `wiki/`. Los análisis de sesiones también se guardan en `wiki/analyses/`\n3. **Verificación de integridad (L2)**: La comprobación mensual de salud del wiki genera `wiki/lint-report.md`. Incluye detección automática de fugas de secretos\n4. **Sincronización (L3)**: El Vault en sí es un repositorio Git. `SessionStart` ejecuta `git pull`, `SessionEnd` ejecuta `git commit \u0026\u0026 git push`, sincronizando entre máquinas a través de un repositorio privado en GitHub\n5. **Inyección de contexto del wiki**: En `SessionStart`, `wiki/index.md` se inyecta en el prompt del sistema para que Claude pueda aprovechar el conocimiento previo\n6. **Búsqueda de texto completo qmd**: Busca en el wiki a través de MCP con BM25 + búsqueda semántica\n7. **Skills de Wiki Ingest**: Los comandos slash `/wiki-ingest-all` y `/wiki-ingest` importan conocimiento existente del proyecto al Wiki\n8. **Aislamiento de secretos**: `session-logs/` permanece local en cada máquina (`.gitignore`). Solo `wiki/` / `raw-sources/` / `templates/` / `CLAUDE.md` se gestionan con Git\n\n\u003cbr\u003e\n\n## Requisitos previos\n\n| | Versión / Requisito |\n|---|---|\n| macOS | 13+ recomendado |\n| Node.js | 18+ (los scripts de hooks son `.mjs` ES Modules, sin dependencias externas) |\n| Bash | 3.2+ (predeterminado en macOS) |\n| Git | 2.x+. Debe soportar `git pull --rebase` / `git push` |\n| GitHub CLI | Opcional (`gh` simplifica la creación de repos privados) |\n| Claude Code | Versión con soporte del sistema de Hooks (`~/.claude/settings.json`) |\n| Obsidian | Un Vault creado en cualquier carpeta (no se requiere iCloud Drive) |\n| jq | 1.6+ (usado por `install-hooks.sh --apply`) |\n| Variable de entorno | `OBSIDIAN_VAULT` apuntando a la raíz del Vault |\n\n\u003cbr\u003e\n\n## Inicio rápido\n\n### 1. Crear un Vault y conectarlo a un repositorio Git (manual)\n\n1. Crea un nuevo Vault en Obsidian (por ejemplo, `~/claude-brain/main-claude-brain`)\n2. Crea un repositorio privado en GitHub (por ejemplo, `claude-brain`)\n3. En el directorio del Vault: `git init \u0026\u0026 git remote add origin ...` (o `gh repo create --private --source=. --push`)\n\nEste paso no está automatizado por los scripts de claude-brain. La autenticación con GitHub (gh CLI / claves SSH) depende de tu entorno.\n\n### 2. Configurar la variable de entorno\n\n```bash\n# Añadir a ~/.zshrc o ~/.bashrc\nexport OBSIDIAN_VAULT=\"$HOME/claude-brain/main-claude-brain\"\n```\n\n### 3. Inicializar el Vault\n\n```bash\n# Crea raw-sources/, session-logs/, wiki/, templates/ dentro del Vault,\n# coloca CLAUDE.md / .gitignore / plantillas iniciales (nunca sobrescribe archivos existentes)\nbash tools/claude-brain/scripts/setup-vault.sh\n```\n\n### 4. Instalar los Hooks\n\n```bash\n# Opción A: Fusión automática (recomendado, requiere jq)\nbash tools/claude-brain/scripts/install-hooks.sh --apply\n# Crea respaldo → muestra diff → solicita confirmación → añade entradas de hooks preservando la configuración existente\n\n# Opción B: Fusión manual\nbash tools/claude-brain/scripts/install-hooks.sh\n# Muestra el fragmento JSON en stdout para fusionar manualmente en ~/.claude/settings.json\n```\n\n### 5. Verificar\n\nReinicia Claude Code y mantén una conversación.\nDebería aparecer `$OBSIDIAN_VAULT/session-logs/YYYYMMDD-HHMMSS-\u003cid\u003e-\u003cprompt\u003e.md`.\n\n### 6. Configurar la ejecución programada (recomendado)\n\nConfigura Ingest automático (diario) y Lint (mensual).\n\n```bash\n# Detecta automáticamente el SO: macOS → LaunchAgent, Linux → cron\nbash tools/claude-brain/scripts/install-schedule.sh\n\n# Prueba primero con DRY RUN\nKIOKU_DRY_RUN=1 bash tools/claude-brain/scripts/auto-ingest.sh\nKIOKU_DRY_RUN=1 bash tools/claude-brain/scripts/auto-lint.sh\n```\n\n\u003e **Nota para macOS**: Colocar el repositorio en `~/Documents/` o `~/Desktop/` puede hacer que TCC (Transparency, Consent, Control) bloquee el acceso en segundo plano con EPERM. Usa una ruta fuera de los directorios protegidos (por ejemplo, `~/_PROJECT/`).\n\n### 7. Configurar el motor de búsqueda qmd (opcional)\n\nHabilita la búsqueda de texto completo y semántica del Wiki mediante MCP.\n\n```bash\nbash tools/claude-brain/scripts/setup-qmd.sh\nbash tools/claude-brain/scripts/install-qmd-daemon.sh\n```\n\n### 8. Instalar los skills de Wiki Ingest (opcional)\n\n```bash\nbash tools/claude-brain/scripts/install-skills.sh\n```\n\n### 9. Desplegar en máquinas adicionales\n\n```bash\ngit clone git@github.com:\u003cUSERNAME\u003e/claude-brain.git ~/claude-brain/main-claude-brain\n# Abre ~/claude-brain/main-claude-brain/ como Vault en Obsidian\n# Repite los pasos 2–6\n```\n\n\u003cbr\u003e\n\n## Estructura de directorios\n\n```\ntools/claude-brain/\n├── README.md                        ← Este archivo\n├── context/                         ← Implementación actual (INDEX + documentos por funcionalidad)\n├── handoff/                         ← Notas de traspaso para la próxima sesión\n├── plan/\n│   ├── user/                      ← Instrucciones de diseño del usuario\n│   └── claude/                      ← Especificaciones de implementación de Claude\n├── hooks/\n│   ├── session-logger.mjs           ← Punto de entrada del Hook (UserPromptSubmit/Stop/PostToolUse/SessionEnd)\n│   └── wiki-context-injector.mjs    ← SessionStart: inyecta wiki/index.md en el prompt del sistema\n├── skills/\n│   ├── wiki-ingest-all/SKILL.md     ← Comando slash para importación masiva de proyecto al Wiki\n│   └── wiki-ingest/SKILL.md         ← Comando slash para escaneo dirigido\n├── templates/\n│   ├── vault/                       ← Archivos raíz del Vault (CLAUDE.md, .gitignore)\n│   ├── notes/                       ← Plantillas de notas (concept, project, decision, source-summary)\n│   ├── wiki/                        ← Archivos iniciales del wiki (index.md, log.md)\n│   └── launchd/*.plist.template     ← Plantillas de macOS LaunchAgent\n├── scripts/\n│   ├── setup-vault.sh               ← Inicialización del Vault (idempotente)\n│   ├── install-hooks.sh             ← Salida del fragmento de configuración del Hook / --apply para fusión automática\n│   ├── auto-ingest.sh               ← Programado: ingesta de logs no procesados al wiki\n│   ├── auto-lint.sh                 ← Programado: informe de salud del wiki + escaneo de secretos\n│   ├── install-cron.sh              ← Muestra entradas de cron en stdout\n│   ├── install-schedule.sh          ← Despachador según SO (macOS → LaunchAgent / Linux → cron)\n│   ├── install-launchagents.sh      ← Instalador de macOS LaunchAgent\n│   ├── setup-qmd.sh                 ← Registro de colección qmd + indexación inicial\n│   ├── install-qmd-daemon.sh        ← Servidor HTTP MCP de qmd como daemon de launchd\n│   ├── install-skills.sh            ← Enlace simbólico de skills wiki-ingest a ~/.claude/skills/\n│   └── scan-secrets.sh              ← Detección de fugas de secretos en session-logs/\n└── tests/                           ← node --test y pruebas de humo en bash\n```\n\n\u003cbr\u003e\n\n## Variables de entorno\n\n| Variable | Valor predeterminado | Propósito |\n|---|---|---|\n| `OBSIDIAN_VAULT` | ninguno (requerido) | Raíz del Vault. auto-ingest/lint recurren a `${HOME}/claude-brain/main-claude-brain` como alternativa |\n| `KIOKU_DRY_RUN` | `0` | `1` para omitir llamadas a `claude -p` (solo verificación de rutas) |\n| `KIOKU_NO_LOG` | no definido | `1` para suprimir session-logger.mjs (previene el registro recursivo desde subprocesos de cron) |\n| `KIOKU_DEBUG` | no definido | `1` para emitir información de depuración a stderr y `session-logs/.claude-brain/errors.log` |\n| `KIOKU_INGEST_LOG` | `$HOME/kioku-ingest.log` | Ruta del log de Ingest (referenciado por el autodiagnóstico de auto-lint) |\n\n### Configuración de PATH para gestores de versiones de Node\n\nLos scripts programados (`auto-ingest.sh`, `auto-lint.sh`) se ejecutan desde cron / LaunchAgent y no heredan el PATH de tu shell interactiva. Añaden Volta (`~/.volta/bin`) y mise (`~/.local/share/mise/shims`) al PATH. **Si usas nvm / fnm / asdf u otro gestor de versiones**, edita la línea `export PATH=...` en la parte superior de cada script:\n\n```bash\n# ejemplo con nvm\nexport PATH=\"${HOME}/.nvm/versions/node/v22.0.0/bin:${PATH}\"\n\n# ejemplo con fnm\nexport PATH=\"${HOME}/.local/share/fnm/aliases/default/bin:${PATH}\"\n```\n\n\u003cbr\u003e\n\n## Notas de diseño\n\n- **Los logs de sesión contienen secretos**: Los prompts y la salida de herramientas pueden incluir claves API, tokens o información personal. `session-logger.mjs` aplica enmascaramiento con expresiones regulares antes de escribir\n- **Límite de escritura**: Los Hooks solo escriben en `$OBSIDIAN_VAULT/session-logs/`. Nunca tocan `raw-sources/`, `wiki/` ni `templates/`\n- **session-logs nunca llega a Git**: Excluido por `.gitignore`, minimizando el riesgo de envíos accidentales a GitHub\n- **Sin acceso a la red**: Los scripts de hooks (`session-logger.mjs`) no importan `http`/`https`/`net`/`dgram`. La sincronización Git se maneja con comandos shell de una línea en la configuración del Hook\n- **Idempotente**: `setup-vault.sh` / `install-hooks.sh` pueden ejecutarse múltiples veces sin destruir archivos existentes\n- **Sin git init**: `setup-vault.sh` no inicializa un repositorio Git ni añade remotos. La autenticación con GitHub es responsabilidad del usuario\n\n\u003cbr\u003e\n\n## Seguridad\n\nclaude-brain es un sistema de Hooks que accede a **toda la E/S de las sesiones de Claude Code**.\nConsulta [SECURITY.md](SECURITY.md) para el diseño de seguridad completo.\n\n### Capas de defensa\n\n| Capa | Descripción |\n|---|---|\n| **Validación de entrada** | La ruta de `OBSIDIAN_VAULT` se verifica en busca de metacaracteres de shell y caracteres de control JSON/XML |\n| **Enmascaramiento** | Claves API (Anthropic / OpenAI / GitHub / AWS / Slack / Vercel / npm / Stripe / Supabase / Firebase / Azure), autenticación Bearer/Basic, credenciales en URL, claves privadas PEM se reemplazan con `***` |\n| **Permisos** | `session-logs/` se crea con `0o700`, archivos de log con `0o600`. Los scripts de hooks se configuran con `chmod 755` |\n| **Protección .gitignore** | Verifica que `.gitignore` contenga `session-logs/` antes de cada git commit |\n| **Prevención de recursión** | `KIOKU_NO_LOG=1` + verificación de cwd-in-vault (doble protección) previene el registro recursivo desde subprocesos |\n| **Restricción de permisos del LLM** | auto-ingest / auto-lint ejecutan `claude -p` con `--allowedTools Write,Read,Edit` (sin Bash) |\n| **Escaneo periódico** | `scan-secrets.sh` escanea session-logs/ mensualmente en busca de patrones de tokens conocidos para detectar fallos de enmascaramiento |\n\n### Añadir patrones de tokens\n\nCuando empieces a usar un nuevo servicio en la nube, añade su patrón de token tanto a `hooks/session-logger.mjs` (`MASK_RULES`) como a `scripts/scan-secrets.sh` (`PATTERNS`).\n\n### Reportar vulnerabilidades\n\nSi encuentras un problema de seguridad, repórtalo a través de [SECURITY.md](SECURITY.md) — no mediante Issues públicos.\n\n\u003cbr\u003e\n\n## Cambios\n\n### 2026-04-24 — v0.6.0: Expansion del ecosistema — multi-agente + marketplace de plugins + dashboard Bases + delta tracking + endurecimiento de seguridad\n\nv0.6.0 consolida Phase C: canales de distribucion, dashboards nativos de Obsidian, ingest resistente a regresiones, y actualizacion de politica de seguridad.\n\n- **Multi-agente cross-platform (C-1)** — `scripts/setup-multi-agent.sh` crea symlinks en Codex / OpenCode / Gemini CLI. 19/19 aserciones Bash\n- **Marketplace Claude Code (C-2)** — `claude marketplace add megaphone-tokyo/kioku \u0026\u0026 claude plugin install kioku@megaphone-tokyo`\n- **Delta tracking sha256 (C-3)** — Archivos MD colocados en `raw-sources/\u003csubdir\u003e/*.md` ahora participan en la deteccion delta. 82/82 aserciones auto-ingest\n- **Dashboard Obsidian Bases (C-4)** — `templates/wiki/meta/dashboard.base` con 9 vistas\n- **Cimientos Visualizer (V-1, v0.7)** — `mcp/lib/git-history.mjs` + `mcp/lib/wiki-snapshot.mjs`, 14/14 aserciones Node\n- **Politica de seguridad (C-5a)** — CVE Classification / Safe Harbor / Coordinated Disclosure Timeline. `SECURITY.ja.md` 4/7 secciones\n- **Canal comunitario** — Discord dedicado descartado, GitHub Discussions canonico\n- **LEARN organizacional** — LEARN#10 (script verify en handoff PM)\n- **Diferido v0.7+** — UI HTML Visualizer, LP β, GitHub Discussions, 3 secciones SECURITY.ja restantes\n- Tests: **Node 264/264 + Bash 400+/400+ verdes**\n- [Release v0.6.0](https://github.com/megaphone-tokyo/kioku/releases/tag/v0.6.0) — `kioku-wiki-0.6.0.mcpb` (~9 MB)\n\n### 2026-04-23 — v0.5.1: Hot cache + hook PostCompact + prompt Stop opt-in\n\n- **Patron hot cache** — Nuevo `wiki/hot.md` (\u003c=500 palabras, limite rigido 4000 caracteres) se inyecta automaticamente en **SessionStart** y se reinyecta tras **PostCompact** (compactacion de contexto), para que el LLM conserve el contexto de trabajo a corto plazo entre sesiones y compactaciones. Inspirado en el patron UX de claude-obsidian\n- **Hook PostCompact** — `install-hooks.sh` ahora cablea un 6.o evento (`PostCompact`) que reinyecta solo hot.md (index.md ya esta en el contexto tras la compactacion, asi que se omite para evitar inflado de tokens)\n- **Prompt Stop opt-in** (`KIOKU_HOT_AUTO_PROMPT=1`) — Cuando se establece explicitamente, el final de sesion dispara una sugerencia de actualizacion para hot.md. **Por defecto OFF** — hot.md esta sincronizado por Git y tiene un limite de seguridad mas estricto que session-logs, por lo que el prompt automatico requiere consentimiento explicito del usuario\n- **Limite de seguridad mantenido** — hot.md pasa por `applyMasks()` (enmascarado de API key / token) antes de la inyeccion, esta en el objetivo del walk de scan-secrets.sh, rechaza symlink escape via `realpath` (rutas externas al vault rechazadas) y trunca en 4000 caracteres con log WARN\n- **Alineacion con schema de hook de Claude Code v2 (4 hotfixes)** — Claude Code v2 usa distintos schemas de salida por evento: `hookSpecificOutput` solo se admite para `PreToolUse` / `UserPromptSubmit` / `PostToolUse`; `PostCompact` y `Stop` deben usar `systemMessage` de nivel superior. El antiguo v1 flat `{additionalContext}` se descarta silenciosamente en v2. Los hotfixes 1-4 migran toda la salida de hooks al schema correcto por evento\n- Tests: **47 aserciones Node** (HOT-1..9d + HOT-V1/V2 + regresion session-logger + H1-H5 injector) **+ 488 aserciones Bash** (IH-PC1/2 + SS-H1 + cron-guard-parity CGP-2 + 15 suites existentes), todo verde\n- [Release v0.5.1](https://github.com/megaphone-tokyo/kioku/releases/tag/v0.5.1) — `kioku-wiki-0.5.1.mcpb` adjunto (9.2 MB)\n\n### 2026-04-23 — v0.5.0: funcionalidad 2.4 — router unificado de ingest para PDF / MD / EPUB / DOCX\n\n- **Fase 1** — Router `kioku_ingest_document`: una herramienta MCP unificada que despacha por extensión de archivo (`.pdf` / `.md` / `.epub` / `.docx`) al handler correspondiente. El `kioku_ingest_pdf` existente pasa a ser un alias de deprecación que se mantendrá durante la ventana v0.5 – v0.7; su eliminación está planificada para v0.8\n- **Fase 2** — Ingesta de EPUB: extracción segura mediante yauzl con defensa en 8 capas (zip-slip / symlink / límite de tamaño acumulado / límite de conteo de entradas / nombres de archivo NFKC / skip de ZIP anidados / pre-scan XXE / sanitización de scripts en XHTML). Los capítulos en orden de spine se convierten a chunks Markdown (`readability-extract` + `turndown`), guardados en `.cache/extracted/epub-\u003csubdir\u003e--\u003cstem\u003e-ch\u003cNNN\u003e.md`; los EPUB multicapítulo también obtienen un `-index.md`. Los resúmenes del LLM fluyen de forma asíncrona por el cron de auto-ingest\n- **Fase 3** — Ingesta de DOCX (MVP): arquitectura en dos capas `mammoth + yauzl` (la superficie de ataque interna de jszip en mammoth queda pre-protegida por la defensa en 8 capas de yauzl). `word/document.xml` / `docProps/core.xml` pasan por un pre-scan XXE (`assertNoDoctype`). Las imágenes (VULN-D004/D007) y el contenido OLE embebido (VULN-D006) quedan diferidos — el MVP extrae únicamente texto del cuerpo + encabezados. Los metadatos se encierran en una valla `--- DOCX METADATA ---` con la anotación **untrusted** para delimitar la inyección de prompts en el resumen posterior del LLM\n- **Hotfix pre-release** — Corregido el regex de argv en `scripts/extract-docx.mjs` / `scripts/extract-epub.mjs` para que sea Unicode-aware (`\\p{L}\\p{N}`); el `\\w` anterior (solo ASCII) saltaba silenciosamente nombres de archivo en japonés / chino como `論文.docx` / `日本語.epub` en la ruta del cron de auto-ingest. EPUB estaba en esta regresión latente desde v0.4.0 y queda arreglado retroactivamente (LEARN#6 cross-boundary drift). Adicionalmente, `meta` / `base` / `link` fueron añadidos a los `DANGEROUS_TAGS` de `html-sanitize` como defensa en profundidad para futuras rutas de consumidores de EPUB\n- **Problema conocido (no aplicable)** — `fast-xml-parser` CVE-2026-41650 ([GHSA-gh4j-gqv2-49f6](https://github.com/NaturalIntelligence/fast-xml-parser/security/advisories/GHSA-gh4j-gqv2-49f6), medium) afecta a la API **XMLBuilder** (escritor de XML). Este código base utiliza únicamente **XMLParser** (lector de XML) en `mcp/lib/xml-safe.mjs`, por lo que la vulnerabilidad no es explotable. La dependencia se actualizará a `fast-xml-parser@^5.7.0` en **v0.5.1** para silenciar la alerta de dependabot\n- Tests: **158 aserciones Bash + suite Node completa en verde** (extract-docx 16 / extract-epub 7 / html-sanitize 10 / auto-ingest 70 / cron-guard-parity 25 / capa MCP 30). `npm audit` reporta **0 vulnerabilidades** en dependencias runtime; los informes `/security-review` paralelos red-hacker + blue-hacker reportan **0 hallazgos HIGH/CRITICAL**\n- [Release v0.5.0](https://github.com/megaphone-tokyo/kioku/releases/tag/v0.5.0) — `kioku-wiki-0.5.0.mcpb` adjunto (9.2 MB)\n\n### 2026-04-21 — v0.4.0: revisión de Tier A (seguridad + operaciones) + Tier B (limpieza)\n\n- **A#1** — Actualización de `@mozilla/readability` 0.5 → 0.6 (ReDoS [GHSA-3p6v-hrg8-8qj7](https://github.com/advisories/GHSA-3p6v-hrg8-8qj7) mitigado; 144 dependencias de producción pasan `npm audit` sin alertas)\n- **A#2** — Añadida la guarda `git symbolic-ref -q HEAD` en `auto-ingest.sh` / `auto-lint.sh` / `install-hooks.sh` SessionEnd, evitando commits descontrolados cuando el Vault está en estado detached-HEAD (observada una deriva de 5 días en una máquina antes del fix)\n- **A#3** — Refactorizado `withLock` (tiempo de bloqueo reducido de minutos a segundos), eliminada por completo la API `skipLock` y añadida la limpieza de PDFs huérfanos\n- **B#1** — Re-auditoría de la capa Hook (`session-logger.mjs`): corregidos 3 hallazgos MEDIUM (bypass del masking por caracteres invisibles, YAML injection en el frontmatter, deriva de strict-equality en `KIOKU_NO_LOG`)\n- **B#2** — Formalizada la paridad de guardas cron/setup como `tests/cron-guard-parity.test.sh` (17 aserciones) para hacer cumplir las convenciones de override de env Categoría-A / Categoría-B\n- **B#3** — Evitada la condición de carrera entre máquinas en `sync-to-app.sh` mediante `check_github_side_lock` (guarda α, ventana predeterminada de 120s, configurable con `KIOKU_SYNC_LOCK_MAX_AGE`); regresión asegurada por `tests/sync-to-app.test.sh` (11 aserciones)\n- **B#8** — Paridad i18n del README: secciones §10 MCP / §11 MCPB / Cambios añadidas a los 8 READMEs que no son en/ja (+1384 líneas)\n- Tests: **299 Node tests** + **15 Bash suites / 415 aserciones**, todos en verde\n- [Release v0.4.0](https://github.com/megaphone-tokyo/kioku/releases/tag/v0.4.0) — `.mcpb` adjunto\n\n### 2026-04-17 — Fase N: paquete MCPB para Claude Desktop\n- Nuevo `mcp/manifest.json` (MCPB v0.4) y `scripts/build-mcpb.sh` generan `mcp/dist/kioku-wiki-\u003cversion\u003e.mcpb` (~3.2 MB)\n- Los usuarios de Claude Desktop pueden instalar el servidor MCP arrastrando un solo archivo. `OBSIDIAN_VAULT` se configura mediante el selector de directorio en el diálogo de instalación (no requiere Node en la máquina del usuario — Desktop usa su runtime incorporado)\n- Para instrucciones detalladas consulta [README.md](README.md) o [README.ja.md](README.ja.md)\n\n### 2026-04-17 — Fase M: servidor MCP kioku-wiki\n- Servidor MCP local stdio (`tools/claude-brain/mcp/`) que expone seis herramientas — `kioku_search`, `kioku_read`, `kioku_list`, `kioku_write_note`, `kioku_write_wiki`, `kioku_delete`\n- Tanto Claude Desktop como Claude Code pueden ahora navegar, buscar y actualizar el Wiki sin salir del chat\n- Para instrucciones de configuración consulta [README.md](README.md) o [README.ja.md](README.ja.md)\n\n### 2026-04-16 — Fase L: migración a macOS LaunchAgent\n- El nuevo despachador `scripts/install-schedule.sh` selecciona LaunchAgent (macOS) o cron (Linux) automáticamente\n\n\u003cbr\u003e\n\n## Referencias\n\n- [Karpathy's LLM Wiki Gist](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) — El concepto original que este proyecto implementa\n- [Claude Code Hooks Reference](https://docs.claude.com/en/docs/claude-code/hooks) — Documentacion oficial del sistema de Hooks\n- [Obsidian](https://obsidian.md/) — La aplicacion de gestion del conocimiento utilizada como visor del Wiki\n- [qmd](https://github.com/tobi/qmd) — Motor de busqueda local para Markdown (BM25 + busqueda vectorial)\n\n## Autor\n\n**[@megaphone_tokyo](https://x.com/megaphone_tokyo)**\n\nConstruyendo cosas con codigo e IA. Ingeniero freelance con 10 anos de experiencia. Enfocado en frontend, ultimamente co-desarrollando con Claude como mi flujo de trabajo principal.\n\n[Sígueme en X](https://x.com/megaphone_tokyo)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegaphone-tokyo%2Fkioku","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmegaphone-tokyo%2Fkioku","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegaphone-tokyo%2Fkioku/lists"}