<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Читать документацию локально</title>
  <status stage="doc" state="work" audience="user"/>
  <p p="1">Документацию пакетов, которыми вы пользуетесь, включая приватные, можно читать на собственной машине, ничего никуда не отправляя. Эта страница скачивает руководство на вашу машину и открывает читалку в браузере.</p>
  <prompt id="read-docs-locally" p="2">
    Скачай руководство VibeVM, пакет org.vibevm.core/vibevm-docs, в машинное хранилище, открой локальную читалку документации и скажи мне адрес, который открыть в браузере.
    <needs>навык vibevm, установленный у вашего агента; доступ по сети к реестру один раз, или пакет, уже лежащий в хранилище</needs>
    <outcome>`vibe cache list` показывает `org.vibevm.core/vibevm-docs`; `vibe doc serve` запущен и печатает адрес на `127.0.0.1`; браузер показывает первую страницу руководства</outcome>
    <assert>vibe cache list --quiet</assert>
  </prompt>
  <section id="what-happens" title="Что происходит">
    <p p="3">Агент выполняет `vibe cache add org.vibevm.core/vibevm-docs`. Пакет документации никогда не ставится в проект; он прогревается в машинное [хранилище](../glossary/index.xml#store) вместе с пакетами, которые описывает, чтобы каждое правило, которое он цитирует, разрешалось без сети. Затем агент выполняет `vibe doc serve`: vibe запускает маленький веб-сервер, который слушает только на вашей машине, отрисовывает каждую страницу из хранилища по запросу и печатает адрес. Пока вы читаете, из интернета ничего не скачивается, и ни одна страница не покидает машину.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#KIND-DOC-NOT-INSTALLED" p="4"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#LOCAL-SERVE" p="5"/>
  </section>
  <section id="by-hand" title="Руками">
    <p p="6">1. Прогрейте хранилище. Внутри проекта источник — его [реестры](../glossary/index.xml#registry); вне проекта — реестры всей машины:</p>
    <example ref="cache-add-docs" p="7"/>
    <p p="8">2. Запустите читалку и откройте напечатанный адрес в браузере. Остановите её через Ctrl+C:</p>
    <example ref="doc-serve" p="9"/>
    <p p="10">3. Выберите язык переключателем на любой странице. Там, где у страницы нет перевода, читалка показывает язык самого руководства и говорит об этом.</p>
  </section>
  <section id="private-packages" title="Приватные пакеты">
    <p p="11">Та же читалка показывает документацию пакетов из приватного реестра или только с вашей машины: что лежит в хранилище, то она и отрисовывает. Это и есть задуманный путь для проприетарной документации, и потому читалка никогда не обращается к публичному сайту.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#INV-LOCAL-IS-OFFLINE" p="12"/>
  </section>
  <section id="the-shell" title="Оболочка читалки">
    <p p="13">Выпущенный `vibe` несёт интерфейс читалки внутри бинарника. `vibe`, собранный из исходников, несёт простую запасную оболочку; `vibe doc shell install` скачивает полный интерфейс для своей версии из ассетов выпуска в `~/.vibe/opt/`, проверив размер и отпечаток, и только по вашей просьбе. Без него читалка работает, просто скромнее, а `vibe doc serve --print-shell` говорит, какую из двух оболочек она держит.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#LOCAL-OFFLINE-SHELL" p="14"/>
  </section>
  <section id="edge-cases" title="Особые случаи и правила">
    <p p="15">Прогрев пакета документации прогревает и его [предметы](../glossary/index.xml#subject), так что правила, которые цитирует страница, разрешаются без сети.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#REL-WARMUP-CLOSURE" p="16"/>
    <p p="17">Внутри проекта, чей локальный реестр держит пакет прямо в дереве, `vibe cache add --offline` прогревает его без сети. Язык читалки берётся из `[i18n].preferred` проекта или из флага при запуске.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#LOCAL-WARMUP" p="18"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#LOC-LOCAL" p="19"/>
    <p p="20">На сайте та же страница живёт под `/doc/`: язык идёт следующим сегментом пути, а у языка источника префикса нет. Адрес с номером версии показывает текущее содержимое этой версии, потому что версию могут опубликовать заново, а реестр не хранит прошлых публикаций.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#SITE-MOUNT" p="21"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#SITE-VERSION-SHOWS-CURRENT" p="22"/>
    <p p="23">Читалку может встроить плагин редактора через iframe; тогда плагин передаёт при запуске собственный origin, и читалка принимает фреймы только из него.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#LOCAL-CSP" p="24"/>
    <p p="25">Агент читает то же хранилище: `vibe explain "spec://org.vibevm.core/vibevm-docs-ru/start/what-vibevm-is"` печатает страницу или блок текстом.</p>
  </section>
</spec>
