Пакет D модуля wiki: перевод HTML, вложения, синхронизация, MCP, картинки в тексте (#135) #136

Merged
aep merged 9 commits from feat/135-wiki-package-d into main 2026-10-27 18:02:27 +03:00
Owner

Closes #135. Закрывает маркеры #94: T6.1–T6.5, T8.2, T8.3, T9.3 (#94 остаётся открытой — в ней есть и другие маркеры).

Спека: openspec/changes/wiki-package-d/, план: docs/superpowers/plans/2026-10-27-wiki-package-d.md.

Что сделано

  • Перевод HTML (T6.1–T6.5): миниатюра внутри ссылки на вложение распознаётся на любой глубине вложенности (<a><span><img>) — раньше ссылка на вложение пропадала из текста. Вложение внутри ссылки на страницу или внешней ссылки выводится отдельной ссылкой перед ней. При повторе ref действует первая запись. Пробел и скобки во внешних адресах кодируются. Хвостовая \ в тексте ссылки экранируется.
  • Вложение без файла (T8.2): ready, чьего файла нет в files/, по запросу скачивается заново.
  • Одна синхронизация на корень (T8.3): POST /batches и повтор команды с wiki_sync при идущей синхронизации того же корня — 422 с номером пакета. Возврат корня A → B → A, пока A у агента, отдаёт идущий пакет.
  • MCP вики (T9.3): значения из Eva (названия, путь, имена вложений, фрагменты, ошибки) выводятся одной строкой.
  • Картинки в тексте (решение владельца): хаб отдаёт image у вложений страницы — по имени файла в адресе Eva (имя вложения у картинок AWPCA часто без расширения). На странице «Вики» нажатие на картинку скачивает и показывает её в тексте; уже скачанные видны сразу; без нажатия ничего не скачивается. SVG не показывается.

Проверка

  • make check: pytest 1217 passed; фронт — lint чистый, 73 файла / 766 тестов.
  • Финальное ревью ветки (opus): Critical нет; I-1 и M-1 исправлены (90b03ed), остальное — ниже.

Rulings I made

  • R-1 (design.md): строка «Ветка» в шапке плана — её ищет хук require-plan. Цена ошибки — нет.
  • R-2 (design.md): ошибка команды в MCP sync с ожиданием тоже одной строкой — тот же текст Eva, что «ошибка синхронизации». Цена ошибки — нет.
  • R-3 (design.md): хранилище картинок внутри useWikiDownload; components пересоздаётся при смене карты, как при смене status; состояние вложений живёт в хуке и не сбрасывается. Цена ошибки — перемонтирование ссылок и картинок (M-3).
  • R-4 (design.md): картинка над кнопкой-ссылкой сохранения — по сценарию спеки. Цена ошибки — нет.
  • R-5 (design.md): у внешней ссылки края текста сохраняются, адрес вместо пустого текста — только при вынесенном вложении (I-1, M-1). Цена ошибки — нет.
  • Решения этапа спеки (T6.2–T6.4, T8.2, T8.3, T9.3, картинки) — в design.md, «Decisions made without discussion».

Находки

Маркер Суть Статус
I-1 внешняя ссылка теряет края текста, слова склеиваются fixed 90b03ed
M-1 пустая внешняя ссылка выводится адресом (повышена до Important: мусор на действующих страницах) fixed 90b03ed
M-8 рулинги исполнителя не в design.md fixed 90b03ed
M-2 вынесенные вложения склеены друг с другом и с остатком текста deferred
M-3 смена состояния вложения перемонтирует ссылки и картинки страницы (мигание, фокус) deferred
M-4 тип картинки по имени — у картинок без расширения blob остаётся octet-stream («открыть в новой вкладке» скачает) deferred
M-5 проверка T8.3 в check_batch не атомарна со вставкой пакета (двойной повтор) deferred
M-6 _line схлопывает только \r\n, не U+2028/U+0085/\v/\f deferred
M-7 нет компонентного теста клика по нескачанной картинке; подмена URL.createObjectURL не в afterEach deferred
O-1 SyntaxWarning в tests/test_api.py:1172 — было до ветки deferred

После merge

make web + перезапуск хаба — за владельцем. Живая проверка: картинка vgo-matching-1.png (AWPCA, уже ready) видна в тексте своей страницы.

🤖 Generated with Claude Code

Closes #135. Закрывает маркеры #94: T6.1–T6.5, T8.2, T8.3, T9.3 (#94 остаётся открытой — в ней есть и другие маркеры). Спека: `openspec/changes/wiki-package-d/`, план: `docs/superpowers/plans/2026-10-27-wiki-package-d.md`. ## Что сделано - **Перевод HTML** (T6.1–T6.5): миниатюра внутри ссылки на вложение распознаётся на любой глубине вложенности (`<a><span><img>`) — раньше ссылка на вложение пропадала из текста. Вложение внутри ссылки на страницу или внешней ссылки выводится отдельной ссылкой перед ней. При повторе `ref` действует первая запись. Пробел и скобки во внешних адресах кодируются. Хвостовая `\` в тексте ссылки экранируется. - **Вложение без файла** (T8.2): `ready`, чьего файла нет в `files/`, по запросу скачивается заново. - **Одна синхронизация на корень** (T8.3): `POST /batches` и повтор команды с `wiki_sync` при идущей синхронизации того же корня — 422 с номером пакета. Возврат корня A → B → A, пока A у агента, отдаёт идущий пакет. - **MCP вики** (T9.3): значения из Eva (названия, путь, имена вложений, фрагменты, ошибки) выводятся одной строкой. - **Картинки в тексте** (решение владельца): хаб отдаёт `image` у вложений страницы — по имени файла в адресе Eva (имя вложения у картинок AWPCA часто без расширения). На странице «Вики» нажатие на картинку скачивает и показывает её в тексте; уже скачанные видны сразу; без нажатия ничего не скачивается. SVG не показывается. ## Проверка - `make check`: pytest 1217 passed; фронт — lint чистый, 73 файла / 766 тестов. - Финальное ревью ветки (opus): Critical нет; I-1 и M-1 исправлены (90b03ed), остальное — ниже. ## Rulings I made - R-1 (design.md): строка «Ветка» в шапке плана — её ищет хук require-plan. Цена ошибки — нет. - R-2 (design.md): ошибка команды в MCP `sync` с ожиданием тоже одной строкой — тот же текст Eva, что «ошибка синхронизации». Цена ошибки — нет. - R-3 (design.md): хранилище картинок внутри `useWikiDownload`; `components` пересоздаётся при смене карты, как при смене `status`; состояние вложений живёт в хуке и не сбрасывается. Цена ошибки — перемонтирование ссылок и картинок (M-3). - R-4 (design.md): картинка над кнопкой-ссылкой сохранения — по сценарию спеки. Цена ошибки — нет. - R-5 (design.md): у внешней ссылки края текста сохраняются, адрес вместо пустого текста — только при вынесенном вложении (I-1, M-1). Цена ошибки — нет. - Решения этапа спеки (T6.2–T6.4, T8.2, T8.3, T9.3, картинки) — в `design.md`, «Decisions made without discussion». ## Находки | Маркер | Суть | Статус | |---|---|---| | I-1 | внешняя ссылка теряет края текста, слова склеиваются | fixed 90b03ed | | M-1 | пустая внешняя ссылка выводится адресом (повышена до Important: мусор на действующих страницах) | fixed 90b03ed | | M-8 | рулинги исполнителя не в design.md | fixed 90b03ed | | M-2 | вынесенные вложения склеены друг с другом и с остатком текста | deferred | | M-3 | смена состояния вложения перемонтирует ссылки и картинки страницы (мигание, фокус) | deferred | | M-4 | тип картинки по имени — у картинок без расширения blob остаётся octet-stream («открыть в новой вкладке» скачает) | deferred | | M-5 | проверка T8.3 в `check_batch` не атомарна со вставкой пакета (двойной повтор) | deferred | | M-6 | `_line` схлопывает только `\r\n`, не U+2028/U+0085/`\v`/`\f` | deferred | | M-7 | нет компонентного теста клика по нескачанной картинке; подмена `URL.createObjectURL` не в `afterEach` | deferred | | O-1 | `SyntaxWarning` в `tests/test_api.py:1172` — было до ветки | deferred | ## После merge `make web` + перезапуск хаба — за владельцем. Живая проверка: картинка `vgo-matching-1.png` (AWPCA, уже `ready`) видна в тексте своей страницы. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 9 commits 2026-10-27 18:01:32 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit a6b04a392a into main 2026-10-27 18:02:27 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/sdlc-hub#136
No description provided.