Beads ha muerto. Larga vida al CLI de Linear

| Última modificación: 4 de mayo de 2026 | Tiempo de Lectura: 4 minutos
Premios Blog KeepCoding 2025

Co-Fundador de KeepCoding

Hace menos de un mes escribí un post entero explicando cómo usar tres capas de memoria con Claude Code: Linear para estrategia, Beads para táctica y Tasks para ejecución. Una pirámide bonita y elegante.

Pues va a ser que no.

Hoy jubilo Beads. Y no por capricho, sino porque la realidad se ha encargado de demostrarte que una herramienta que te da más problemas de los que resuelve no es una herramienta. Es un lastre.

Qué aportaba Beads

Para quien no leyese el post original, Beads era un issue tracker git-backed. Un plugin para Claude Code que almacenaba issues en ficheros JSONL dentro de tu repo. La idea era brillante sobre el papel:

  • Persistencia en git: los issues vivían en .beads/ y se commiteaban con tu código.
  • Dependencias: un issue podía bloquear a otro.
  • Offline: funcionaba sin conexión.
  • El LLM lo veía directamente: sin APIs, sin configuración. El agente leía los ficheros y ya.

La promesa: una capa intermedia entre «lo que quiero hacer esta semana» (Linear) y «lo que estoy haciendo ahora mismo» (Tasks). El pegamento táctico.

Qué fue mal

Todo fue bien hasta que dejó de ir bien. Y dejó de ir bien de formas creativas.

El daemon del infierno

Beads corre un daemon en background para gestionar la base de datos SQLite y sincronizar con git. Suena razonable. En la práctica:

DATABASE MISMATCH DETECTED!

This database belongs to a different repository:
  Database repo ID:  d1f9ca0c
  Current repo ID:   01eac8ea

⚠️ CRITICAL: This mismatch can cause beads to incorrectly
   delete issues during sync!

Ese mensaje te sale al arrancar cualquier sesión. El daemon falla, la sincronización falla, y te quedas con issues que existen en tu SQLite local pero no en git, o al revés. Un estado cuántico de bugs: tus issues están y no están a la vez.

La sincronización fantasma

bd sync es el comando para sincronizar tus issues con el remoto git. Excepto cuando no funciona:

→ Pulling from remote...
Error: pulling: git pull failed: exit status 1
remote: Repository not found
fatal: repository 'https://git.frr.dev/frr/wuwei.git/' not found

Resulta que beads coge el remote de git, pero si tienes varios remotes (cosa común), puede elegir el equivocado. Y si ese remote apunta a un repo que no existe o ha cambiado de nombre, el daemon te escupe errores en cada operación. Silenciosamente, tus issues dejan de sincronizarse y no te enteras hasta que abres otra sesión y todo ha desaparecido.

El coste cognitivo

Cada sesión con Claude Code empezaba así:

  1. Claude lee el prompt de beads (inyectado vía hooks)
  2. El daemon intenta arrancar
  3. Falla con un error de mismatch
  4. Claude intenta bd sync
  5. Falla con un error de remote
  6. Tú le dices «ignora eso»
  7. Ahora sí, a trabajar

Seis pasos de fricción antes de hacer nada productivo. Seis pasos que consumen contexto, tiempo y paciencia.

Lo que ha cambiado

Dos cosas han hecho que Beads pase de «herramienta útil con bugs» a «overhead innecesario»:

1. Tasks ha madurado

Cuando escribí el post de las tres capas, Tasks era básico. Ahora tiene:

  • TaskCreate con descripciones, activeForm para spinners, y metadatos
  • TaskUpdate con dependencias (addBlocks, addBlockedBy)
  • TaskList y TaskGet para inspección
  • Persistencia opcional entre sesiones con CLAUDE_CODE_TASK_LIST_ID

Dicho en cristiano: Tasks ya hace todo lo que Beads hacía para el trabajo intra-sesión. Y lo hace sin daemon, sin SQLite, sin sincronización git, y sin errores fantasma.

2. Linear CLI ha llegado

El MCP de Linear era, siendo generoso, una mierda. Intermitente, lento, y con una manía especial por fallar justo cuando más lo necesitabas.

La alternativa era el API a pelo con GraphQL. Que funciona, sí, hasta que intentas meter caracteres especiales en las descripciones de los issues:

# Intento 1: bash con interpolación de strings
# Resultado: JSON roto por paréntesis y flechas

# Intento 2: Python con urllib
# Resultado: 401 porque op read no se evalúa dentro de Python

# Intento 3: llorar un poco
# Resultado: catártico pero improductivo

Y entonces descubrí linear CLI:

brew install schpet/tap/linear
linear auth login -k "$(op read 'op://FRR DEV/Linear/api-key')"

Y crear un issue se convierte en:

linear issue create --team RST --no-interactive \
  -t "Port: agent/loop" \
  --project "Phase 1: Core Loop" \
  --priority 1 \
  -l port \
  -d "Port agent loop (476 LOC). Heart of the agent."

Sin escaping de GraphQL. Sin daemon. Sin sincronización rota. He creado 49 issues en menos de un minuto con un script de bash. Con el MCP de Linear y con la API habría tardado una hora y media de peleas con el escapado de caracteres.

La nueva pirámide (que ya no es pirámide)

El modelo de tres capas era bonito. Pero la realidad es que dos capas son suficientes:

Necesidad Antes Ahora
Visión estratégica Linear (MCP/API) Linear (linear CLI)
Trabajo táctico Beads Linear (linear CLI)
Ejecución en sesión Tasks Tasks

Linear + su CLI cubre estrategia y táctica. Tasks cubre ejecución. Beads no cubre nada que no cubran mejor las otras dos.

Antes:
Linear (semanas) → Beads (días) → Tasks (horas)

Ahora:
Linear (semanas/días) → Tasks (horas)

Menos capas, menos fricción, menos cosas que se pueden romper.

Lección aprendida

Esto me recuerda a algo que digo siempre: la complejidad innecesaria es el enemigo silencioso. Beads resolvía un problema real (la amnesia del LLM entre sesiones), pero lo hacía añadiendo una capa de infraestructura que, a la larga, generaba más problemas que los que resolvía.

Es la misma historia de siempre en ingeniería: la solución correcta a veces no es añadir algo, sino darte cuenta de que lo que ya tienes ha mejorado lo suficiente como para no necesitarlo.

El MCP de Linear era una mierda → llegó el CLI. Tasks era básico → maduró. Beads quedó en medio, sin hueco.

El rm -rf definitivo

rm -rf .beads/
git add -A && git commit -m "chore: remove beads"

Dos líneas. Así se jubila una herramienta. Sin ceremonia, sin drama.

Beads fue útil mientras lo fue. Ahora ya no lo es. Y eso está bien.


TL;DR: Retiro Beads de mi flujo de trabajo con Claude Code. El CLI de Linear (schpet/linear-cli) resuelve la gestión de issues sin los dolores del MCP ni del API GraphQL. Tasks ha madurado lo suficiente para cubrir el tracking intra-sesión. Dos capas bastan: Linear para estrategia y táctica, Tasks para ejecución.

Posts anteriores sobre el tema: – Linear y Beads: cómo evitar que tu IA tenga AlzheimerLinear, Beads y Tasks: tres capas de memoria para Claude Code


Read this article in English.

Noticias recientes del mundo tech


¡CONVOCATORIA ABIERTA!

Desarrollo de apps móviles ios & Android

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado

Descárgate también el informe de tendencias en el mercado laboral 2026.

Fórmate con planes adaptados a tus objetivos y logra resultados en tiempo récord.
KeepCoding Bootcamps
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.