From da4bc337d691c7e8f0f54226f54e62321869be58 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sat, 24 Oct 2026 00:23:06 +0400 Subject: [PATCH] =?UTF-8?q?docs(openspec):=20wiki-module=20=E2=80=94=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=8B=20builder=20check=20(#91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- openspec/changes/wiki-module/design.md | 61 +++++++++++++++---- .../changes/wiki-module/specs/wiki/spec.md | 27 ++++++-- 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/openspec/changes/wiki-module/design.md b/openspec/changes/wiki-module/design.md index 6bf62c2..f187de6 100644 --- a/openspec/changes/wiki-module/design.md +++ b/openspec/changes/wiki-module/design.md @@ -192,22 +192,41 @@ jira безвреден. неудачи) прошло больше `wiki_auto_sync_hours` (настройка модуля, по умолчанию 24, `0` — выключено) и у проекта нет пакета `wiki_sync` в работе. -Хаб не ставит пакет, пока предыдущий `wiki_sync` проекта в работе: отвечает 409 с id пакета, MCP показывает его -состояние. +`POST /wiki/sync` и фоновая работа не ставят пакет, пока предыдущий `wiki_sync` проекта в работе: ответ 409 с id +пакета, MCP показывает его состояние. + +**Смена и сброс корня** не упираются в это правило. `PATCH` отменяет ещё не выданные (`queued`) пакеты `wiki_sync` +проекта. При новом корне он ставит новый пакет; уже выданный агенту пакет доживает. Отчёт `done` по команде, у которой +`params.root` не равен текущему корню проекта (сменён или сброшен), отбрасывается: копия и данные не меняются, команда +`done` с пометкой в `result.discarded = "корень сменился"`. Типичный случай: корень проставили до установки eva-agent, +потом исправили опечатку. **Агент** (контракт; решения внутри агента — его change): 1. Берёт корень `CmfDocument.get` и все страницы поддерева, как `collect_subtree` в `eva_wiki_export.py`. 2. По каждой странице берёт `text`. -3. Отправляет страницы пачками `POST /agent/wiki/pages {command_id, pages: [{code, eva_id, title, parent_code, - orderno, url, html, attachments: [{url, name}]}]}`. В пачке не больше 50 страниц и не больше 4 МБ тела. -4. Отчитывается `done` с `result = {root_title, codes: [<все коды дерева в порядке обхода>], eva_calls}`. +3. Разбирает ссылки страницы. Это делает агент, а не хаб: только он знает `eva.base_url`. + - **Вложение** — ``/`` на хост Eva с путём по правилу из Context. + - **Ссылка на страницу** — ссылка на хост Eva с кодом `DOC-<цифры>` в адресе. + - По каждой ссылке агент шлёт: + - `ref` — значение атрибута ровно как в HTML, по нему хаб находит место замены; + - `url` — абсолютный адрес (только у вложения); + - `name` — `alt` или `title` картинки, текст ссылки, иначе имя файла из пути; + - `code` — у ссылки на страницу. +4. Отправляет страницы пачками `POST /agent/wiki/pages {command_id, pages: [{code, eva_id, title, parent_code, + orderno, url, html, attachments: [{ref, url, name}], links: [{ref, code}]}]}`. В пачке не больше 50 страниц и не + больше 4 МБ тела. +5. Отчитывается `done` с `result = {root_title, codes: [<все коды дерева в порядке обхода>], eva_calls}`. +6. В `wiki_fetch` скачивает только адреса на хосте `eva.base_url`, иначе `failed` «чужой хост». Так токен Eva не уходит + на чужой адрес. **Хаб.** -- Пачки складываются в `wiki_sync_stage` без изменения копии. -- Отчёт `done` применяется одной транзакцией (`CommandHooks.on_result`): - - HTML переводится в Markdown; - - Markdown-копия собирается в `wiki/.