claude-session-continuity-mcp

Continuidad de sesión sin configuración para Claude Code. Captura automática de contexto mediante Claude Hooks, proporciona 24 herramientas para memoria, tareas, soluciones y grafo de conocimiento. Búsqueda semántica multilingüe (más de 94 idiomas).

Documentación

passbaton

Continuidad de sesión para agentes de codificación con IA. Tu agente retoma donde lo dejó — nunca vuelvas a explicar tu proyecto. Memoria persistente para Claude Code, OpenAI Codex CLI y Google Gemini CLI, compartiendo una base de datos local: inyección automática de contexto, traspaso en compactación, búsqueda semántica y recuperación de error→solución. Cero configuración, cero costo de API, 100% local.

npm version npm downloads License: MIT

⚡ Una instalación → el contexto se carga automáticamente en cada sesión · 🧩 sobrevive a la compactación (0 re-explicaciones) · 🔒 100% local, $0 de API

Session continuity demo — your coding agent auto-restores project context on session start

Renombrado (v2.0.0): este proyecto anteriormente se llamaba claude-session-continuity-mcp. El nombre antiguo sugería que era solo para Claude — nunca lo fue. Claude Code, Codex CLI y Gemini CLI son todos de primera clase y comparten una única memoria local. Las instalaciones existentes siguen funcionando: los comandos antiguos de claude-hook-* siguen disponibles como alias. Consulta Migración desde v1.

El Problema

Cada nueva sesión — ya sea en Claude Code, Codex CLI o Gemini CLI:

"This is a Next.js 15 project with App Router..."
"We decided to use Server Actions because..."
"Last time we were working on the auth system..."
"The build command is pnpm build..."

5 minutos de configuración de contexto. Cada. Maldita. Vez.

La Solución

Totalmente automática. Los hooks del ciclo de vida manejan todo sin llamadas manuales — en Claude Code, OpenAI Codex CLI y Google Gemini CLI, compartiendo una única memoria local para que el contexto se transfiera entre los tres:

# Session start → Auto-loads relevant context + recent session history
# When asking → Auto-injects relevant memories/solutions
# During conversation → Tracks active files + auto-injects error solutions
# On compact → Structured handover context for continuity
# On exit → Extracts commits, decisions, error-fix pairs from transcript
← Auto-output on session start:
# my-app - Session Resumed

📍 **State**: Implementing signup form

## Recent Sessions
### 2026-02-28
**Work**: Completed OAuth integration with Google provider
**Commits**: feat: add OAuth callback handler; fix: redirect URI config
**Decisions**: Use Server Actions instead of API routes

### 2026-02-27
**Work**: Set up authentication foundation
**Next**: Implement signup form validation

## Directives
- 🔴 Always use Zod for form validation
- 📎 Prefer Server Components by default

## Key Memories
- 🎯 Decided on App Router, using Server Actions
- ⚠️ OAuth redirect_uri mismatch → check env file

Cero trabajo manual. El contexto te sigue.


¿Por qué esto y no otras herramientas de memoria?

La mayoría de las herramientas de memoria para Claude dependen de llamadas explícitas a herramientas ("recuerda esto"), una API en la nube o un trabajador de IA en segundo plano. Esta es deliberadamente diferente:

passbatonMCP típico de nube/IA-memoria
Configuraciónnpm i -g → hooks auto-instaladosServidor manual + clave de API
Disparador5 hooks automáticos (sin comandos)Tú llamas a una herramienta remember
AlmacenamientoSQLite 100% localNube / servicio externo
Costo de API$0 — embeddings localesPor token / suscripción
Latencia< 5ms (en el dispositivo)Ida y vuelta de red
PrivacidadNunca sale de tu máquinaEnviado a un proveedor
BúsquedaFTS5 + semántica local, multilingüe KO/EN/JAVaría

Si quieres memoria sin configuración, sin conexión, sin costo que simplemente sucede mientras trabajas — esto es para ti.

Inyección automática vs. búsqueda explícita

También existe una gran clase de herramientas de búsqueda local (p. ej. ctx) que indexan el historial de tu agente para que puedas consultarlo (search "failed migration"). Eso es complementario, no el mismo trabajo:

