Projects API
List projects
GET /api/projects
Headers: X-Tenant-ID: t_default (optional)
Query: ?tenantId=default (optional)
Response: 200 OK → [ { id, tenant_id, name, description, repo_url, status, created_at, updated_at } ]
Create project
POST /api/projects
Body: { name: string, description?: string, repo_url?: string }
Response: 200 OK → created project row
Get project
GET /api/projects/:id
Response: 200 OK → project row | 404 Not Found
Update project
PUT /api/projects/:id
Body: { name?, description?, repo_url?, status? }
Response: 200 OK → updated project row
Delete or archive project
DELETE /api/projects/:id?hard=true
Response: 204 No Content
Notes:
- Archived projects are hidden from list; use status filter via direct SQL if needed.
- Default tenant resolution uses tenants.slug = 'default'.