GET /api/projects/:id — Получить проект
Сгенерировано из матриц + кода. Правки вносить в источники (
docs/matrices/,server/routes/), не здесь.
| Поле | Значение |
|---|---|
| HTTP | GET /api/projects/:id |
| Auth | optionalAuth, requireProjectAccess — гость + авторизованный, доступ к проекту (read/write) |
| Scope токена | read |
| PG-функции | api.get_project_graph |
| Таблицы | project, project_node, project_edge, project_node_role, content_item |
| SRM | SRM-002 |
| RP (права) | RP-010, RP-012 |
| Файл роута | server/routes/projects.js |
| Статус | done |
Аргументы запроса (best-effort из хендлера; путь-параметры опущены):
аргументов не обнаружено (подтвердить вручную по server/routes/projects.js)
Коды ответов/ошибок (из хендлера): 404, 500 (+ 200) — уточнить причины вручную
Для человека
Как открыть: на списке проектов кликните по карточке проекта — откроется его граф.
Загружает один проект целиком: его заголовок, исходную задачу, статус и весь граф — ноды-блоки, связи между ними, роли и сгенерированный контент. Это рабочий экран проекта: блоки разложены по холсту, стрелки показывают зависимости, цветные облака группируют блоки по ролям.
Открыть можно только проект, к которому у вас есть доступ. Если проект не существует, удалён или недоступен вам по правам — вернётся 404 (ничего не открывается, список остаётся на месте). Уровень доступа (просмотр или редактирование) определяется вашей ролью в спейсе проекта; гость видит только проекты гостевых спейсов публичных и дефолтных коллекций.
Для агента
Чтение — достаточно токена со scope read (см. Конвенции). requireProjectAccess загружает проект и проверяет доступ владельца токена; если проект не найден или невидим — 404. Тела и query-параметров нет, всё в пути.
Пример запроса:
curl https://specbuilder.vnimanie.ai/api/projects/a1b2c3d4-1111-4aaa-9bbb-000000000001 \ -H "Authorization: Bearer tak_..." \ -H "Accept: text/markdown"Ответ 200 (Markdown-зеркало, токен с Accept: text/markdown): ресурс kind=project (server/agent/negotiate.js → sendResource) — компактные поля + список доступных вашему токену действий. Граф не разворачивается целиком: нода и рёбра отдаются числом (nodes/edges), за подробностями — отдельный /graph:
# project a1b2c3d4-1111-4aaa-9bbb-000000000001version: 2026-06-20T11:42:08.512Zupdated: 2026-06-20T11:42:08.512Z
title: Сервис аналитики продажprompt: Сервис аналитики продаж для отдела маркетингаstatus: readynodes: 12edges: 17
## Actions- GET /api/projects/a1b2c3d4-.../graph — read-graph — view=summary|full, diff_from=version- GET /api/projects/a1b2c3d4-.../doc-content — read-doc — design-document contentБлок ## Actions перечисляет только аффордансы, доступные данному токену (его scope и роль владельца) — server/agent/affordances.js.
Ответ 200 (JSON, cookie-клиент): полный объект проекта плюс развёрнутый граф под ключом graph (ноды с ролями, рёбра, роли, junction nodeRoles, contentItems):
{ "id": "a1b2c3d4-1111-4aaa-9bbb-000000000001", "title": "Сервис аналитики продаж", "prompt": "Сервис аналитики продаж для отдела маркетинга", "status": "ready", "space_id": "f9e8d7c6-...", "updated_at": "2026-06-20T11:42:08.512Z", "graph": { "nodes": [ { "id": "n1", "label": "Сбор требований", "roles": "[\"ba\"]" } ], "edges": [ { "source_id": "n1", "target_id": "n2" } ], "roles": [ { "id": "ba", "label": "Бизнес-аналитик" } ], "nodeRoles": [ { "node_id": "n1", "role_id": "ba" } ], "contentItems": [] }}У ресурса есть ETag (= updated_at); повтор с If-None-Match → 304 — для агента, который опрашивает проект на изменения, это экономит токены. Если нужен только граф (без шапки проекта) и топо-порядок — берите GET /api/projects/{id}/graph.
Связанные
- Экраны: Список проектов
- Конвенции · Роли · Ошибки · Глоссарий