<?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">В самолёте или за файрволом vibe продолжает работать из того, что уже есть на машине. Эта страница скачивает нужное до отъезда и ставит из него без сети.</p>
  <prompt id="work-offline" p="2">
    Перед тем как я уйду в офлайн, скачай в машинное хранилище всё, что нужно проекту VibeVM в текущей папке, плюс пакет org.vibevm.world/multi-user-planning, затем проверь хранилище и покажи мне, что офлайн-установка этого проекта проходит.
    <needs>навык vibevm, установленный у вашего агента; доступ по сети сейчас; проект с `vibe.toml`</needs>
    <outcome>`vibe cache list` показывает пакеты проекта и лишний; `vibe cache check` сообщает, что каждая запись цела; `vibe install --offline` завершается без единого запроса по сети</outcome>
    <assert>vibe cache check</assert>
    <assert>vibe reinstall --force --offline --assume-yes</assert>
  </prompt>
  <section id="what-happens" title="Что происходит">
    <p p="3">Агент выполняет `vibe cache add` для лишнего пакета: команда разрешает его вместе со всем замыканием зависимостей и скачивает каждый узел в [хранилище](../glossary/index.xml#store), не касаясь проекта. Один раз, пока сеть есть, он выполняет `vibe install`, чтобы собственные пакеты проекта тоже оказались в хранилище, затем `vibe cache check`, чтобы сверить каждую запись с её [отпечатком](../glossary/index.xml#fingerprint). Наконец он выполняет `vibe install --offline`: подбор версий и скачивание обслуживаются только из хранилища, и если чего-то не хватает, команда громко падает, а не ставит частичный граф.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#OFFLINE-LOCAL-ONLY" p="4"/>
  </section>
  <section id="by-hand" title="Руками">
    <p p="5">1. Прогрейте хранилище пакетом и его зависимостями. Внутри проекта источник — его [реестры](../glossary/index.xml#registry); вне проекта — реестры всей машины:</p>
    <example ref="cache-add" p="6"/>
    <p p="7">2. Посмотрите и проверьте, что лежит в хранилище:</p>
    <example ref="cache-list" p="8"/>
    <example ref="cache-check" p="9"/>
    <p p="10">3. Установите без сети:</p>
    <example ref="install-offline" p="11"/>
  </section>
  <section id="switching-it-on" title="Три способа включить офлайн-режим">
    <p p="12">Флаг `--offline` у любой команды; переменная окружения `VIBE_OFFLINE=1`; или настройка `offline = true` в секции `[net]` файла `~/.vibe/config.toml`. Флаг сильнее переменной, переменная сильнее настройки. По умолчанию vibe работает онлайн.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#OFFLINE-LAYERING" p="13"/>
  </section>
  <section id="air-gapped" title="Целая команда без сети">
    <p p="14">Для машины, которая никогда не видит реестр, `vibe registry vendor` записывает папку со всеми пакетами, на которые ссылается [лок-файл](../glossary/index.xml#lock-file), готовую служить [зеркалом](../glossary/index.xml#mirror) по адресу `file://` на той стороне. Отпечатки едут вместе с ней, так что зеркало проверяется, как любое другое.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#MIRROR-LAYER" p="15"/>
  </section>
  <section id="edge-cases" title="Особые случаи и правила">
    <p p="16">Если офлайн-установка отказывает пакету, который уже лежит в хранилище, значит, реестры проекта на этой машине ни разу не клонировали и vibe не может узнать, какие версии существуют; одна онлайн-установка в любом проекте клонирует их, а зеркалу `file://` клон не нужен вовсе.</p>
    <p p="17">Офлайн-подбор видит хранилище по состоянию на последнее обновление: версия, опубликованная после того, как вы ушли в офлайн, невидима, пока вы не вернётесь и не выполните `vibe registry sync` или онлайн-установку.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#AS-OF-LAST-REFRESH" p="18"/>
    <p p="19">Пакетом в хранилище можно пользоваться, даже когда его реестр больше не перечисляет; пакет, который до хранилища не добрался, — жёсткая ошибка с именем недостающей [координаты](../glossary/index.xml#coordinate).</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#OFFLINE-HARD-ERROR" p="20"/>
    <p p="21">Менеджер версий самой программы подчиняется той же позиции: под ней `vibe self update`, `install` и `reinstall` отказывают до первого запроса, называя адрес, который им понадобился бы, а `self ls`, `current` и `which` отвечают с машины как обычно.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-019#CMD-OFFLINE" p="22"/>
  </section>
</spec>
