GET /api/projects/:id/doc-content — Содержимое дизайн-дока
Сгенерировано из матриц + кода. Правки вносить в источники (
docs/matrices/,server/routes/), не здесь.
| Поле | Значение |
|---|---|
| HTTP | GET /api/projects/:id/doc-content |
| Auth | optionalAuth, requireProjectAccess — гость + авторизованный, доступ к проекту (read/write) |
| Scope токена | read |
| PG-функции | api.get_all_doc_content |
| Таблицы | block_doc_content |
| SRM | SRM-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: 3updated: 2026-06-10T12:30:00Zgenerated_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Чтобы получить один блок, а не весь документ — содержимое блока.