# π API μ€κ³ - WorkflowMCP Dashboard API
## π― API μ€κ³ μμΉ
1. **μκΈ° μ€λͺ
μ **: API μ체μμ μ¬μ©λ²κ³Ό ꡬ쑰 μ 곡
2. **RESTful**: REST μν€ν
μ² μμΉ μ€μ
3. **HATEOAS**: μλ΅μ κ΄λ ¨ λ§ν¬ ν¬ν¨
4. **μΈμ
μΉνμ **: μ μΈμ
μμλ μ½κ² νμ κ°λ₯
5. **κΈ°μ‘΄ μμ€ν
무μμ **: MCP λꡬ λνλ§ μν
## πΊοΈ μ 체 API λ§΅
### Root Discovery API
```
GET /api
{
"name": "WorkflowMCP Dashboard API",
"version": "1.0.0",
"description": "Complete REST API for WorkflowMCP system",
"base_url": "http://localhost:3301/api",
"documentation": "http://localhost:3301/api/docs",
"help": {
"getting_started": "/api/help/getting-started",
"api_reference": "/api/help/reference",
"examples": "/api/help/examples"
},
"discovery": {
"categories": "/api/discovery/categories",
"endpoints": "/api/discovery/endpoints",
"schemas": "/api/discovery/schemas"
},
"categories": {
"prds": {
"name": "PRD Management",
"base": "/api/prds",
"help": "/api/help/prds"
},
"tasks": {
"name": "Task Management",
"base": "/api/tasks",
"help": "/api/help/tasks"
},
"documents": {
"name": "Document Management",
"base": "/api/documents",
"help": "/api/help/documents"
},
"analytics": {
"name": "Analytics & Reports",
"base": "/api/analytics",
"help": "/api/help/analytics"
},
"system": {
"name": "System Management",
"base": "/api/system",
"help": "/api/help/system"
}
},
"tools": {
"api_console": "/api/console",
"health_check": "/api/health",
"openapi_spec": "/api/openapi.json"
}
}
```
## π Discovery & Help API μμΈ μ€κ³
### 1. Discovery API μμ€ν
#### GET /api/discovery/categories
```json
{
"success": true,
"data": {
"categories": [
{
"name": "prds",
"display_name": "PRD Management",
"description": "Product Requirements Document management",
"endpoint_count": 12,
"base_path": "/api/prds",
"help_path": "/api/help/prds",
"examples_path": "/api/help/prds/examples"
},
{
"name": "tasks",
"display_name": "Task Management",
"description": "Task creation, tracking, and dependency management",
"endpoint_count": 15,
"base_path": "/api/tasks",
"help_path": "/api/help/tasks",
"examples_path": "/api/help/tasks/examples"
}
]
},
"links": {
"self": "/api/discovery/categories",
"endpoints": "/api/discovery/endpoints",
"help": "/api/help/discovery"
}
}
```
#### GET /api/discovery/endpoints
```json
{
"success": true,
"data": {
"endpoints": [
{
"path": "/api/prds",
"methods": ["GET", "POST"],
"category": "prds",
"description": "PRD collection operations",
"schema": "/api/schemas/prds",
"help": "/api/help/prds/collection"
},
{
"path": "/api/prds/{id}",
"methods": ["GET", "PUT", "DELETE"],
"category": "prds",
"description": "Individual PRD operations",
"schema": "/api/schemas/prd",
"help": "/api/help/prds/individual"
}
]
},
"grouping": {
"by_category": "/api/discovery/endpoints?group=category",
"by_method": "/api/discovery/endpoints?group=method"
}
}
```
### 2. Help API κ³μΈ΅ ꡬ쑰
#### κ΄λ¦¬ λ©λ΄λ³ Help ꡬ쑰
```
/api/help/
βββ getting-started # μ 체 API μμ κ°μ΄λ
βββ authentication # μΈμ¦ (ν₯ν νμ₯)
βββ rate-limits # μ¬μ©λ μ ν
βββ errors # μλ¬ μ²λ¦¬ κ°μ΄λ
βββ prds/ # PRD κ΄λ¦¬ Help
β βββ overview # PRD κΈ°λ₯ κ°μ
β βββ collection # λͺ©λ‘ κ΄λ¦¬ (/api/prds)
β βββ individual # κ°λ³ κ΄λ¦¬ (/api/prds/{id})
β βββ linking # λ¬Έμ μ°κ²°
β βββ examples # μ€μ μ¬μ© μμ
β βββ troubleshooting # λ¬Έμ ν΄κ²°
βββ tasks/ # Task κ΄λ¦¬ Help
β βββ overview
β βββ collection
β βββ individual
β βββ dependencies # μμ‘΄μ± κ΄λ¦¬
β βββ status-workflow # μν λ³κ²½ νλ¦
β βββ examples
β βββ troubleshooting
βββ documents/ # Document κ΄λ¦¬ Help
β βββ overview
β βββ collection
β βββ individual
β βββ search # κ²μ κΈ°λ₯
β βββ types # λ¬Έμ νμ
κ°μ΄λ
β βββ fts # μ λ¬Έ κ²μ
β βββ examples
β βββ troubleshooting
βββ analytics/ # Analytics Help
β βββ overview
β βββ dashboards # λμ보λ λ°μ΄ν°
β βββ metrics # λ©νΈλ¦ μ μ
β βββ charts # μ°¨νΈ λ°μ΄ν° νμ
β βββ examples
βββ system/ # System κ΄λ¦¬ Help
βββ overview
βββ health # ν¬μ€ 체ν¬
βββ batch # λ°°μΉ μμ
βββ events # μ€μκ° μ΄λ²€νΈ
βββ caching # μΊμ κ΄λ¦¬
βββ monitoring # λͺ¨λν°λ§
```
#### μμ : GET /api/help/prds/overview
```json
{
"success": true,
"data": {
"title": "PRD Management API Overview",
"description": "Complete guide for managing Product Requirements Documents",
"quick_start": {
"steps": [
{
"step": 1,
"action": "List existing PRDs",
"endpoint": "GET /api/prds",
"example": "curl http://localhost:3301/api/prds"
},
{
"step": 2,
"action": "Create a new PRD",
"endpoint": "POST /api/prds",
"example": "curl -X POST http://localhost:3301/api/prds -H 'Content-Type: application/json' -d '{\"title\":\"New PRD\",\"description\":\"Description\"}'"
}
]
},
"available_operations": {
"collection": {
"list": "GET /api/prds",
"create": "POST /api/prds",
"batch_create": "POST /api/batch/prds"
},
"individual": {
"get": "GET /api/prds/{id}",
"update": "PUT /api/prds/{id}",
"delete": "DELETE /api/prds/{id}"
},
"relationships": {
"list_documents": "GET /api/prds/{id}/documents",
"link_document": "POST /api/prds/{id}/documents",
"unlink_document": "DELETE /api/prds/{id}/documents/{doc_id}"
}
},
"data_model": {
"required_fields": ["title", "description"],
"optional_fields": ["requirements", "acceptance_criteria", "priority", "status", "project_id"],
"field_types": {
"title": "string (1-200 chars)",
"description": "string (1-5000 chars)",
"priority": "enum: high|medium|low",
"status": "enum: draft|review|approved|completed"
}
},
"common_workflows": [
{
"name": "Create PRD with linked documents",
"description": "Complete workflow for PRD creation with documentation",
"steps": [
"Create PRD: POST /api/prds",
"Create related document: POST /api/documents",
"Link document to PRD: POST /api/prds/{id}/documents"
]
}
],
"navigation": {
"parent": "/api/help/prds",
"siblings": [
"/api/help/prds/collection",
"/api/help/prds/individual",
"/api/help/prds/examples"
],
"related": [
"/api/help/documents/overview",
"/api/help/tasks/overview"
]
}
},
"links": {
"self": "/api/help/prds/overview",
"examples": "/api/help/prds/examples",
"schema": "/api/schemas/prd",
"try_it": "/api/console#prds"
}
}
```
## π PRD Management API
### Collection Operations
#### GET /api/prds - PRD λͺ©λ‘ μ‘°ν
```
Query Parameters:
- status (string, optional): draft|review|approved|completed
- project_id (string, optional): νλ‘μ νΈ ID νν°
- priority (string, optional): high|medium|low
- sort (string, optional): created_desc|created_asc|updated_desc|title_asc
- limit (integer, optional): κ²°κ³Ό μ μ ν (κΈ°λ³Έ: 50, μ΅λ: 200)
- offset (integer, optional): κ²°κ³Ό μμ μμΉ (κΈ°λ³Έ: 0)
- search (string, optional): μ λͺ©/μ€λͺ
κ²μ
Response:
{
"success": true,
"data": {
"prds": [
{
"id": "prd-123",
"title": "User Authentication System",
"description": "Complete user auth with JWT",
"status": "approved",
"priority": "high",
"project_id": "proj-456",
"created_at": "2025-09-11T10:00:00Z",
"updated_at": "2025-09-11T10:30:00Z",
"requirements_count": 5,
"linked_documents_count": 3,
"linked_tasks_count": 8
}
],
"pagination": {
"total": 156,
"limit": 50,
"offset": 0,
"has_next": true,
"has_prev": false,
"next_offset": 50,
"prev_offset": null
},
"filters_applied": {
"status": "approved",
"project_id": "proj-456"
}
},
"links": {
"self": "/api/prds?status=approved&project_id=proj-456",
"next": "/api/prds?status=approved&project_id=proj-456&offset=50",
"first": "/api/prds?status=approved&project_id=proj-456&offset=0",
"help": "/api/help/prds/collection",
"create": "POST /api/prds",
"schema": "/api/schemas/prd-collection"
}
}
```
#### POST /api/prds - PRD μμ±
```
Request Body:
{
"title": "User Authentication System",
"description": "Implement comprehensive user authentication with JWT tokens",
"requirements": [
"Login with email/password",
"JWT token generation",
"Password reset functionality",
"User registration"
],
"acceptance_criteria": [
"User can log in with valid credentials",
"Invalid credentials show error message",
"JWT tokens expire after 24 hours",
"Password reset sends email notification"
],
"priority": "high",
"status": "draft",
"project_id": "proj-456"
}
Response (201 Created):
{
"success": true,
"data": {
"id": "prd-789",
"title": "User Authentication System",
"description": "Implement comprehensive user authentication with JWT tokens",
"requirements": [...],
"acceptance_criteria": [...],
"priority": "high",
"status": "draft",
"project_id": "proj-456",
"created_at": "2025-09-11T11:00:00Z",
"updated_at": "2025-09-11T11:00:00Z"
},
"links": {
"self": "/api/prds/prd-789",
"update": "PUT /api/prds/prd-789",
"delete": "DELETE /api/prds/prd-789",
"documents": "/api/prds/prd-789/documents",
"create_document": "POST /api/documents",
"help": "/api/help/prds/individual"
},
"message": "PRD created successfully"
}
```
### Individual Operations
#### GET /api/prds/{id} - PRD μμΈ μ‘°ν
```
Response:
{
"success": true,
"data": {
"id": "prd-789",
"title": "User Authentication System",
"description": "Implement comprehensive user authentication...",
"requirements": [...],
"acceptance_criteria": [...],
"priority": "high",
"status": "approved",
"project_id": "proj-456",
"created_at": "2025-09-11T11:00:00Z",
"updated_at": "2025-09-11T11:30:00Z",
"linked_documents": [
{
"id": "doc-101",
"title": "Auth API Specification",
"doc_type": "specification",
"link_type": "specification"
}
],
"linked_tasks": [
{
"id": "task-201",
"title": "Implement JWT middleware",
"status": "in_progress"
}
],
"statistics": {
"requirements_count": 4,
"acceptance_criteria_count": 4,
"linked_documents_count": 1,
"linked_tasks_count": 1,
"completion_percentage": 25
}
},
"links": {
"self": "/api/prds/prd-789",
"update": "PUT /api/prds/prd-789",
"delete": "DELETE /api/prds/prd-789",
"documents": "/api/prds/prd-789/documents",
"tasks": "/api/tasks?prd_id=prd-789",
"project": "/api/projects/proj-456",
"help": "/api/help/prds/individual",
"collection": "/api/prds"
}
}
```
## π Task Management API
### Collection Operations
#### GET /api/tasks - Task λͺ©λ‘ μ‘°ν
```
Query Parameters:
- status (string, optional): pending|in_progress|done|blocked|cancelled
- priority (string, optional): high|medium|low
- assignee (string, optional): λ΄λΉμ νν°
- project_id (string, optional): νλ‘μ νΈ ID
- prd_id (string, optional): μ°κ²°λ PRD ID
- due_date_from (string, optional): λ§κ°μΌ μμ (YYYY-MM-DD)
- due_date_to (string, optional): λ§κ°μΌ μ’
λ£ (YYYY-MM-DD)
- tags (string, optional): νκ·Έ νν° (μΌν ꡬλΆ)
- sort (string, optional): created_desc|due_date_asc|priority_desc
- limit (integer, optional): κΈ°λ³Έ 50, μ΅λ 200
- offset (integer, optional): νμ΄μ§ μ€νμ
Response:
{
"success": true,
"data": {
"tasks": [
{
"id": "task-201",
"title": "Implement JWT middleware",
"description": "Create Express middleware for JWT validation",
"status": "in_progress",
"priority": "high",
"assignee": "john.doe",
"due_date": "2025-09-15",
"estimated_hours": 8,
"actual_hours": 5,
"tags": ["backend", "security", "jwt"],
"project_id": "proj-456",
"created_at": "2025-09-11T09:00:00Z",
"updated_at": "2025-09-11T14:00:00Z",
"dependencies_count": 2,
"dependent_tasks_count": 3
}
],
"summary": {
"total_tasks": 245,
"by_status": {
"pending": 89,
"in_progress": 45,
"done": 98,
"blocked": 13
},
"by_priority": {
"high": 34,
"medium": 156,
"low": 55
}
}
},
"links": {
"self": "/api/tasks",
"create": "POST /api/tasks",
"dependencies": "/api/tasks/dependencies",
"help": "/api/help/tasks/collection"
}
}
```
### Task Dependencies
#### GET /api/tasks/{id}/dependencies - μμ‘΄μ± μ‘°ν
```
Response:
{
"success": true,
"data": {
"task_id": "task-201",
"dependencies": {
"depends_on": [
{
"id": "task-199",
"title": "Setup authentication database",
"status": "done",
"dependency_type": "blocking"
}
],
"dependent_tasks": [
{
"id": "task-203",
"title": "Create login API endpoint",
"status": "pending",
"dependency_type": "blocking"
}
]
},
"dependency_graph": {
"can_start": true,
"blocking_dependencies": [],
"ready_to_start": ["task-203", "task-204"]
}
},
"links": {
"self": "/api/tasks/task-201/dependencies",
"add_dependency": "POST /api/tasks/task-201/dependencies",
"task": "/api/tasks/task-201",
"help": "/api/help/tasks/dependencies"
}
}
```
#### POST /api/tasks/{id}/dependencies - μμ‘΄μ± μΆκ°
```
Request Body:
{
"depends_on_task_id": "task-199",
"dependency_type": "blocking"
}
Response (201 Created):
{
"success": true,
"data": {
"dependency_id": "dep-456",
"task_id": "task-201",
"depends_on_task_id": "task-199",
"dependency_type": "blocking",
"created_at": "2025-09-11T15:00:00Z"
},
"message": "Dependency added successfully",
"validation": {
"circular_dependency_check": "passed",
"task_existence_check": "passed"
}
}
```
## π Document Management API
### Collection & Search
#### GET /api/documents - λ¬Έμ λͺ©λ‘ μ‘°ν
```
Query Parameters:
- doc_type (string, optional): test_guide|analysis|report|specification|meeting_notes
- category (string, optional): μΉ΄ν
κ³ λ¦¬ νν°
- status (string, optional): draft|review|approved|archived
- tags (string, optional): νκ·Έ νν° (μΌν ꡬλΆ)
- project_id (string, optional): νλ‘μ νΈ ID
- entity_type (string, optional): μ°κ²°λ μν°ν° νμ
(prd|task|plan)
- entity_id (string, optional): μ°κ²°λ μν°ν° ID
- search (string, optional): μ λ¬Έ κ²μ
- sort (string, optional): created_desc|updated_desc|title_asc
- limit/offset: νμ΄μ§
Response:
{
"success": true,
"data": {
"documents": [
{
"id": "doc-101",
"title": "Auth API Specification",
"summary": "Complete API specification for authentication endpoints",
"doc_type": "specification",
"category": "backend",
"status": "approved",
"tags": ["api", "auth", "specification"],
"project_id": "proj-456",
"word_count": 2456,
"created_at": "2025-09-11T08:00:00Z",
"updated_at": "2025-09-11T12:00:00Z",
"linked_entities": [
{"type": "prd", "id": "prd-789", "title": "User Authentication System"}
]
}
],
"search_info": {
"query": "authentication API",
"total_matches": 12,
"search_time_ms": 23
}
},
"links": {
"self": "/api/documents",
"search": "/api/documents/search",
"create": "POST /api/documents",
"help": "/api/help/documents/collection"
}
}
```
#### GET /api/documents/search - μ λ¬Έ κ²μ
```
Query Parameters:
- q (string, required): κ²μμ΄
- doc_type (string, optional): λ¬Έμ νμ
νν°
- category (string, optional): μΉ΄ν
κ³ λ¦¬ νν°
- highlight (boolean, optional): κ²μμ΄ νμ΄λΌμ΄ν
(κΈ°λ³Έ: true)
- limit (integer, optional): κ²°κ³Ό μ (κΈ°λ³Έ: 20, μ΅λ: 100)
Response:
{
"success": true,
"data": {
"results": [
{
"id": "doc-101",
"title": "Auth API Specification",
"summary": "Complete API specification for **authentication** endpoints",
"doc_type": "specification",
"relevance_score": 0.89,
"highlights": [
"JWT **authentication** middleware implementation",
"**API** endpoint security requirements"
],
"matched_fields": ["title", "content", "tags"]
}
],
"search_metadata": {
"query": "authentication API",
"total_results": 12,
"search_time_ms": 15,
"suggestions": ["auth API", "authentication endpoints"],
"filters_applied": {
"doc_type": "specification"
}
}
},
"links": {
"self": "/api/documents/search?q=authentication+API",
"related_searches": "/api/documents/search/suggestions?q=authentication+API",
"help": "/api/help/documents/search"
}
}
```
## π Analytics & Dashboard API
### Dashboard Data
#### GET /api/analytics/dashboard - μ 체 λμ보λ λ°μ΄ν°
```
Query Parameters:
- project_id (string, optional): νΉμ νλ‘μ νΈ
- time_range (string, optional): 7d|30d|90d|1y (κΈ°λ³Έ: 30d)
- include_charts (boolean, optional): μ°¨νΈ λ°μ΄ν° ν¬ν¨ (κΈ°λ³Έ: true)
Response:
{
"success": true,
"data": {
"overview": {
"total_prds": 156,
"total_tasks": 1245,
"total_documents": 892,
"active_projects": 23,
"completion_rate": 0.78
},
"recent_activity": [
{
"type": "prd_created",
"entity_id": "prd-789",
"title": "User Authentication System",
"timestamp": "2025-09-11T11:00:00Z",
"user": "john.doe"
}
],
"charts": {
"task_status_distribution": {
"type": "pie",
"data": [
{"label": "Completed", "value": 456, "color": "#4CAF50"},
{"label": "In Progress", "value": 234, "color": "#2196F3"},
{"label": "Pending", "value": 345, "color": "#FF9800"},
{"label": "Blocked", "value": 67, "color": "#F44336"}
]
},
"completion_timeline": {
"type": "line",
"data": {
"labels": ["2025-09-04", "2025-09-05", "2025-09-06", "2025-09-07"],
"datasets": [
{
"label": "Tasks Completed",
"data": [12, 15, 8, 22],
"borderColor": "#4CAF50"
}
]
}
}
}
},
"links": {
"self": "/api/analytics/dashboard",
"project_specific": "/api/analytics/projects/{project_id}/dashboard",
"help": "/api/help/analytics/dashboards"
}
}
```
## π System Management API
### Health Check & Status
#### GET /api/health - μμ€ν
μν 체ν¬
```
Response:
{
"success": true,
"data": {
"status": "healthy",
"timestamp": "2025-09-11T15:30:00Z",
"version": "1.0.0",
"uptime_seconds": 86400,
"checks": {
"database": {
"status": "healthy",
"response_time_ms": 5,
"last_check": "2025-09-11T15:30:00Z"
},
"mcp_server": {
"status": "healthy",
"response_time_ms": 12,
"last_check": "2025-09-11T15:30:00Z"
},
"file_system": {
"status": "healthy",
"available_space_mb": 15680,
"last_check": "2025-09-11T15:30:00Z"
}
},
"statistics": {
"api_calls_last_hour": 1245,
"average_response_time_ms": 89,
"error_rate_percentage": 0.2
}
},
"links": {
"self": "/api/health",
"detailed": "/api/system/status",
"metrics": "/api/system/metrics"
}
}
```
### Batch Operations
#### POST /api/batch/prds - PRD μΌκ΄ μ²λ¦¬
```
Request Body:
{
"operation": "create",
"items": [
{
"title": "PRD 1",
"description": "Description 1",
"priority": "high"
},
{
"title": "PRD 2",
"description": "Description 2",
"priority": "medium"
}
],
"options": {
"stop_on_error": true,
"return_details": true
}
}
Response (202 Accepted):
{
"success": true,
"data": {
"batch_id": "batch-123",
"status": "processing",
"total_items": 2,
"processed_items": 0,
"failed_items": 0,
"estimated_completion": "2025-09-11T15:35:00Z",
"created_items": []
},
"links": {
"self": "/api/batch/prds/batch-123",
"status": "/api/batch/status/batch-123",
"help": "/api/help/system/batch"
}
}
```
### Real-time Events (SSE)
#### GET /api/events/stream - μ€μκ° μ΄λ²€νΈ μ€νΈλ¦Ό
```
Headers:
Accept: text/event-stream
Cache-Control: no-cache
Query Parameters:
- entity_types (string, optional): prd,task,document (μΌν ꡬλΆ)
- project_id (string, optional): νΉμ νλ‘μ νΈ μ΄λ²€νΈλ§
- session_id (string, optional): μΈμ
μλ³
Response (SSE Stream):
data: {"type":"connection","data":{"session_id":"sess-456","message":"Connected"}}
data: {"type":"prd:created","data":{"id":"prd-789","title":"New PRD","project_id":"proj-456"}}
data: {"type":"task:updated","data":{"id":"task-201","status":"done","updated_by":"john.doe"}}
data: {"type":"heartbeat","data":{"timestamp":"2025-09-11T15:35:00Z","connected_clients":5}}
```
## π§ Error Handling & Status Codes
### Standard Error Response Format
```json
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid input data provided",
"details": [
"Field 'title' is required",
"Field 'priority' must be one of: high, medium, low"
],
"field_errors": {
"title": "This field is required",
"priority": "Invalid value"
}
},
"links": {
"help": "/api/help/errors/validation",
"schema": "/api/schemas/prd",
"examples": "/api/help/prds/examples"
},
"timestamp": "2025-09-11T15:40:00Z",
"request_id": "req-789"
}
```
### HTTP Status Code Usage
- **200 OK**: μ±κ³΅μ μΈ μ‘°ν/μ
λ°μ΄νΈ
- **201 Created**: 리μμ€ μμ± μ±κ³΅
- **202 Accepted**: λΉλκΈ° μμ
μμ (λ°°μΉ μ²λ¦¬)
- **204 No Content**: μ±κ³΅μ μΈ μμ
- **400 Bad Request**: μλͺ»λ μμ² λ°μ΄ν°
- **401 Unauthorized**: μΈμ¦ νμ (ν₯ν)
- **403 Forbidden**: κΆν μμ (ν₯ν)
- **404 Not Found**: 리μμ€ μμ
- **409 Conflict**: μ€λ³΅ λλ μΆ©λ (μν μμ‘΄μ± λ±)
- **422 Unprocessable Entity**: μ ν¨νμ§λ§ μ²λ¦¬ λΆκ°λ₯ν μμ²
- **429 Too Many Requests**: Rate limit μ΄κ³Ό
- **500 Internal Server Error**: μλ² μ€λ₯
- **503 Service Unavailable**: μλΉμ€ μΌμ μ€λ¨
## π HATEOAS Links
### λͺ¨λ μλ΅μ ν¬ν¨λλ νμ€ λ§ν¬
```json
{
"links": {
"self": "/api/prds/123", // νμ¬ λ¦¬μμ€
"collection": "/api/prds", // 컬λ μ
μΌλ‘ λμκ°κΈ°
"help": "/api/help/prds", // κ΄λ ¨ λμλ§
"schema": "/api/schemas/prd", // λ°μ΄ν° μ€ν€λ§
"examples": "/api/help/prds/examples", // μ¬μ© μμ
"related": { // κ΄λ ¨ 리μμ€λ€
"documents": "/api/prds/123/documents",
"tasks": "/api/tasks?prd_id=123"
},
"actions": { // μν κ°λ₯ν μμ
λ€
"update": "PUT /api/prds/123",
"delete": "DELETE /api/prds/123"
}
}
}
```
---
**μμ±μΌ**: 2025-09-11
**μμ±μ**: μμ€ν
μ€κ³μ (Claude Code)
**κ²ν μ**: API μν€ν
νΈ, νλ‘ νΈμλ κ°λ°μ
**λ²μ **: 1.0
**μν**: UI/UX μ€κ³ λκΈ°