passbatonHerramientas de búsqueda local (ctx, etc.)
Cómo lo usasAutomático — el contexto aparece al inicio de la sesión, sin comandosTú (o el agente) ejecutas una consulta de búsqueda
CompactaciónEl hook PreCompact reinyecta un traspaso → 0 contexto re-explicado después de una compactaciónNo es su función (es un índice de búsqueda)
Mejor enNunca perder el hilo entre sesiones y compactaciones, sin intervenciónEncontrar una decisión/comando pasado específico bajo demanda
CoberturaClaude Code + Codex CLI + Gemini CLI (donde la inyección automática es posible)A menudo 30+ agentes indexados para búsqueda

Usa la búsqueda cuando quieras consultar algo. Usa esto cuando quieras que tu contexto te siga sin preguntar.


Soporte para Codex CLI (v1.16.0+)

Más allá de Claude Code, esto también soporta OpenAI Codex CLI. Si ~/.codex existe, el instalador registra los mismos hooks en ~/.codex/hooks.json (SessionStart, UserPromptSubmit, PreCompact, Stop), y los hooks detectan automáticamente el host y emiten el formato de salida correcto (el hookSpecificOutput.additionalContext de Codex).

El mismo sessions.db local se comparte, por lo que el contexto se transfiere entre ambos agentes: lo que hiciste en Codex está disponible en Claude Code y viceversa.

Alcance: el guardado de sesión + la inyección de contexto funcionan en ambos. El seguimiento de cambios de archivos de Codex (PostToolUse) aún no está conectado — el guardado de sesión ya cubre la mayor parte mediante el análisis del transcript. El transcript_path de Codex se trata como una interfaz inestable (puede ser null al inicio), por lo que la detección del host usa un marcador --codex inyectado por el instalador en lugar de depender de la ruta.


Soporte para Gemini CLI (v1.17.0+)

También soporta Google Gemini CLI. Si ~/.gemini existe, el instalador registra los hooks en ~/.gemini/settings.json (SessionStart, BeforeAgent, PreCompress, SessionEnd — los nombres de eventos de Gemini), preservando tus otras configuraciones. El mismo sessions.db local compartido, por lo que el contexto se transfiere entre los tres agentes.

