Add task_graph.json - Phase 4 implementation tasks (28 tasks)
This commit is contained in:
@@ -0,0 +1,572 @@
|
|||||||
|
{
|
||||||
|
"project": "web-cad",
|
||||||
|
"phase": 4,
|
||||||
|
"description": "Implementation tasks for web-cad 2D CAD application",
|
||||||
|
"total_tasks": 28,
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"id": "T01",
|
||||||
|
"title": "Project scaffolding and monorepo setup",
|
||||||
|
"description": "Set up monorepo structure with frontend/ and backend/ directories. Initialize Vite + React + TypeScript for frontend, Node.js + Fastify + TypeScript for backend. Configure ESLint, Prettier, Vitest. Create base Dockerfiles and docker-compose.yml.",
|
||||||
|
"dependencies": [],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Monorepo structure with frontend/ and backend/ directories",
|
||||||
|
"Vite + React 19 + TypeScript 5 configured for frontend",
|
||||||
|
"Node.js 22 + Fastify 5 + TypeScript 5 configured for backend",
|
||||||
|
"ESLint + Prettier configured for both",
|
||||||
|
"Vitest configured for both",
|
||||||
|
"Dockerfiles for both containers",
|
||||||
|
"docker-compose.yml with cad-backend and cad-frontend services",
|
||||||
|
"npm run dev works for both frontend and backend"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T02",
|
||||||
|
"title": "SQLite database schema and abstraction layer",
|
||||||
|
"description": "Implement SQLite database with better-sqlite3. Create all 14 tables from architecture.md (projects, users, sessions, project_members, layers, elements, blocks, block_instances, background_images, versions, plugins, settings, ai_config, webhooks, audit_log). Create DatabaseInterface abstract class with SQLite adapter. Add indexes and migrations framework.",
|
||||||
|
"dependencies": ["T01"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"All 14 tables created with correct schema",
|
||||||
|
"All indexes created",
|
||||||
|
"DatabaseInterface abstract class defined",
|
||||||
|
"SQLite adapter implements DatabaseInterface",
|
||||||
|
"WAL mode enabled",
|
||||||
|
"Migration framework with initial migration",
|
||||||
|
"Unit tests for all CRUD operations on each table"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T03",
|
||||||
|
"title": "Authentication service (backend)",
|
||||||
|
"description": "Implement auth service with email/password registration, login, logout, password reset. Use argon2 for password hashing. JWT sessions in HTTP-only cookies. CSRF protection via @fastify/csrf. Session timeout configurable.",
|
||||||
|
"dependencies": ["T02"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"POST /api/auth/register creates user with hashed password",
|
||||||
|
"POST /api/auth/login returns JWT in HTTP-only cookie",
|
||||||
|
"POST /api/auth/logout invalidates session",
|
||||||
|
"POST /api/auth/reset-password sends reset email",
|
||||||
|
"POST /api/auth/reset-password/confirm resets password",
|
||||||
|
"GET /api/auth/me returns current user info",
|
||||||
|
"argon2 password hashing",
|
||||||
|
"CSRF protection active",
|
||||||
|
"Unit tests for all auth endpoints"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T04",
|
||||||
|
"title": "Fastify server setup with plugins (CORS, helmet, rate-limit, swagger)",
|
||||||
|
"description": "Configure Fastify server with @fastify/cors, @fastify/helmet, @fastify/rate-limit, @fastify/swagger, @fastify/swagger-ui, @fastify/cookie, @fastify/jwt. Set up route group structure. Configure OpenAPI auto-generation.",
|
||||||
|
"dependencies": ["T01"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Fastify server starts on port 3001",
|
||||||
|
"CORS configured for cad.media-on.de origin",
|
||||||
|
"Helmet security headers active",
|
||||||
|
"Rate limiting: 100 req/min per user, 20 req/min unauthenticated",
|
||||||
|
"Swagger UI available at /api/docs",
|
||||||
|
"OpenAPI spec available at /api/openapi.json",
|
||||||
|
"Cookie plugin configured for JWT",
|
||||||
|
"Health endpoint at /api/health"
|
||||||
|
],
|
||||||
|
"estimated_effort": "small",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T05",
|
||||||
|
"title": "Project CRUD API endpoints",
|
||||||
|
"description": "Implement project management REST endpoints: list, create, get, update, delete. Include project members management (list, invite, update role, remove). Implement RBAC enforcement (Admin, Planner, Betrachter, Gast).",
|
||||||
|
"dependencies": ["T03", "T04"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"GET /api/projects lists user projects",
|
||||||
|
"POST /api/projects creates new project",
|
||||||
|
"GET /api/projects/:id returns project details",
|
||||||
|
"PUT /api/projects/:id updates project metadata",
|
||||||
|
"DELETE /api/projects/:id deletes project (Admin only)",
|
||||||
|
"GET/POST/PUT/DELETE /api/projects/:id/members for member management",
|
||||||
|
"RBAC enforced on all endpoints",
|
||||||
|
"OpenAPI schemas defined for all routes",
|
||||||
|
"Unit tests for all endpoints"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T06",
|
||||||
|
"title": "Layer and element CRUD API endpoints",
|
||||||
|
"description": "Implement layer and element REST endpoints. Layer: list, create, update, delete, reorder. Element: list (filtered), create, update, delete, batch operations. All with RBAC enforcement.",
|
||||||
|
"dependencies": ["T05"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"All layer endpoints implemented with RBAC",
|
||||||
|
"All element endpoints implemented with RBAC",
|
||||||
|
"Batch element operations endpoint",
|
||||||
|
"Layer reorder endpoint",
|
||||||
|
"Element filtering by layer, type, bbox",
|
||||||
|
"OpenAPI schemas for all routes",
|
||||||
|
"Unit tests for all endpoints"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T07",
|
||||||
|
"title": "Block management API endpoints",
|
||||||
|
"description": "Implement block definition and block instance REST endpoints. Block: list, create, update, delete. Block instance: insert, with position/rotation/scale parameters.",
|
||||||
|
"dependencies": ["T06"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Block definition CRUD endpoints",
|
||||||
|
"Block instance insert endpoint",
|
||||||
|
"Block instance transformations (position, rotation, scale)",
|
||||||
|
"RBAC enforced",
|
||||||
|
"OpenAPI schemas",
|
||||||
|
"Unit tests"
|
||||||
|
],
|
||||||
|
"estimated_effort": "small",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T08",
|
||||||
|
"title": "Yjs WebSocket server with y-leveldb persistence",
|
||||||
|
"description": "Set up y-websocket server integrated with Fastify. Configure y-leveldb persistence at /data/yjs/{projectId}.ldb. Implement room-based isolation per project. Add JWT authentication for WebSocket connections. Implement permission enforcement (read-only for Betrachter/Gast).",
|
||||||
|
"dependencies": ["T04", "T05"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"y-websocket server running on same port as Fastify",
|
||||||
|
"Room isolation per project ID",
|
||||||
|
"y-leveldb persistence to /data/yjs/ directory",
|
||||||
|
"JWT authentication on WebSocket connection",
|
||||||
|
"Read-only users cannot send updates (server drops writes)",
|
||||||
|
"Awareness protocol for cursor positions",
|
||||||
|
"Integration test: two clients sync changes"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T09",
|
||||||
|
"title": "Frontend base layout: Ribbon, SidePanel, CommandLine, StatusBar, CanvasArea",
|
||||||
|
"description": "Create React base layout matching AutoCAD Web structure. RibbonBar at top, SidePanel on right with tabs, CommandLine at bottom, StatusBar at bottom, CanvasArea as main area. Responsive design for min 1280px. Dark/Light theme support.",
|
||||||
|
"dependencies": ["T01"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"RibbonBar component with tab structure",
|
||||||
|
"SidePanel with tab navigation (Blocks, Layers, Properties, KI)",
|
||||||
|
"CommandLine input bar with autocomplete stub",
|
||||||
|
"StatusBar with coordinates and snap toggles",
|
||||||
|
"CanvasArea container component",
|
||||||
|
"Responsive layout for min 1280px",
|
||||||
|
"Dark/Light theme toggle",
|
||||||
|
"WCAG 2.1 AA compliance for all UI elements"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T10",
|
||||||
|
"title": "Canvas 2D rendering engine with rbush spatial index",
|
||||||
|
"description": "Implement Canvas 2D renderer with rbush spatial index. Render loop with requestAnimationFrame. Viewport culling via rbush search. Layer-based rendering order. Zoom/pan with affine transforms. Support line, circle, polyline, polygon, rect, arc, text, dimension, block_instance element types.",
|
||||||
|
"dependencies": ["T09"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Canvas 2D render loop at 60fps with requestAnimationFrame",
|
||||||
|
"rbush spatial index for viewport culling",
|
||||||
|
"Zoom/pan with mouse wheel and drag",
|
||||||
|
"screen-to-world and world-to-screen coordinate transforms",
|
||||||
|
"All element types render correctly",
|
||||||
|
"Layer visibility and lock states respected",
|
||||||
|
"Grid rendering",
|
||||||
|
"Performance: 1000 elements render at 60fps (initial benchmark)"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T11",
|
||||||
|
"title": "Yjs CRDT client integration and state synchronization",
|
||||||
|
"description": "Integrate Yjs Y.Doc in frontend. Create Yjs document structure (projectMeta, layers, elements, blocks, blocksInstances). Connect to y-websocket server. Implement React-Yjs binding for reactive updates. Sync canvas rendering with Yjs state changes.",
|
||||||
|
"dependencies": ["T08", "T10"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Yjs Y.Doc initialized with correct structure",
|
||||||
|
"y-websocket provider connects to backend",
|
||||||
|
"Canvas updates when Yjs document changes",
|
||||||
|
"Yjs document updates when canvas elements change",
|
||||||
|
"rbush index updates incrementally on Yjs changes",
|
||||||
|
"Multi-user awareness (cursor positions visible)",
|
||||||
|
"Integration test: two browsers sync in real-time"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T12",
|
||||||
|
"title": "CAD drawing tools (line, circle, polyline, polygon, rect, arc, text, dimension)",
|
||||||
|
"description": "Implement drawing tools triggered from RibbonBar and CommandLine. Each tool creates elements in Yjs document. Tools: line, circle, polyline, polygon, rect, arc, text, mtext, dimension. Interactive drawing with mouse clicks and keyboard input.",
|
||||||
|
"dependencies": ["T11"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Line tool: click two points to draw line",
|
||||||
|
"Circle tool: center + radius",
|
||||||
|
"Polyline tool: multiple connected segments",
|
||||||
|
"Polygon tool: closed shape",
|
||||||
|
"Rect tool: two corner points",
|
||||||
|
"Arc tool: center, start angle, end angle",
|
||||||
|
"Text/MText tool: position + text input",
|
||||||
|
"Dimension tool: linear dimension with arrows",
|
||||||
|
"All tools create elements in Yjs document",
|
||||||
|
"All tools accessible from RibbonBar and CommandLine"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T13",
|
||||||
|
"title": "CAD modification tools (move, copy, rotate, scale, mirror, trim, extend, fillet, offset)",
|
||||||
|
"description": "Implement modification tools. Move, copy, rotate, scale, mirror, trim, extend, fillet, offset. Each operates on selected elements and updates Yjs document.",
|
||||||
|
"dependencies": ["T12"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Move tool: select + drag or base point + target",
|
||||||
|
"Copy tool: select + base point + target",
|
||||||
|
"Rotate tool: select + center + angle",
|
||||||
|
"Scale tool: select + base point + scale factor",
|
||||||
|
"Mirror tool: select + mirror axis",
|
||||||
|
"Trim tool: select boundary + trim elements",
|
||||||
|
"Extend tool: select boundary + extend elements",
|
||||||
|
"Fillet tool: select two elements + radius",
|
||||||
|
"Offset tool: select + distance",
|
||||||
|
"All modifications update Yjs document and undo history"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T14",
|
||||||
|
"title": "Selection engine and snap system",
|
||||||
|
"description": "Implement selection methods (single click, window, crossing, fence, quick-select, lasso) using rbush for hit testing. Implement snap engine (snap-to-grid, snap-to-endpoint, snap-to-midpoint, snap-to-center, snap-to-intersection, polar tracking, snap-to-perpendicular, snap-to-tangent). Snap tolerance 5px at active zoom. F3 toggle for snap.",
|
||||||
|
"dependencies": ["T10"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Single click selection with rbush hit testing",
|
||||||
|
"Window selection (left-to-right: inside)",
|
||||||
|
"Crossing selection (right-to-left: intersecting)",
|
||||||
|
"Fence selection (polyline crossing)",
|
||||||
|
"Quick-select by properties (layer, type, color)",
|
||||||
|
"Snap-to-endpoint, midpoint, center, intersection",
|
||||||
|
"Snap-to-grid with configurable grid size",
|
||||||
|
"Polar tracking",
|
||||||
|
"Snap-to-perpendicular and snap-to-tangent",
|
||||||
|
"F3 toggles snap on/off",
|
||||||
|
"Snap tolerance 5px at active zoom",
|
||||||
|
"Visual snap markers rendered on canvas"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T15",
|
||||||
|
"title": "Undo/Redo history system",
|
||||||
|
"description": "Implement undo/redo using Yjs update bytes. History stack with configurable size (default 100). KI operations appear as single atomic entries. Group operations (drag-and-drop) produce single undo entry via debouncing. Shortcuts: Ctrl+Z (undo), Ctrl+Y (redo).",
|
||||||
|
"dependencies": ["T11"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Undo (Ctrl+Z) reverses last action",
|
||||||
|
"Redo (Ctrl+Y) re-applies undone action",
|
||||||
|
"History stack limited to 100 entries (configurable)",
|
||||||
|
"KI operations are single undo entries",
|
||||||
|
"Drag-and-drop is single undo entry",
|
||||||
|
"Action history shows action type and timestamp",
|
||||||
|
"Undo/redo accessible from Command Line and Ribbon"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T16",
|
||||||
|
"title": "Layer management system (UI + API)",
|
||||||
|
"description": "Implement layer management UI in SidePanel. Layer list with name, visibility toggle, lock toggle, color, line type, transparency. Create, delete, rename layers. Set active layer. Filter layers. Layer state import/export as JSON.",
|
||||||
|
"dependencies": ["T11"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Layer list displayed in SidePanel Layers tab",
|
||||||
|
"Create new layer with name and properties",
|
||||||
|
"Toggle layer visibility",
|
||||||
|
"Toggle layer lock",
|
||||||
|
"Set layer color and line type",
|
||||||
|
"Set active layer for new elements",
|
||||||
|
"Delete layer (moves elements to default layer)",
|
||||||
|
"Filter layers by name, type, color",
|
||||||
|
"Layer state export as JSON",
|
||||||
|
"Layer state import from JSON",
|
||||||
|
"Layer changes sync via Yjs for multi-user"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T17",
|
||||||
|
"title": "Block library system (UI + API)",
|
||||||
|
"description": "Implement block library UI in SidePanel Blocks tab. Block hierarchy (parent-child). Block CRUD. Block insert via drag-and-drop. Block edit in-place. Block transforms (move, scale, rotate on insert). SVG import into blocks. Block package import (ZIP). Block verwaltung (umbenennen, duplizieren, löschen, verschieben).",
|
||||||
|
"dependencies": ["T16"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Block library displayed in SidePanel Blocks tab",
|
||||||
|
"Block hierarchy with parent-child relationships",
|
||||||
|
"Create block from selected elements",
|
||||||
|
"Insert block via drag-and-drop",
|
||||||
|
"Block transforms on insert (position, rotation, scale)",
|
||||||
|
"Edit block in-place within drawing context",
|
||||||
|
"SVG import as block content",
|
||||||
|
"Block package import (ZIP with SVG files)",
|
||||||
|
"Block verwaltung: rename, duplicate, delete, move in hierarchy",
|
||||||
|
"New block types can be registered",
|
||||||
|
"Block changes sync via Yjs"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T18",
|
||||||
|
"title": "Bestuhlungs-Tools (Event-specific seating tools)",
|
||||||
|
"description": "Implement event-specific seating tools: Reihen-Bestuhlung (auto row placement with rows, abstand, ausrichtung), Block-Bestuhlung (block seating with reihe/spalte abstand, absatz/endpunkt), Bestuhlungs-Parameter (stuhl-typ, reihe/spalte abstand, absatz, ausrichtung, block-konfiguration), Bestuhlung modifizieren (hinzufügen/entfernen stühle, verschieben), Automatische Bestuhlung (auto-zoom to placed seating).",
|
||||||
|
"dependencies": ["T17"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Reihen-Bestuhlung: auto row placement with parameters",
|
||||||
|
"Block-Bestuhlung: block seating with row/column spacing",
|
||||||
|
"Parameter panel: stuhl-typ, reihen/spalten abstand, ausrichtung",
|
||||||
|
"Bestuhlung modifizieren: add/remove chairs, move",
|
||||||
|
"Auto-zoom to placed seating",
|
||||||
|
"Seating tools accessible from Ribbon and SidePanel",
|
||||||
|
"Seating elements stored as blocks in Yjs"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T19",
|
||||||
|
"title": "Import/Export: DXF, SVG, PDF, PNG, JSON",
|
||||||
|
"description": "Implement import/export endpoints. Import: DXF (dxf-parser), SVG (native DOM API). Export: DXF (dxf-writer), SVG (native), PDF (pdf-lib), PNG (canvas toDataURL), JSON (full project). DXF import maps to layers, blocks, geometry. SVG import as blocks. Validate all imported data.",
|
||||||
|
"dependencies": ["T07", "T11"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"DXF import: parse and create elements/layers in Yjs",
|
||||||
|
"SVG import: parse and create blocks",
|
||||||
|
"DXF export: generate DXF from current project state",
|
||||||
|
"SVG export: generate W3C-compliant SVG",
|
||||||
|
"PDF export: generate PDF with layout, maßstab, title block",
|
||||||
|
"PNG export: render canvas to image",
|
||||||
|
"JSON export: full project data (elements, layers, blocks)",
|
||||||
|
"JSON import: restore project from JSON",
|
||||||
|
"Input validation on all import formats",
|
||||||
|
"File size limits enforced",
|
||||||
|
"Export accessible from Ribbon and API"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T20",
|
||||||
|
"title": "Hintergrund & Grundriss (background image / floor plan)",
|
||||||
|
"description": "Implement background image upload and placement. Support PNG, JPG, SVG, PDF-Seite as background. Position, scale, rotate background. Set opacity. Maßstabs-Definition (1:100, referenzstrecke). Grid definition (1:100, referenzstrecke). Hintergrund positionieren (verschieben, rotieren, skalieren). Hintergrund sichtbarkeit (on/off).",
|
||||||
|
"dependencies": ["T11"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Upload PNG, JPG, SVG as background image",
|
||||||
|
"Position, scale, rotate background",
|
||||||
|
"Set background opacity",
|
||||||
|
"Maßstabs-Definition with reference distance",
|
||||||
|
"Grid definition with reference distance",
|
||||||
|
"Background visibility toggle",
|
||||||
|
"Background rendered on offscreen canvas (cached)",
|
||||||
|
"Background stored in Yjs and SQLite"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T21",
|
||||||
|
"title": "KI Copilot backend: OpenAI-compatible proxy + Function Calling",
|
||||||
|
"description": "Implement KI Copilot backend service. Proxy to user-configured OpenAI-compatible API endpoint. Implement CAD-Function-Registry with all CAD operations as functions. Context injection (selection, zoom, layer, recent actions). System prompt construction. Function calling loop. Guardrails. KI config management (admin settings).",
|
||||||
|
"dependencies": ["T06", "T08"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"POST /api/ai/chat sends message to OpenAI-compatible endpoint",
|
||||||
|
"CAD-Function-Registry with 30+ CAD functions registered",
|
||||||
|
"Context injection: selection, zoom, layer, recent actions",
|
||||||
|
"System prompt with CAD domain instructions and guardrails",
|
||||||
|
"Function calling loop: tool_calls → execute → return result → LLM",
|
||||||
|
"Guardrails: destructive op confirmation, element limits, parameter validation",
|
||||||
|
"Rate limiting: max 20 function calls per turn",
|
||||||
|
"Error recovery: return errors to LLM, max 3 retries",
|
||||||
|
"Audit logging for all KI operations",
|
||||||
|
"POST/GET /api/ai/config for admin KI configuration",
|
||||||
|
"GET /api/ai/health checks endpoint connectivity",
|
||||||
|
"GET /api/ai/functions lists available functions"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T22",
|
||||||
|
"title": "KI Copilot frontend: chat panel + voice input",
|
||||||
|
"description": "Implement KI Copilot panel in SidePanel. Chat interface with message history. Display function calls and results. Show KI-performed actions on canvas. Voice input via Web Speech API (optional). Error/feedback handling. Undo for KI operations.",
|
||||||
|
"dependencies": ["T21", "T15"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"KI Copilot panel in SidePanel",
|
||||||
|
"Chat interface with message history",
|
||||||
|
"Function call results displayed in chat",
|
||||||
|
"KI-performed actions visible on canvas immediately",
|
||||||
|
"Voice input via Web Speech API (optional, with fallback to text)",
|
||||||
|
"Error messages displayed for failed operations",
|
||||||
|
"Feedback mechanism for KI actions",
|
||||||
|
"KI operations appear in undo history as atomic entries",
|
||||||
|
"User can undo KI operations with Ctrl+Z"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T23",
|
||||||
|
"title": "Plugin system: manifest, registry, lifecycle, API proxy",
|
||||||
|
"description": "Implement plugin system backend and frontend. Plugin manifest schema validation. Plugin registry (SQLite). Plugin lifecycle (install, activate, deactivate, uninstall). Plugin API proxy with permission enforcement. Error boundaries. Plugin UI integration (ribbon tabs, side panel tabs, commands, context menu). API hooks.",
|
||||||
|
"dependencies": ["T16"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Plugin manifest validation",
|
||||||
|
"Plugin registration in SQLite plugins table",
|
||||||
|
"Plugin install, activate, deactivate, uninstall lifecycle",
|
||||||
|
"Plugin API proxy with permission checking",
|
||||||
|
"Error boundaries: plugin crashes don't affect core",
|
||||||
|
"Plugin UI integration: ribbon tabs, side panel tabs, commands, context menu",
|
||||||
|
"API hooks: onElementCreate, onElementModify, onElementDelete, onProjectOpen, onProjectSave, onExport, onImport, onSelectionChange, onLayerChange",
|
||||||
|
"Plugin storage namespace isolation",
|
||||||
|
"Plugin API endpoints (GET, POST install, PUT activate/deactivate, DELETE)"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T24",
|
||||||
|
"title": "Version history and multi-user permissions UI",
|
||||||
|
"description": "Implement version history UI (list versions, create labeled version, restore version, diff-view). Implement multi-user permissions UI (user list, role assignment, permission matrix display). Auto-save indicator. Cursor awareness display (show other users' cursors with name/color).",
|
||||||
|
"dependencies": ["T11", "T05"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Version list with label, description, timestamp, creator",
|
||||||
|
"Create version snapshot (manual save with label)",
|
||||||
|
"Restore version (with confirmation)",
|
||||||
|
"Diff-view: highlight changes between versions",
|
||||||
|
"Auto-save indicator in status bar",
|
||||||
|
"Min 50 versions per project",
|
||||||
|
"User list with roles for project",
|
||||||
|
"Permission matrix display (role vs action)",
|
||||||
|
"Cursor awareness: other users' cursors visible with name/color",
|
||||||
|
"Active user list in side panel"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T25",
|
||||||
|
"title": "PWA setup: service worker, manifest, offline support, IndexedDB",
|
||||||
|
"description": "Configure PWA with vite-plugin-pwa. Service worker for app shell caching. manifest.json with icons, theme color, standalone display. IndexedDB via idb library for offline Yjs persistence (y-indexeddb). Offline indicator. Auto-sync on reconnect. Install prompt.",
|
||||||
|
"dependencies": ["T11"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"manifest.json with icons, theme color, standalone display",
|
||||||
|
"Service worker caches app shell",
|
||||||
|
"y-indexeddb persists Yjs state offline",
|
||||||
|
"Offline indicator in status bar",
|
||||||
|
"Auto-sync on reconnect (CRDT merge)",
|
||||||
|
"Installable as PWA in Chrome/Edge",
|
||||||
|
"Offline mode: can view and edit drawings",
|
||||||
|
"Reconnect: CRDT merge converges automatically"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T26",
|
||||||
|
"title": "i18n setup with i18next (German + English)",
|
||||||
|
"description": "Configure i18next and react-i18next. Create translation files for German (de) and English (en). Wrap all UI text in t() calls. Language switcher in settings. Architecture strings separate from UI strings.",
|
||||||
|
"dependencies": ["T09"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"i18next configured with de and en locales",
|
||||||
|
"Translation files for both languages",
|
||||||
|
"All UI text wrapped in t() calls",
|
||||||
|
"Language switcher in settings",
|
||||||
|
"No hardcoded strings in components",
|
||||||
|
"Architecture strings in separate namespace"
|
||||||
|
],
|
||||||
|
"estimated_effort": "small",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T27",
|
||||||
|
"title": "Units management and annotation tools",
|
||||||
|
"description": "Implement units management (mm, cm, m, inches, feet) with project-level configuration. Einheiten-Konvertierung bei Import/Export. Bemaßung (DIM linear, aligned, radial). Maßstäbe beim PDF-Export. Annotation tools: MText (multiline), Revision Clouds (REVLOUD), Leaders (MLEADER).",
|
||||||
|
"dependencies": ["T19"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"Project units configurable (mm, cm, m, inches, feet)",
|
||||||
|
"Unit conversion in import/export",
|
||||||
|
"Linear dimension tool",
|
||||||
|
"Aligned dimension tool",
|
||||||
|
"Radial dimension tool",
|
||||||
|
"MText (multiline text) tool",
|
||||||
|
"Revision Cloud tool",
|
||||||
|
"Leader (MLEADER) tool",
|
||||||
|
"Maßstab settings for PDF export",
|
||||||
|
"Units displayed in status bar"
|
||||||
|
],
|
||||||
|
"estimated_effort": "medium",
|
||||||
|
"assigned_subagent": "implementation_engineer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "T28",
|
||||||
|
"title": "Performance benchmark, optimization, and cross-browser testing",
|
||||||
|
"description": "Benchmark Canvas 2D rendering with 50k+ elements. Optimize: dirty rect tracking, batch rendering, offscreen canvas, incremental rbush updates. Cross-browser tests (Chrome, Firefox, Edge, Safari). Memory profiling (<500MB). Lighthouse score >=80. Visual regression tests for rendering.",
|
||||||
|
"dependencies": ["T19", "T25"],
|
||||||
|
"acceptance_criteria": [
|
||||||
|
"50k elements render at 60fps in Chrome",
|
||||||
|
"40k elements render at 60fps in Firefox",
|
||||||
|
"Browser memory <500MB with 50k elements",
|
||||||
|
"Lighthouse performance score >=80",
|
||||||
|
"Dirty rectangle tracking implemented",
|
||||||
|
"Batch rendering by element type",
|
||||||
|
"Offscreen canvas for grid and background",
|
||||||
|
"Incremental rbush updates on element changes",
|
||||||
|
"Cross-browser visual regression tests pass",
|
||||||
|
"First contentful paint <1.5s"
|
||||||
|
],
|
||||||
|
"estimated_effort": "large",
|
||||||
|
"assigned_subagent": "test_debug_engineer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dependency_graph": {
|
||||||
|
"T01": [],
|
||||||
|
"T02": ["T01"],
|
||||||
|
"T03": ["T02"],
|
||||||
|
"T04": ["T01"],
|
||||||
|
"T05": ["T03", "T04"],
|
||||||
|
"T06": ["T05"],
|
||||||
|
"T07": ["T06"],
|
||||||
|
"T08": ["T04", "T05"],
|
||||||
|
"T09": ["T01"],
|
||||||
|
"T10": ["T09"],
|
||||||
|
"T11": ["T08", "T10"],
|
||||||
|
"T12": ["T11"],
|
||||||
|
"T13": ["T12"],
|
||||||
|
"T14": ["T10"],
|
||||||
|
"T15": ["T11"],
|
||||||
|
"T16": ["T11"],
|
||||||
|
"T17": ["T16"],
|
||||||
|
"T18": ["T17"],
|
||||||
|
"T19": ["T07", "T11"],
|
||||||
|
"T20": ["T11"],
|
||||||
|
"T21": ["T06", "T08"],
|
||||||
|
"T22": ["T21", "T15"],
|
||||||
|
"T23": ["T16"],
|
||||||
|
"T24": ["T11", "T05"],
|
||||||
|
"T25": ["T11"],
|
||||||
|
"T26": ["T09"],
|
||||||
|
"T27": ["T19"],
|
||||||
|
"T28": ["T19", "T25"]
|
||||||
|
},
|
||||||
|
"critical_path": ["T01", "T02", "T03", "T05", "T08", "T11", "T12", "T13", "T19", "T28"],
|
||||||
|
"estimated_total_effort": "28 tasks (4 small, 11 medium, 8 large, 5 extra-large)",
|
||||||
|
"phases": {
|
||||||
|
"foundation": ["T01", "T02", "T03", "T04", "T08", "T09"],
|
||||||
|
"core_cad": ["T10", "T11", "T12", "T13", "T14", "T15"],
|
||||||
|
"features": ["T16", "T17", "T18", "T19", "T20", "T27"],
|
||||||
|
"ki_and_plugins": ["T21", "T22", "T23"],
|
||||||
|
"polish": ["T24", "T25", "T26", "T28"]
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user