Перейти к содержимому

GET /api/projects/:id — Получить проект

Сгенерировано из матриц + кода. Правки вносить в источники (docs/matrices/, server/routes/), не здесь.

ПолеЗначение
HTTPGET /api/projects/:id
AuthoptionalAuth, requireProjectAccess — гость + авторизованный, доступ к проекту (read/write)
Scope токенаread
PG-функцииapi.get_project_graph
Таблицыproject, project_node, project_edge, project_node_role, content_item
SRMSRM-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-000000000001
version: 2026-06-20T11:42:08.512Z
updated: 2026-06-20T11:42:08.512Z
title: Сервис аналитики продаж
prompt: Сервис аналитики продаж для отдела маркетинга
status: ready
nodes: 12
edges: 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-Match304 — для агента, который опрашивает проект на изменения, это экономит токены. Если нужен только граф (без шапки проекта) и топо-порядок — берите GET /api/projects/{id}/graph.

Связанные