chore: auto-commit (23 archivos)
- app.md - backend/auth.go - backend/db.go - backend/dist/assets/index-CPqSy0gZ.js - backend/dist/index.html - backend/handlers.go - backend/main.go - frontend/src/App.tsx - frontend/src/api.ts - frontend/src/components/KanbanCard.tsx - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -79,7 +79,7 @@ Single-binary: backend Go con frontend Vite embebido. SQLite local con tres tabl
|
||||
./kanban --port 8095 --db kanban.db
|
||||
```
|
||||
|
||||
### Schema SQLite (`migrations/001_init.sql`)
|
||||
### Schema SQLite (`migrations/001_init.sql` … `010_card_messages.sql`)
|
||||
|
||||
- **columns** — id, name, position, created_at
|
||||
- **cards** — id, title, description, column_id (FK), position, created_at, updated_at
|
||||
@@ -87,6 +87,7 @@ Single-binary: backend Go con frontend Vite embebido. SQLite local con tres tabl
|
||||
- Una entrada con `exited_at IS NULL` = posicion actual
|
||||
- Al mover una tarjeta a otra columna: cierra la entrada activa (`exited_at = now`) e inserta una nueva
|
||||
- El borrado de tarjeta hace CASCADE sobre el historial
|
||||
- **card_messages** (migration 010) — id, card_id (FK CASCADE), author_id (nullable), body, created_at. Comentarios humano-a-humano por card; distintos de `card_events` (sistema) y `/api/chat` (LLM global).
|
||||
|
||||
### API REST
|
||||
|
||||
@@ -101,7 +102,21 @@ Single-binary: backend Go con frontend Vite embebido. SQLite local con tres tabl
|
||||
| PATCH | `/api/cards/{id}` | `{title?, description?}` |
|
||||
| DELETE | `/api/cards/{id}` | — |
|
||||
| POST | `/api/cards/{id}/move` | `{column_id, ordered_ids: [...]}` |
|
||||
| POST | `/api/cards/{id}/duplicate` | — (clona la card en la misma columna al final; copia titulo+" (copia)", descripcion, color, requester, assignee, tags, stickers, deadline; NO copia historial ni mensajes) |
|
||||
| GET | `/api/cards/{id}/messages` | — (lista de comentarios humano-a-humano de la card) |
|
||||
| POST | `/api/cards/{id}/messages` | `{body}` (crea comentario; author = usuario de la sesion) |
|
||||
| DELETE | `/api/cards/{cid}/messages/{mid}` | — (solo el autor puede borrar su mensaje) |
|
||||
| GET | `/api/cards/{id}/history` | — (timeline con duraciones por columna) |
|
||||
| GET | `/api/flags` | — (retorna `{ <name>: bool }` con los feature flags efectivos en esta instancia) |
|
||||
| POST | `/api/auth/register` | `{username, password, display_name?}` (devuelve 403 `registration_disabled` si el flag `registration-enabled` esta en `false`) |
|
||||
|
||||
### Feature flags
|
||||
|
||||
`dev/feature_flags.json` (lado del repo) define los flags por instancia. Se cargan al arrancar (override con `--flags <path>`); fichero ausente equivale a "todos los flags en `false`". El endpoint `GET /api/flags` expone el estado actual para que el frontend oculte UI condicional (ej. el toggle de "Registrate" en `LoginPage` solo aparece cuando `registration-enabled` es `true`).
|
||||
|
||||
| Flag | Default | Efecto cuando esta en `true` |
|
||||
|---|---|---|
|
||||
| `registration-enabled` | `false` | Permite crear cuentas nuevas via `POST /api/auth/register` y muestra el toggle "Registrate" en la pantalla de login. |
|
||||
|
||||
### Frontend
|
||||
|
||||
@@ -110,6 +125,13 @@ Single-binary: backend Go con frontend Vite embebido. SQLite local con tres tabl
|
||||
- **Modales** con `@mantine/modals` (confirmacion borrado, history timeline).
|
||||
- Time-in-column live: `time_in_column_ms` del backend + tick local cada segundo para que el badge se actualice sin reload.
|
||||
- DnD con `closestCorners` + `DragOverlay` para feedback visual al arrastrar.
|
||||
- **Auto-refresh:** el board se recarga cada 30s (`api.getBoard`) sin interaccion del usuario; equivalente a pulsar el boton de refresco. El tick de 1s del time-in-column es independiente y no toca red.
|
||||
- **Modal de card en dos columnas** (`CardEditPanel`): izquierda mantiene `CardForm` (titulo, solicitante, descripcion, asignacion, tags); derecha es un `Tabs` con `Chat` (por defecto) | `Enlaces` | `Archivos` (proximamente). Tamaño del modal: 85% del viewport.
|
||||
- **Chat per-card** (`CardChatPanel`): lista de comentarios humano-a-humano persistidos en `card_messages`. Enter envia, Shift+Enter salto de linea. Solo el autor puede borrar su propio mensaje.
|
||||
- **Enlaces** (`CardLinksPanel`): extrae URLs (`https?://...`) de titulo, descripcion y cuerpo de cada mensaje del chat. Deduplica, muestra hostname + URL completa + badge de origen. Click abre en pestaña nueva (`target="_blank"`).
|
||||
- **Duplicar card:** click derecho sobre la card abre el menu contextual (mismo que el boton `⋮`), donde aparece el item "Duplicar". Al pulsarlo invoca `POST /api/cards/{id}/duplicate`. La copia se inserta al final de la misma columna con titulo + " (copia)".
|
||||
- **Sesion obligatoria para chat:** `POST/DELETE /api/cards/{id}/messages` exige sesion activa (401 si falta). `author_id` siempre poblado; no hay comentarios anonimos.
|
||||
- **Archivos (proximamente):** blobs persistidos en SQLite (`card_attachments` con `BLOB`), no en filesystem.
|
||||
|
||||
### Build
|
||||
|
||||
|
||||
Reference in New Issue
Block a user