# Работать без сети {#root}

@status:doc/work @audience:user

[p01] В самолёте или за файрволом vibe продолжает работать из того, что уже есть на машине. Эта страница скачивает нужное до отъезда и ставит из него без сети.

[p02]
```prompt
Перед тем как я уйду в офлайн, скачай в машинное хранилище всё, что нужно проекту VibeVM в текущей папке, плюс пакет org.vibevm.world/multi-user-planning, затем проверь хранилище и покажи мне, что офлайн-установка этого проекта проходит.
```

- needs: навык vibevm, установленный у вашего агента; доступ по сети сейчас; проект с `vibe.toml`

outcome: `vibe cache list` показывает пакеты проекта и лишний; `vibe cache check` сообщает, что каждая запись цела; `vibe install --offline` завершается без единого запроса по сети

- assert: `vibe cache check`
- assert: `vibe reinstall --force --offline --assume-yes`

## Что происходит {#what-happens}

[p03] Агент выполняет `vibe cache add` для лишнего пакета: команда разрешает его вместе со всем замыканием зависимостей и скачивает каждый узел в [хранилище](../glossary/index.xml#store), не касаясь проекта. Один раз, пока сеть есть, он выполняет `vibe install`, чтобы собственные пакеты проекта тоже оказались в хранилище, затем `vibe cache check`, чтобы сверить каждую запись с её [отпечатком](../glossary/index.xml#fingerprint). Наконец он выполняет `vibe install --offline`: подбор версий и скачивание обслуживаются только из хранилища, и если чего-то не хватает, команда громко падает, а не ставит частичный граф.

> [p04] Under `--offline`, resolution and fetch must be satisfiable entirely from local sources — the cache (§2.7), `[[mirror]]` entries with a `file://` URL, and the project's own `vibe.lock` + `vibedeps/`.
>
> <spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#OFFLINE-LOCAL-ONLY>

## Руками {#by-hand}

[p05] 1. Прогрейте хранилище пакетом и его зависимостями. Внутри проекта источник — его [реестры](../glossary/index.xml#registry); вне проекта — реестры всей машины:

[p06] Example `cache-add` is copied from the source page at projection time.

[p07] 2. Посмотрите и проверьте, что лежит в хранилище:

[p08] Example `cache-list` is copied from the source page at projection time.

[p09] Example `cache-check` is copied from the source page at projection time.

[p10] 3. Установите без сети:

[p11] Example `install-offline` is copied from the source page at projection time.

## Три способа включить офлайн-режим {#switching-it-on}

[p12] Флаг `--offline` у любой команды; переменная окружения `VIBE_OFFLINE=1`; или настройка `offline = true` в секции `[net]` файла `~/.vibe/config.toml`. Флаг сильнее переменной, переменная сильнее настройки. По умолчанию vibe работает онлайн.

> [p13] It resolves through the established CLI config layering — flag, then a `VIBE_OFFLINE` environment variable, then a user-config `[net]` key; the flag wins. This mirrors the resolved-posture pattern already used for `--unattended` / `VIBE_UNATTENDED` (`output::resolve_unattended`).
>
> <spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#OFFLINE-LAYERING>

## Целая команда без сети {#air-gapped}

[p14] Для машины, которая никогда не видит реестр, `vibe registry vendor` записывает папку со всеми пакетами, на которые ссылается [лок-файл](../glossary/index.xml#lock-file), готовую служить [зеркалом](../glossary/index.xml#mirror) по адресу `file://` на той стороне. Отпечатки едут вместе с ней, так что зеркало проверяется, как любое другое.

> [p15] **Decision.** `[[mirror]]` entries are parallel alternative URLs for a specific registry (or `*` for any). During fetch:
>
> <spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#MIRROR-LAYER>

## Особые случаи и правила {#edge-cases}

[p16] Если офлайн-установка отказывает пакету, который уже лежит в хранилище, значит, реестры проекта на этой машине ни разу не клонировали и vibe не может узнать, какие версии существуют; одна онлайн-установка в любом проекте клонирует их, а зеркалу `file://` клон не нужен вовсе.

[p17] Офлайн-подбор видит хранилище по состоянию на последнее обновление: версия, опубликованная после того, как вы ушли в офлайн, невидима, пока вы не вернётесь и не выполните `vibe registry sync` или онлайн-установку.

> [p18] Offline resolution is therefore computed against the cache **as of its last refresh**. This is correct and expected — Maven `mvn -o` and `cargo --offline` have the same property — but it must be explicit: a `--offline` resolve may pick an older version than an online resolve would.
>
> <spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#AS-OF-LAST-REFRESH>

[p19] Пакетом в хранилище можно пользоваться, даже когда его реестр больше не перечисляет; пакет, который до хранилища не добрался, — жёсткая ошибка с именем недостающей [координаты](../glossary/index.xml#coordinate).

> [p20] Anything not available locally is a **hard error with an actionable message**: it names the missing package and version and tells the operator how to recover (run once online, `vibe cache add`, or `vibe registry vendor`).
>
> <spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-010#OFFLINE-HARD-ERROR>

[p21] Менеджер версий самой программы подчиняется той же позиции: под ней `vibe self update`, `install` и `reinstall` отказывают до первого запроса, называя адрес, который им понадобился бы, а `self ls`, `current` и `which` отвечают с машины как обычно.

> [p22] Every `self` verb honours the offline posture the process resolved —
>   `--offline`, `VIBE_OFFLINE` or `[net] offline`, layered as PROP-010
>   `##OFFLINE-LAYERING` says. Under it a release-lane verb is refused before its
>   first request, naming the verb and the address it would have needed; a
>   source-lane rebuild runs without fetching when the checkout and the crates
>   are already local, and is refused the same way otherwise. The domain never
>   reads the environment for this: the composition root hands the resolved
>   posture in.
>
> <spec://org.vibevm.core/vibevm/common/PROP-019#CMD-OFFLINE>

