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

GET /api/projects/:id/doc-content — Содержимое дизайн-дока

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

ПолеЗначение
HTTPGET /api/projects/:id/doc-content
AuthoptionalAuth, requireProjectAccess — гость + авторизованный, доступ к проекту (read/write)
Scope токенаread
PG-функцииapi.get_all_doc_content
Таблицыblock_doc_content
SRMSRM-196
RP (права)RP-117
Файл роутаserver/routes/projects.js
Статусdone

Аргументы запроса (best-effort из хендлера; путь-параметры опущены):

аргументов не обнаружено (подтвердить вручную по server/routes/projects.js)

Коды ответов/ошибок (из хендлера): 500 (+ 200) — уточнить причины вручную

Для человека

Как открыть: откройте проект из списка (попадёте в граф) → в левой панели нажмите вкладку «Doc» (▧). Откроется дизайн-документ проекта — пояснительный текст по каждому блоку графа.

Возвращает содержимое всего дизайн-дока сразу — текст всех блоков проекта одним списком. Именно эти данные подкладываются под экран «Design Doc», когда вы переключаетесь на вкладку документа: каждый блок графа становится разделом с собственным текстом.

Блоки, у которых текст ещё не написан и не сгенерирован, в ответе отсутствуют — пустых заготовок здесь нет. Каждая запись несёт сам текст, номер версии и отметку последнего изменения. Чтение доступно всем, у кого есть доступ к проекту: владельцу, коллегам по спейсу, наблюдателю; гость видит документ только своего проекта.

Для агента

Чтение — достаточно токена со scope read (см. Конвенции). Тела у запроса нет, только путь-параметр :id — идентификатор проекта. Доступ проверяется так же, как в UI: токен видит ровно те проекты, что и его владелец.

Пример запроса (Markdown-зеркало):

Окно терминала
curl https://specbuilder.vnimanie.ai/api/projects/a1b2c3d4-.../doc-content \
-H "Authorization: Bearer tak_..." \
-H "Accept: text/markdown"

Cookie-клиент (браузер) всегда получает JSON — массив записей { node_id, content, version, generated_by, updated_at }. Токен с Accept: text/markdown (или ?format=md) получает Markdown-зеркало (server/agent/negotiate.js); без этих заголовков токену тоже придёт JSON.

Поток Markdown (serializeDocContent, server/agent/markdown.js): один раздел на блок. В заголовке раздела — человекочитаемое имя блока (резолвится из графа), а не сырой node_id; тело каждого блока идёт как есть, в текстовом fenced-блоке:

# doc-content a1b2c3d4-...
blocks: 2
## Сбор данных
version: 3
updated: 2026-06-10T12:30:00Z
generated_by: llm_full
​```text
Раздел описывает источники данных и пайплайн загрузки...
​```

У ресурса есть ETag (берётся из самой свежей отметки updated_at); повтор с If-None-Match вернёт 304 без тела — экономия токенов на неизменившемся документе (server/agent/negotiate.js). Этот же эндпоинт фигурирует как read-аффорданс read-doc в наборе ресурса project (server/agent/affordances.js):

GET /api/projects/{id}/doc-content — read-doc — returns the design-document content

Чтобы получить один блок, а не весь документ — содержимое блока.

Связанные