Files
fn_registry/dev/issues/completed/0053-kanban-chat-panel.md

4.8 KiB

id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
id title status type domain scope priority depends blocks related created updated tags
0053 Chat lateral en apps/kanban via `claude -p` completado feature
kanban
multi-app media
2026-05-17 2026-05-17

0053 — Chat lateral en apps/kanban via claude -p

APP Metadata

Campo Valor
ID 0053
Estado pendiente
Prioridad media
Tipo feature — apps/kanban/ (Go backend + Vite/React frontend)

Dependencias

  • apps/kanban/ (ya creada, indexada kanban_go_tools).
  • CLI claude instalada en PATH (suscripcion del usuario, no ANTHROPIC_API_KEY).
  • Modelo claude-sonnet-4-6.

Desbloquea: futuro panel de chat reutilizable en otras apps del registry.


Objetivo

Añadir chat lateral en apps/kanban que conversa con un asistente y manipula el board (crear/renombrar/mover/borrar columnas y tarjetas, consultar tiempos e historial). El backend ejecuta claude -p como subprocess para usar la suscripcion del usuario, evitando manejo de API keys.

Plan completo: apps/kanban/CHAT_PLAN.md.


Tareas

1. Backend Go (apps/kanban/)

Archivos nuevos:

  • chat.go — handler POST /api/chat request/response sync + parsing <actions>...</actions> + dispatch a tools.
  • tools.goexecuteTool(db, name, input json.RawMessage) (any, error) con switch sobre 11 tools: list_board, create_column, rename_column, delete_column, reorder_columns, create_card, update_card, delete_card, move_card, card_history, find_cards.

Funcion clave: runClaude(systemPrompt, userMsg, boardJSON string) (string, error):

  • exec.CommandContext con timeout 120s.
  • Args: --model claude-sonnet-4-6 --output-format json --print (usar -p short alias OK).
  • Prompt completo concatenado por stdin.
  • Stdout JSON con campo result → texto del assistant.
  • Si claude no en PATH → error "claude CLI not found in PATH".

Registro:

  • En handlers.go, añadir {Method: "POST", Path: "/api/chat", Handler: handleChat(db)} a apiRoutes().

System prompt (constante chatSystemPrompt en codigo):

Eres el asistente del tablero kanban. Cuando el usuario pida cambios, responde EXCLUSIVAMENTE con un bloque <actions>...</actions> que contenga JSON valido.

Tools disponibles: list_board, create_column, rename_column, delete_column, reorder_columns, create_card, update_card, delete_card, move_card, card_history, find_cards.

Si el usuario solo conversa o pide info, responde texto natural en markdown SIN bloque <actions>.

Para resolver IDs de columnas/tarjetas a partir de nombres del usuario, consulta el board_state inyectado al final del prompt.

Reusar funciones del registry: infra.HTTPParseBody, infra.HTTPJSONResponse, infra.HTTPErrorResponse. Para exec.Command se usa stdlib directo.

2. Frontend (apps/kanban/frontend/)

Deps nuevas: pnpm add react-markdown remark-gfm.

Archivos nuevos:

  • src/components/ChatPanel.tsx — Stack vertical con lista scrollable + Textarea + Send/Clear. Persiste mensajes en localStorage clave kanban_chat_v1. Markdown via react-markdown. Loading state + Enter envia / Shift+Enter newline.

Modificaciones:

  • src/App.tsxAppShell con aside={{ width: 380, breakpoint: "md", collapsed: { ... } }}. State chatOpen. Boton IconMessageChatbot en header. <AppShell.Aside> renderiza <ChatPanel onBoardChange={reload} />.
  • src/api.ts — añadir sendChat(messages) y types ChatMessage / ChatResponse.

3. Tests / verificacion

  • cd apps/kanban && CGO_ENABLED=1 go vet -tags fts5 ./... pasa.
  • cd apps/kanban/frontend && pnpm build pasa.
  • Smoke test: ./run.sh, abrir http://localhost:5180, abrir chat, mensaje "crea columna Backlog y tarjeta Test solicitada por Lucas", verificar columnas y tarjetas creadas en board.
  • Si claude no esta en PATH: response 500 con message claro.

Restricciones

  • NO añadir env vars de API key.
  • NO escribir chat en operations.db.
  • NO romper API existente del kanban.
  • Build Go: -tags fts5 (NO -tags goolm, kanban usa fts5).
  • Frontend: Mantine v9 + @tabler/icons-react. NO Tailwind.

Branch

App kanban aun no tiene .git propio (sub-repo Gitea pendiente). Trabajar directamente sobre el master del root fn_registry con commits atomicos feat: / chore: / docs:. Cuando se haga git init + sub-repo del kanban, este historial se preservara via ensure_repo_synced_bash_infra.


Aceptacion

  • chat.go + tools.go implementados y go vet pasa.
  • Endpoint POST /api/chat funcional con claude -p.
  • ChatPanel.tsx integrado en AppShell.Aside toggleable.
  • Mensajes persistidos en localStorage.
  • Tras tool calls, board hace reload() automatico.
  • Smoke test manual exitoso.
  • Issue movido a dev/issues/completed/0053-kanban-chat-panel.md.