El formato de transcript de Gemini se verificó contra archivos ~/.gemini/tmp/.../chats/*.jsonl reales — usa dos formas (una línea {type, content} plana y una línea de diff {"$set":{"messages":[…]}} más antigua); el analizador maneja ambas. Al igual que Codex, transcript_path puede ser null al inicio, por lo que la detección del host usa un marcador --gemini.

Nota honesta de alcance: el guardado de sesión (SessionEnd) y la salida de contexto están verificados y funcionando. La inyección de contexto SessionStart de Gemini está documentada como solo consultiva en el upstream (gemini-cli#15413) — si tu compilación de Gemini no renderiza el contexto inyectado al inicio, eso es un límite del upstream, no de esta herramienta. La continuidad de sesión sigue funcionando mediante el historial guardado.


Migración desde v1

Si instalaste esto como claude-session-continuity-mcp (v1.x), nada se rompe — los comandos claude-hook-* de v1 siguen disponibles como alias en v2.

Para moverte al nuevo nombre:

npm install -g passbaton          # installs the new package
npm uninstall -g claude-session-continuity-mcp   # optional: drop the old one

El instalador reescribe tus entradas de hooks a passbaton-hook-* y elimina las líneas antiguas de claude-hook-* — coincide con ambos nombres, por lo que no terminarás con duplicados. Tu sessions.db existente no se toca: todas las sesiones pasadas, memorias y soluciones se transfieren.

Nada más cambia — mismos hooks, misma base de datos, mismo comportamiento.


Inicio Rápido

Requiere Node.js 22+. La dependencia nativa better-sqlite3 solo incluye binarios precompilados para Node 22, 24 y 26 (las líneas actualmente soportadas — Node 18 y 20 están ambos al final de su vida útil). En Node más antiguo, recurre a compilar desde el código fuente, lo que falla sin herramientas de compilación. Node 22 y superiores se instalan limpiamente sin necesidad de compilador.

Recomendado: Instalación Global

npm install -g passbaton

¡Eso es todo! El script postinstall automáticamente:

  1. Registra el servidor MCP en ~/.claude.json
  2. Instala los Hooks de Claude en ~/.claude/settings.json

¿Por qué Global (-g)?

Esta herramienta está diseñada para rastrear todos tus proyectos de Claude Code en una única base de datos unificada. La instalación global es fuertemente recomendada porque:

RazónDetalle
Fuente única de verdadUn binario sirve a cada proyecto — sin desviación de versiones entre proyectos
Los hooks tienen alcance de usuario~/.claude/settings.json vive en tu directorio de inicio, no por proyecto
Contexto entre proyectosLas sesiones de app-a y app-b comparten la misma DB e índice de búsqueda
Una actualización = todo actualizadonpm install -g <latest> actualiza todos los proyectos a la vez; sin reinstalación por proyecto
Los hooks se resuelven por nombre de binarioEl instalador escribe el nombre de binario simple (passbaton-hook-*) cuando se resuelve en PATH — el caso normal para npm i -g. Medido 135 ms por disparo vs 1,367 ms para npm exec -- … (10×), y PostToolUse se dispara en cada edición. Si el nombre no se resuelve (instalación local), recurre a npm exec -- …

Agrega la base de datos al .gitignore de tu proyecto. Desde 2.4.0, passbaton crea <project>/.claude/sessions.db en la primera sesión en cualquier proyecto que reconoce como raíz de espacio de trabajo, por lo que un proyecto que no tenía base de datos antes obtendrá una:

.claude/sessions.db
.claude/sessions.db-shm
.claude/sessions.db-wal
.claude/*.log

No ignores todo .claude/ — settings.json ahí está destinado a ser confirmado.

Importante: Incluso con instalación global, aún puedes deshabilitar el hook para proyectos específicos (ver abajo). Global ≠ forzado en cada proyecto.

Deshabilitar Hooks para Proyectos Específicos

La instalación global no significa "siempre activo en todas partes". Tienes tres capas de control:

CapaArchivoAlcance
1. Global ACTIVADO (predeterminado)~/.claude/settings.jsonTodos los proyectos
2. DESACTIVADO en todo el proyecto<project>/.claude/settings.jsonTodo el equipo (confirmado)
3. DESACTIVADO solo personal<project>/.claude/settings.local.jsonSolo tú (ignorado por git)

Para deshabilitar hooks en un proyecto específico, crea el archivo de anulación con arreglos de hooks vacíos:

// <project>/.claude/settings.json  (or settings.local.json for personal-only)
{
  "hooks": {
    "SessionStart": [],
    "UserPromptSubmit": [],
    "PostToolUse": [],
    "PreCompact": [],
    "Stop": []
  }
}

Los arreglos vacíos anulan la configuración global → las sesiones de ese proyecto ya no se rastrean.

Actualizar a una Nueva Versión

npm install -g passbaton@latest

Ese es el único paso — todos los proyectos toman el nuevo binario en el próximo reinicio de Claude Code. No es necesario reinstalar en cada proyecto.

Alternativa: Instalación Local (No Recomendada)

Si realmente quieres instalación por proyecto (p. ej., versión bloqueada para un proyecto):

cd <project> && npm install passbaton

Inconveniente: debes instalar por separado en cada proyecto, npm exec puede no encontrar la copia local de manera confiable desde el contexto del hook (dependiente del cwd), y pagas el costo de inicio de npm exec (~1.4 s) en cada disparo de hook en lugar de ~135 ms. Quédate con -g a menos que tengas una razón específica.

Qué Se Instala

Servidor MCP (en ~/.claude.json):

{
  "mcpServers": {
    "project-manager": {
      "command": "npx",
      "args": ["passbaton"]
    }
  }
}

Hooks de Claude (en ~/.claude/settings.json):

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "passbaton-hook-session-start" }] }],
    "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "passbaton-hook-user-prompt" }] }],
    "PostToolUse": [{ "matcher": "Edit", "hooks": [{ "type": "command", "command": "passbaton-hook-post-tool" }] }, { "matcher": "Write", "hooks": [{ "type": "command", "command": "passbaton-hook-post-tool" }] }],
    "PreCompact": [{ "hooks": [{ "type": "command", "command": "passbaton-hook-pre-compact" }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "passbaton-hook-session-end" }] }]
  }
}

Nota (v2.2.1+): Cobertura completa del ciclo de vida con 5 hooks. El instalador verifica si passbaton-hook-* se resuelve en PATH y escribe el nombre simple si es así (≈10× más rápido por disparo); de lo contrario, escribe npm exec -- …, que también encuentra un node_modules/.bin local.

Hooks Instalados (v1.5.0+)

HookComandoFunción
SessionStartpassbaton-hook-session-startCarga automáticamente el contexto del proyecto al inicio de la sesión
UserPromptSubmitpassbaton-hook-user-promptInyecta automáticamente memorias relevantes + búsqueda de referencias pasadas
PostToolUsepassbaton-hook-post-toolRastrea archivos activos (Edit, Write) + inyecta automáticamente soluciones de errores (Bash)
PreCompactpassbaton-hook-pre-compactContexto de traspaso estructurado antes de la compresión
Stoppassbaton-hook-session-endExtrae commits, decisiones, pares error-corrección del transcript

Gestión Manual de Hooks

# Check hook status
npx passbaton-hooks status

# Reinstall hooks
npx passbaton-hooks install

# Remove hooks
npx passbaton-hooks uninstall

3. Reinicia Claude Code

Después de la instalación, reinicia Claude Code para activar los hooks.


Características

CaracterísticaDescripción
🤖 Cero Trabajo ManualLos Hooks de Claude automatizan toda la captura/carga de contexto
🎯 Solo Memoria de Calidad(v1.10.0) Solo decisiones, aprendizajes, errores — sin ruido de cambios de archivos
🧠 Búsqueda SemánticaEmbedding multilingual-e5-small (94+ idiomas, 384d)
🌍 MultilingüeCoreano/Inglés/Japonés + búsqueda entre idiomas (EN→KR, KR→EN)
🔗 Integración con GitMensajes de commit extraídos automáticamente de los transcripts
🕸️ Grafo de ConocimientoRelaciones de memoria (resuelve, causa, extiende...)
📊 Clasificación de Memoria5 tipos: observación, decisión, aprendizaje, error, patrón
✅ Verificación IntegradaEjecución de build/test/lint con un clic
📋 Gestión de TareasGestión de tareas basada en prioridades
🔧 Auto Error→Solución(v1.12.0) Los errores de Bash se detectan automáticamente → inyecta soluciones pasadas; al final de la sesión registra automáticamente pares error-corrección
💰 Eficiencia de Tokens(v1.11.0) Se eliminó loadContext de UserPromptSubmit (ahorra 24-60K tokens/sesión)
📑 Divulgación Progresiva(v1.11.0) memory_search devuelve primero el índice, memory_get para el contenido completo
⏳ Decaimiento Temporal(v1.11.0) Puntuación de memoria con vidas medias específicas por tipo para relevancia
📝 Traspaso Estructurado(v1.10.0) PreCompact guarda resumen de trabajo, archivos activos, acciones pendientes
🚪 Fin de Sesión Inteligente(v1.10.0) Extrae commits, decisiones, pares error-corrección del transcript
🗑️ Limpieza Automática de Ruido(v1.10.0) Elimina automáticamente memorias de observación obsoletas (3d+)
🔍 Detección de Referencias Pasadas(v1.8.0) "¿Cómo hiciste X la última vez?" busca automáticamente en la DB
📝 Extracción de Directivas del Usuario(v1.8.0) Extrae automáticamente reglas "siempre/nunca" de los prompts

Alternadores de características — todo es opcional

(v2.1.0+) Seis comportamientos se pueden activar/desactivar individualmente; el resto se muestran por transparencia pero están siempre activos (la mera existencia de un hook está controlada por tu settings.json, no por la configuración) o aún no conectados. La configuración vive en un archivo JSON plano y editable a mano (~/.claude/passbaton.config.json), separado de tus datos, por lo que sobrevive a un reinicio de la base de datos. Sin archivo = valores predeterminados actuales (nada cambia para los usuarios existentes).

passbaton config                            # grouped table; ●/○ = toggleable, · = always on
passbaton config set solutionCapture off    # flip a toggleable feature
passbaton config set strictSolutionGate on  # opt into the strict error→fix filter
passbaton config preset minimal             # minimal | default | everything
passbaton config reset                       # back to defaults
passbaton config path                        # print the active config file path

Intentar set una función siempre activa / aún no conectada se rechaza con un mensaje claro. Cada función activable también tiene una anulación de entorno para uso puntual/CI: PASSBATON_<FEATURE>=0 (p. ej., PASSBATON_SOLUTIONCAPTURE=0) tiene prioridad sobre el archivo de configuración.

Regla de activación predeterminada: una función se lanza activa solo si es silenciosa, segura y universalmente útil. Cualquier cosa que hable sin que se le pida, adivine o escriba filas especulativas se lanza inactiva.

Leyenda: ●/○ = activable (activo/inactivo) · · = siempre activo, no es un interruptor de configuración · ⋯ = aún no conectado.

Núcleo (activo por defecto)

FunciónClaveInterruptorQué hace
Inyección de inicio de sesiónsessionStart· siempre activoRestaurar el contexto anterior al inicio
Traspaso de compactación+compactionHandover● activableAntes de una compactación, transfiere tu estado de trabajo más archivos activos y el último estado de compilación — la única brecha que la memoria automática de la plataforma estructuralmente no puede cubrir
Persistencia de sesiónsessionEnd· siempre activoGuardar el estado de la sesión al salir
Superficie de memoria automáticaautoInject· siempre activoMostrar automáticamente recuerdos pasados relevantes al inicio
Seguimiento de tareastaskTracking· siempre activoLeer/escribir la lista de tareas mediante MCP + hooks
Pre-calentamiento de ruta activahotPathPrewarm● activableAl inicio, mostrar los archivos que más editas en este proyecto, clasificados por recuento de acceso real
Registro de verificaciónverificationLedger● activableAdvertir al inicio si una sesión reciente dejó la compilación en rojo o problemas abiertos

sessionStart/sessionEnd están "siempre activos" porque un hook se ejecuta o no — eso está controlado por el registro del hook en ~/.claude/settings.json, no por la configuración. Para desactivarlos, elimina el hook allí.

Entre agentes (activo por defecto)

FunciónClaveInterruptorQué hace
Compartir entre agentescrossAgentSync· inherenteUna base de datos local compartida entre Claude Code / Codex / Gemini (no es un interruptor — es cómo funciona el almacenamiento)
Captura de uso de herramientaspostToolCapture· siempre activoObservar el uso de herramientas para construir rutas activas (bajo ruido)
Captura de solucionessolutionCapture● activableRegistrar automáticamente pares error→solución en un archivo de soluciones. Configúralo en inactivo para omitirlo por completo (el guardado de sesión no se ve afectado)

Experimental (inactivo por defecto)

FunciónClaveInterruptorQué hace
Puerta de soluciones estrictastrictSolutionGate○ opt-inFiltro de captura error→solución más estricto — menos entradas de ruido, pero puede descartar algunas reales
Coincidencia de disparadorestriggerMatching⋯ aún no conectado(planificado) Coincidir palabras clave de prompts para auto-inyectar soluciones
Minería de patronespatternMining⋯ aún no conectado(planificado) Extraer patrones de trabajo y sugerir flujos de trabajo
Auto-almacenamiento de memoriamemoryAutoStore⋯ aún no conectado(planificado) Escribir automáticamente memorias de observación desde prompts
Línea de estadostatusLineInject⋯ aún no conectado(planificado) Añadir una línea de estado passbaton a la salida de inicio de sesión
Traza de hookshookTrace○ opt-inDiagnósticos: una línea por disparo de SessionStart / PostToolUse en <workspace>/.claude/hook-trace.log, con pid y el ws_root resuelto. Inactivo por defecto porque PostToolUse se dispara en cada edición. Limitado a 5 MB (se conserva una generación). Registra rutas de archivo absolutas en texto plano — añade .claude/hook-trace.log a .gitignore si tu repositorio rastrea .claude/

Las únicas banderas realmente modificables por el usuario hoy son compactionHandover, hotPathPrewarm, verificationLedger, solutionCapture (activas) y strictSolutionGate, hookTrace (opt-in).

Activar hookTrace en Windows: edita ~/.claude/passbaton.config.json (o ejecuta passbaton config set hookTrace on). La anulación de entorno PASSBATON_HOOKTRACE=1 también funciona, pero los hooks se lanzan desde settings.json a través de cmd.exe, donde un prefijo VAR=1 command es un error de sintaxis — así que el archivo de configuración es la vía práctica.


Hooks de Claude - Sistema de Contexto Automático

Cómo Funciona

Hook SessionStart (npx passbaton-hook-session-start):

  • Detecta automáticamente el proyecto: monorepo (apps/project-name/) o proyecto único (package.json nombre de carpeta raíz)
  • Carga el contexto desde .claude/sessions.db
  • Inyecta: Estado actual, 3 sesiones recientes con commits/decisiones, directivas, tareas pendientes, memorias clave filtradas
  • Limpia automáticamente memorias de ruido obsoletas (3d+ auto-rastreadas, 14d+ auto-compactadas)

Hook UserPromptSubmit (npx passbaton-hook-user-prompt):

  • Se ejecuta en cada envío de prompt
  • (v1.11.0) Ya no llama a loadContext() — ahorra 24-60K tokens/sesión
  • Inyecta contexto relevante (filtrado: solo decisiones, aprendizajes, errores)

Hook PostToolUse (npx passbaton-hook-post-tool):

  • Rastrea rutas de archivos activos y actualiza active_context.recent_files
  • (v1.12.0) Detecta automáticamente errores de Bash → busca en la base de datos de soluciones → inyecta soluciones pasadas en el contexto
  • Ya no crea memorias de observación (v1.10.0 — elimina el ruido de [File Change])

Hook PreCompact (npx passbaton-hook-pre-compact):

  • Construye contexto de traspaso estructurado: resumen de trabajo, archivo activo, acción pendiente, hechos clave, errores recientes
  • Ya no almacena memorias auto-compactadas (v1.10.0)

Hook Stop (npx passbaton-hook-session-end):

  • Extrae mensajes de commit de la transcripción JSONL (patrones git commit -m)
  • Extrae pares error-solución (error → resolución dentro de 3 mensajes)
  • (v1.12.0) Registra automáticamente pares error→solución en la tabla de soluciones para reutilización futura
  • Extrae decisiones (patrones "porque", "en lugar de", "elegí")
  • (v1.11.0) Análisis de transcripción de una sola pasada (4 lecturas JSONL → 1)
  • Almacena metadatos estructurados en la columna sessions.issues como JSON

Ejemplo de Salida (Inicio de Sesión)

# my-app - Session Resumed

📍 **State**: Implementing signup form
🚧 **Blocker**: OAuth callback URL issue

## Recent Sessions
### 2026-02-28
**Work**: Completed OAuth integration
**Commits**: feat: add OAuth handler; fix: redirect config
**Decisions**: Use Server Actions over API routes
**Next**: Implement form validation

## Directives
- 🔴 Always use Zod for validation

## Pending Tasks
- 🔄 [P8] Implement form validation
- ⏳ [P5] Add error handling

## Key Memories
- 🎯 Decided on App Router, using Server Actions
- ⚠️ OAuth redirect_uri mismatch → check env file

Gestión de Hooks

# Check status
npx passbaton-hooks status

# Reinstall
npx passbaton-hooks install

# Remove
npx passbaton-hooks uninstall

# Temporarily disable
export MCP_HOOKS_DISABLED=true

Detección de Referencias Pasadas (v1.8.0)

Cuando preguntas sobre trabajo pasado, el hook UserPromptSubmit busca automáticamente en la base de datos:

You: "저번에 인앱결제 어떻게 했어?"
→ Hook detects "저번에" + extracts keyword "인앱결제"
→ Searches sessions, memories (FTS5), and solutions
→ Injects matching results into context automatically

Patrones admitidos (coreano e inglés):

PatrónEjemplo
저번에/전에/이전에 ... 어떻게"저번에 CORS 에러 어떻게 해결했지?"
~했던/만들었던/해결했던"수정했던 로그인 로직"
지난 세션/작업에서"지난 세션에서 결제 구현"
last time/before/previously"How did we handle auth last time?"
did we/did I ... before"Did we fix the database migration before?"
remember when/recall when"Remember when we set up CI?"

Ejemplo de salida:

## Related Past Work (auto-detected from your question)

### Sessions
- [2/14] 카카오 로그인 앱키 수정, 인앱결제 IAP 플로우 수정

### Memories
- 🎯 [decision] 테스트: 인앱결제 상품 등록 완료

### Solutions
- **IAP_BILLING_ERROR**: StoreKit 2 migration으로 해결

¿Por qué npm exec? (v1.4.3+)

Las versiones anteriores usaban rutas absolutas o npx:

// v1.3.x - absolute paths (broke on multi-project)
"command": "node \"/path/to/project-a/node_modules/.../session-start.js\""

// v1.4.0-1.4.2 - npx (required global install or hit npm registry)
"command": "npx passbaton-hook-session-start"

Ahora usamos npm exec --:

"command": "passbaton-hook-session-start"

npm exec -- encuentra el node_modules/.bin local primero, luego recurre al global. Funciona con instalación local y global sin tocar el registro de npm.


Herramientas (API v5) - 25 Herramientas Enfocadas

1. Ciclo de Vida de Sesión (4) ⭐

// Start of session - auto-loads context
session_start({ project: "my-app", compact: true })

// End of session - auto-saves context
session_end({
  project: "my-app",
  summary: "Completed auth flow",
  modifiedFiles: ["src/auth.ts", "src/login/page.tsx"]
})

// View session history
session_history({ project: "my-app", limit: 5 })

// Semantic search past sessions
search_sessions({ query: "auth work", project: "my-app" })

2. Gestión de Proyectos (4)

// Get project status with task stats
project_status({ project: "my-app" })

// Initialize new project
project_init({ project: "my-app" })

// Analyze project tech stack
project_analyze({ project: "my-app" })

// List all projects
list_projects()

3. Gestión de Tareas (4)

// Add a task
task_add({ project: "my-app", title: "Implement signup", priority: 8 })

// Update task status
task_update({ taskId: 1, status: "done" })

// List tasks
task_list({ project: "my-app", status: "pending" })

// Suggest tasks from TODO comments
task_suggest({ project: "my-app" })

4. Archivo de Soluciones (3)

// Record an error solution
solution_record({
  errorSignature: "TypeError: Cannot read property 'id'",
  solution: "Use optional chaining: user?.id"
})

// Find similar solutions (keyword or semantic)
solution_find({ query: "TypeError property", semantic: true })

// AI-powered solution suggestion
solution_suggest({ errorMessage: "Cannot read property 'email'" })

5. Verificación (3)

// Run build
verify_build({ project: "my-app" })

// Run tests
verify_test({ project: "my-app" })

// Run all (build + test + lint)
verify_all({ project: "my-app" })

6. Sistema de Memoria (5)

// Store a classified memory
memory_store({
  content: "State management with Riverpod makes testing easier",
  type: "learning",  // observation, decision, learning, error, pattern
  project: "my-app",
  tags: ["flutter", "state-management"],
  importance: 8,
  relatedTo: 23  // Connect to existing memory
})

// Search memories — returns index (id, type, tags, score) for token efficiency
memory_search({
  query: "state management test",
  type: "learning",
  semantic: true,  // Use embedding similarity
  limit: 10
})

// Get full memory content by ID (v1.11.0)
memory_get({ memoryId: 23 })

// Find related memories (graph + semantic)
memory_related({
  memoryId: 23,
  includeGraph: true,
  includeSemantic: true
})

// Get memory statistics
memory_stats({ project: "my-app" })

7. Grafo de Conocimiento (2)

// Connect two memories with a typed relation
graph_connect({
  sourceId: 23,
  targetId: 25,
  relation: "solves",  // related_to, causes, solves, depends_on, contradicts, extends, example_of
  strength: 0.9
})

// Explore knowledge graph
graph_explore({
  memoryId: 23,
  depth: 2,
  relation: "all",  // or specific relation type
  direction: "both"  // outgoing, incoming, both
})

Tipos de Memoria

TipoDescripciónCaso de Uso
observationPatrones, estructuras encontradas en el código"Todas las pantallas están separadas en la carpeta features/"
decisionArquitectura, elecciones de bibliotecas"Decidimos usar SharedPreferences para el caché"
learningNuevo conocimiento, mejores prácticas"Riverpod es mejor para pruebas"
errorErrores ocurridos y soluciones"Provider.read() no reconstruye → usa watch()"
patternPatrones de código recurrentes, convenciones"Evitar el abuso de la palabra clave late"

Tipos de Relación

RelaciónDescripciónEjemplo
related_toRelación generalA y B están relacionados
causesA causa BDecisión de caché → cambio en la estructura de carpetas
solvesA resuelve BAprendizaje de Riverpod → corrección de bug de Provider
depends_onA depende de BEstructura de carpetas → Decisión de caché
contradictsA entra en conflicto con BDos decisiones de diseño entran en conflicto
extendsA extiende BPatrón late → Extendido al aprendizaje de Riverpod
example_ofA es ejemplo de BCódigo específico es ejemplo de patrón

Almacenamiento de Datos

Base de datos SQLite en ~/.claude/sessions.db:

TablaPropósito
memoriesMemorias clasificadas (observación, decisión, aprendizaje, error, patrón)
memories_ftsÍndice de búsqueda de texto completo (FTS5)
memory_relationsRelaciones del grafo de conocimiento
embeddings_v4Vectores de búsqueda semántica (multilingual-e5-small, 384d)
project_contextInformación fija del proyecto (stack tecnológico, decisiones)
active_contextEstado de trabajo actual
tasksLista de tareas pendientes
solutionsArchivo de soluciones de errores
sessionsHistorial de sesiones

Variables de Entorno

VariablePredeterminadoDescripción
WORKSPACE_ROOT-Ruta raíz del espacio de trabajo (obligatoria)
MCP_HOOKS_DISABLEDfalseDesactivar Hooks de Claude
LOG_LEVELinfoNivel de registro (debug/info/warn/error)
LOG_FILE-Ruta opcional de registro en archivo

Desarrollo

# Clone
git clone https://github.com/leesgit/passbaton.git
cd passbaton

# Install
npm install

# Build
npm run build

# Test
npm test

# Test with coverage
npm run test:coverage

Rendimiento

MétricaValor
Carga de contexto (en caché)<5ms
Búsqueda de memoria (FTS)~10ms
Búsqueda semántica~50ms
Verificación de compilaciónDepende del proyecto

Hoja de Ruta

  • API v2 (15 herramientas enfocadas)
  • API v4 (24 herramientas - memoria + grafo)
  • Hooks de Claude v5 (captura automática)
  • Grafo de conocimiento con relaciones tipadas
  • Clasificación de memoria (6 tipos)
  • Búsqueda semántica (embeddings)
  • Detección de patrones multilingüe (KO/EN/JA)
  • Integración de commits de Git
  • 111 pruebas (6 suites de pruebas)
  • GitHub Actions CI/CD
  • Búsqueda semántica multilingüe (v1.6.0 - multilingual-e5-small)
  • Búsqueda entre idiomas EN↔KR (v1.6.0)
  • Búsqueda semántica de soluciones (v1.6.0)
  • Corrección de ruta del archivo de configuración de hooks (v1.6.1 - settings.json, no settings.local.json)
  • Migración automática de hooks heredados (v1.6.1)
  • Corrección del formato del matcher de PostToolUse a string (v1.6.3)
  • Corrección de la documentación README para el nuevo formato de hooks (v1.6.4)
  • Omisión de sesión vacía y mejoras en el guardado de techStack (v1.7.1)
  • Detección automática de referencias pasadas en el hook UserPromptSubmit (v1.8.0)
  • Extracción de directivas de usuario (reglas "siempre/nunca") (v1.8.0)
  • Revisión de calidad de memoria — sin más ruido de [File Change] (v1.10.0)
  • Contexto de traspaso estructurado en PreCompact (v1.10.0)
  • Fin de sesión inteligente: extracción de commit/decisión/error-solución de la transcripción (v1.10.0)
  • Limpieza automática de ruido (observaciones 3d+, auto-compactación 14d+) (v1.10.0)
  • Visualización de 3 sesiones recientes con metadatos estructurados (v1.10.0)
  • Eficiencia de tokens — eliminar loadContext de UserPromptSubmit, ahorra 24-60K tokens/sesión (v1.11.0)
  • Análisis de transcripción de una sola pasada, 4 lecturas JSONL → 1 (v1.11.0)
  • Decaimiento temporal para puntuación de memoria con semividas específicas por tipo (v1.11.0)
  • Divulgación progresiva — memory_search devuelve índice, memory_get para contenido completo (v1.11.0)
  • Consolidación de memoria mediante similitud de Jaccard (v1.11.0)
  • Pipeline automático error→solución — PostToolUse detecta errores de Bash, inyecta soluciones pasadas (v1.12.0)
  • SessionEnd registra automáticamente pares error-solución en la tabla de soluciones (v1.12.0)
  • Búsqueda de soluciones entre proyectos con priorización del proyecto actual (v1.12.0)
  • Búsqueda vectorial nativa sqlite-vec (v2 - cuando los datos > 1000 registros)
  • Panel web
  • Opción de sincronización en la nube

Contribuciones

¡Se aceptan PRs! Por favor:

  1. Haz un fork del repositorio
  2. Crea una rama de características
  3. Añade pruebas para las nuevas funcionalidades
  4. Asegúrate de que npm test pase
  5. Envía un pull request

Licencia

MIT © Byeongchang Lee


Agradecimientos


Si esto te ahorra tener que volver a explicar tu proyecto, considera darle una ⭐ — realmente ayuda a que otros lo encuentren.