Files
fn_registry/dev/issues/completed/0053-kanban-chat-panel.md
T
egutierrez 32fc9c725b docs(issues): cierra 0053 (kanban chat panel)
Chat lateral en apps/kanban implementado:
- backend: chat.go + tools.go con dispatch a 11 tools
  (list_board, create_column, rename_column, delete_column,
   reorder_columns, create_card, update_card, delete_card,
   move_card, card_history, find_cards)
- runClaude usa subprocess `claude -p --model claude-sonnet-4-6`
  con suscripcion del usuario (sin ANTHROPIC_API_KEY)
- frontend: ChatPanel en AppShell.Aside, persistencia localStorage,
  markdown via react-markdown + remark-gfm
- smoke test verde: crear cols, crear cards, queries conversacionales

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:54:17 +02:00

4.5 KiB

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.