feat: pivot to AI-native task management platform (#232)
Replace the agent framework codebase with a new monorepo structure for an AI-native Linear-like product where agents are first-class citizens. New architecture: - server/ — Go backend (Chi + gorilla/websocket + sqlc) - API server with REST routes for issues, agents, inbox, workspaces - WebSocket hub for real-time updates - Local daemon entry point for agent runtime connection - PostgreSQL migration with 13 tables (issue, agent, inbox, etc.) - WebSocket protocol types for server<->daemon communication - apps/web/ — Next.js 16 frontend - Dashboard layout with sidebar navigation - Route skeleton: inbox, issues, agents, board, settings - packages/ui/ — Preserved shadcn/ui design system (26+ components) - packages/types/ — Full API contract types (Issue, Agent, Workspace, Inbox, Events) - packages/sdk/ — REST ApiClient + WebSocket WSClient - packages/store/ — Zustand stores (issue, agent, inbox, auth) - packages/hooks/ — React hooks (useIssues, useAgents, useInbox, useRealtime) - packages/utils/ — Shared utilities Removed: apps/cli, apps/desktop, apps/mobile, apps/gateway, packages/core, skills/, and all agent-framework code. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
3f589d8326
commit
d4f5c5b16f
677 changed files with 2779 additions and 122531 deletions
178
server/migrations/001_init.up.sql
Normal file
178
server/migrations/001_init.up.sql
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
-- Enable extensions
|
||||
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
||||
|
||||
-- Users
|
||||
CREATE TABLE "user" (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT NOT NULL,
|
||||
email TEXT UNIQUE NOT NULL,
|
||||
avatar_url TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Workspaces
|
||||
CREATE TABLE workspace (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT NOT NULL,
|
||||
slug TEXT UNIQUE NOT NULL,
|
||||
description TEXT,
|
||||
settings JSONB NOT NULL DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Members (user <-> workspace)
|
||||
CREATE TABLE member (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
||||
user_id UUID NOT NULL REFERENCES "user"(id) ON DELETE CASCADE,
|
||||
role TEXT NOT NULL CHECK (role IN ('owner', 'admin', 'member')),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
UNIQUE(workspace_id, user_id)
|
||||
);
|
||||
|
||||
-- Agents
|
||||
CREATE TABLE agent (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
avatar_url TEXT,
|
||||
runtime_mode TEXT NOT NULL CHECK (runtime_mode IN ('local', 'cloud')),
|
||||
runtime_config JSONB NOT NULL DEFAULT '{}',
|
||||
visibility TEXT NOT NULL DEFAULT 'workspace' CHECK (visibility IN ('workspace', 'private')),
|
||||
status TEXT NOT NULL DEFAULT 'offline' CHECK (status IN ('idle', 'working', 'blocked', 'error', 'offline')),
|
||||
max_concurrent_tasks INT NOT NULL DEFAULT 1,
|
||||
owner_id UUID REFERENCES "user"(id),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Issues
|
||||
CREATE TABLE issue (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
||||
title TEXT NOT NULL,
|
||||
description TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'backlog'
|
||||
CHECK (status IN ('backlog', 'todo', 'in_progress', 'in_review', 'done', 'blocked', 'cancelled')),
|
||||
priority TEXT NOT NULL DEFAULT 'none'
|
||||
CHECK (priority IN ('urgent', 'high', 'medium', 'low', 'none')),
|
||||
assignee_type TEXT CHECK (assignee_type IN ('member', 'agent')),
|
||||
assignee_id UUID,
|
||||
creator_type TEXT NOT NULL CHECK (creator_type IN ('member', 'agent')),
|
||||
creator_id UUID NOT NULL,
|
||||
parent_issue_id UUID REFERENCES issue(id) ON DELETE SET NULL,
|
||||
acceptance_criteria JSONB NOT NULL DEFAULT '[]',
|
||||
context_refs JSONB NOT NULL DEFAULT '[]',
|
||||
repository JSONB,
|
||||
position FLOAT NOT NULL DEFAULT 0,
|
||||
due_date TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Issue labels
|
||||
CREATE TABLE issue_label (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
color TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE issue_to_label (
|
||||
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
||||
label_id UUID NOT NULL REFERENCES issue_label(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (issue_id, label_id)
|
||||
);
|
||||
|
||||
-- Issue dependencies
|
||||
CREATE TABLE issue_dependency (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
||||
depends_on_issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
||||
type TEXT NOT NULL CHECK (type IN ('blocks', 'blocked_by', 'related'))
|
||||
);
|
||||
|
||||
-- Comments
|
||||
CREATE TABLE comment (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
||||
author_type TEXT NOT NULL CHECK (author_type IN ('member', 'agent')),
|
||||
author_id UUID NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
type TEXT NOT NULL DEFAULT 'comment'
|
||||
CHECK (type IN ('comment', 'status_change', 'progress_update', 'system')),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Inbox items
|
||||
CREATE TABLE inbox_item (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
||||
recipient_type TEXT NOT NULL CHECK (recipient_type IN ('member', 'agent')),
|
||||
recipient_id UUID NOT NULL,
|
||||
type TEXT NOT NULL,
|
||||
severity TEXT NOT NULL DEFAULT 'info'
|
||||
CHECK (severity IN ('action_required', 'attention', 'info')),
|
||||
issue_id UUID REFERENCES issue(id) ON DELETE CASCADE,
|
||||
title TEXT NOT NULL,
|
||||
body TEXT,
|
||||
read BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
archived BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Agent task queue
|
||||
CREATE TABLE agent_task_queue (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
agent_id UUID NOT NULL REFERENCES agent(id) ON DELETE CASCADE,
|
||||
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
||||
status TEXT NOT NULL DEFAULT 'queued'
|
||||
CHECK (status IN ('queued', 'dispatched', 'running', 'completed', 'failed', 'cancelled')),
|
||||
priority INT NOT NULL DEFAULT 0,
|
||||
dispatched_at TIMESTAMPTZ,
|
||||
started_at TIMESTAMPTZ,
|
||||
completed_at TIMESTAMPTZ,
|
||||
result JSONB,
|
||||
error TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Daemon connections
|
||||
CREATE TABLE daemon_connection (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
agent_id UUID NOT NULL REFERENCES agent(id) ON DELETE CASCADE,
|
||||
daemon_id TEXT NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'disconnected'
|
||||
CHECK (status IN ('connected', 'disconnected')),
|
||||
last_heartbeat_at TIMESTAMPTZ,
|
||||
runtime_info JSONB NOT NULL DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Activity log
|
||||
CREATE TABLE activity_log (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
||||
issue_id UUID REFERENCES issue(id) ON DELETE CASCADE,
|
||||
actor_type TEXT CHECK (actor_type IN ('member', 'agent', 'system')),
|
||||
actor_id UUID,
|
||||
action TEXT NOT NULL,
|
||||
details JSONB NOT NULL DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_issue_workspace ON issue(workspace_id);
|
||||
CREATE INDEX idx_issue_assignee ON issue(assignee_type, assignee_id);
|
||||
CREATE INDEX idx_issue_status ON issue(workspace_id, status);
|
||||
CREATE INDEX idx_issue_parent ON issue(parent_issue_id);
|
||||
CREATE INDEX idx_comment_issue ON comment(issue_id);
|
||||
CREATE INDEX idx_inbox_recipient ON inbox_item(recipient_type, recipient_id, read);
|
||||
CREATE INDEX idx_agent_task_queue_agent ON agent_task_queue(agent_id, status);
|
||||
CREATE INDEX idx_activity_log_issue ON activity_log(issue_id);
|
||||
CREATE INDEX idx_member_workspace ON member(workspace_id);
|
||||
CREATE INDEX idx_agent_workspace ON agent(workspace_id);
|
||||
Loading…
Add table
Add a link
Reference in a new issue