Files
pulse-libs/skills/taskflow/schema/taskflow.sql
T
pulse-agent bbdb68a6de feat(lib-core): biblioteca atomica @pulse-libs/core v1.0.0-beta.1
Esta commit conteudo a estrutura atomica completa:

- types:     Result<T,E>, AsyncState<T>, Paginated<T>, SortConfig<T>
- utils:     date, str, num, cn, debounce, throttle, storage, arr, obj
- validators: Zod schemas — email, password, uuid, url, phone, CPF/CNPJ, sanitizedStr, safeParse
- hooks:     useToggle, useAsync, useDebounce, useLocalStorage, useMedia, useInterval, useOnClickOutside, useClipboard, useFetch
- components: Button, Input, Alert, Card, Spinner (atomic design pattern)
- build:     tsup v8 ESM+CJS + DTS + sourcemaps — 0 erros
- tests:     57 testes 100% usuarios
- docker:    multi-stage Dockerfile (node 20-alpine)
- config:    vitest, tsup, tsconfig strict, .npmignore

Filosofia atomica:/utils ← /types ← /validators ← /hooks ← /components
Build: npm run build | Test: npm test | Publish: npm publish

🤖 Generated with Pulse (openclaw + nova-self-improver)
2026-05-19 21:43:03 -03:00

104 lines
4.6 KiB
SQL

-- TaskFlow SQLite Schema
-- All statements use IF NOT EXISTS so this file is safe to re-run (idempotent).
-- Generated: 2026-02-20
-- Node requirement: >=22.5 (node:sqlite / DatabaseSync)
-- ---------------------------------------------------------------------------
-- PRAGMA tweaks (run once at connection time, not schema objects)
-- ---------------------------------------------------------------------------
PRAGMA journal_mode = WAL;
PRAGMA foreign_keys = ON;
-- ---------------------------------------------------------------------------
-- projects
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS projects (
id TEXT PRIMARY KEY, -- slug, e.g. "dashboard"
name TEXT NOT NULL,
description TEXT NOT NULL DEFAULT '',
status TEXT NOT NULL DEFAULT 'active'
CHECK (status IN ('active', 'paused', 'done')),
source_file TEXT NOT NULL DEFAULT 'PROJECTS.md',
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
-- ---------------------------------------------------------------------------
-- tasks_v2
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tasks_v2 (
id TEXT PRIMARY KEY, -- <slug>-NNN, e.g. "dashboard-001"
project_id TEXT NOT NULL,
title TEXT NOT NULL,
status TEXT NOT NULL
CHECK (status IN (
'backlog',
'in_progress',
'pending_validation',
'done',
'blocked'
)),
priority TEXT NOT NULL DEFAULT 'P2'
CHECK (priority IN ('P0', 'P1', 'P2', 'P3', 'P9')),
owner_model TEXT, -- agent/model tag (optional)
notes TEXT,
source_file TEXT NOT NULL,
legacy_key TEXT, -- for migrations from older systems
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
FOREIGN KEY (project_id) REFERENCES projects(id)
ON UPDATE CASCADE ON DELETE RESTRICT
);
CREATE INDEX IF NOT EXISTS idx_tasks_v2_project_status
ON tasks_v2 (project_id, status, priority);
-- ---------------------------------------------------------------------------
-- task_transitions_v2 (audit log — every status change is recorded here)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS task_transitions_v2 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id TEXT NOT NULL,
from_status TEXT, -- NULL on first insertion
to_status TEXT NOT NULL,
reason TEXT,
actor TEXT, -- 'sync', 'agent', 'human', etc.
actor_model TEXT, -- which model made the change
at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
FOREIGN KEY (task_id) REFERENCES tasks_v2(id)
ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_transitions_task_id
ON task_transitions_v2 (task_id, at DESC);
CREATE INDEX IF NOT EXISTS idx_transitions_at
ON task_transitions_v2 (at DESC);
-- ---------------------------------------------------------------------------
-- sync_state (singleton row — id must be 1)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS sync_state (
id INTEGER PRIMARY KEY CHECK (id = 1),
files_hash TEXT, -- hash of all task file contents
db_hash TEXT, -- hash of serialized DB task state
last_sync_at TEXT,
lock_owner TEXT, -- process/session that holds the lock
lock_until TEXT, -- TTL-based lock expiry (ISO8601, 60s TTL)
last_result TEXT -- 'ok' | 'error: ...'
);
-- Ensure the singleton row exists (safe to run multiple times).
INSERT OR IGNORE INTO sync_state (id) VALUES (1);
-- ---------------------------------------------------------------------------
-- legacy_key_map (migration bridge — maps old task keys to new tasks_v2 ids)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS legacy_key_map (
legacy_key TEXT PRIMARY KEY,
new_id TEXT NOT NULL,
FOREIGN KEY (new_id) REFERENCES tasks_v2(id)
);
CREATE INDEX IF NOT EXISTS idx_legacy_key_map_new_id
ON legacy_key_map (new_id);