<?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="update-packages" p="2">
    В проекте VibeVM в текущей папке покажи мне, у каких пакетов есть более новые версии, затем обнови их все и подытожь, что изменилось в лок-файле.
    <needs>навык vibevm, установленный у вашего агента; проект с `vibe.toml` и `vibe.lock`; доступ по сети к реестрам проекта</needs>
    <outcome>`vibe outdated` перечисляет кандидатов, `vibe update --all` сдвигает пины, а диф `vibe.lock` показывает старые и новые версии</outcome>
    <assert>vibe check --quiet</assert>
    <assert>vibe list --quiet</assert>
  </prompt>
  <section id="what-happens" title="Что происходит">
    <p p="3">Сначала агент выполняет `vibe outdated`: команда сравнивает каждый пин в [лок-файле](../glossary/index.xml#lock-file) с новейшей версией, которую предлагает [реестр](../glossary/index.xml#registry), и печатает разницу; она ничего не меняет. Затем он выполняет `vibe update --all`. vibe разрешает граф заново, предпочитая текущую версию каждого пакета, который не обновляется, и скачивает новое в [хранилище](../glossary/index.xml#store). Он показывает план; после подтверждения заменяет деревья пакетов, переписывает лок-файл и пересобирает стартовые файлы. Агент заканчивает тем, что зачитывает вам диф лок-файла: этот диф и есть точный список текста, который ваш агент отныне будет читать иначе.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-011#UPDATE-MOVES-LOCK" p="4"/>
  </section>
  <section id="by-hand" title="Руками">
    <p p="5">1. Посмотрите, что отстало:</p>
    <example ref="outdated" p="6"/>
    <p p="7">2. Обновите один пакет или все сразу:</p>
    <example ref="update" p="8"/>
    <p p="9">`vibe update --all` обновляет всё, что есть в лок-файле; две формы взаимно исключают друг друга.</p>
    <p p="10">3. Прочитайте диф `vibe.lock`, прежде чем коммитить. Каждая изменённая запись называет старую и новую версию и [отпечаток](../glossary/index.xml#fingerprint).</p>
  </section>
  <section id="the-constraint" title="Ограничение остаётся там, где вы его поставили">
    <p p="11">Обновление двигает пин в лок-файле внутри ограничения, которое называет [манифест](../glossary/index.xml#manifest); само ограничение оно не расширяет и не сужает. Если манифест говорит `^1.0`, обновление само на 2.0 не перейдёт. Чтобы сдвинуть и ограничение, установите новую версию явно с новым ограничением или передайте `--exact`, чтобы закрепить разрешённую версию и в манифесте.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#CF-RANGE" p="12"/>
  </section>
  <section id="recovery" title="Как восстановиться после ломающего обновления">
    <p p="13">Если после обновления проект перестал проходить проверку, дорога назад — лок-файл в системе контроля версий. Восстановите его и выполните `vibe reinstall`: команда пересобирает дерево из лока и хранилища без сети. Если повреждена запись в самом хранилище, `vibe cache check` её находит, а `vibe cache clean --package` удаляет, после чего свежая установка скачивает пакет заново.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#REINSTALL-NO-FORCE" p="14"/>
  </section>
  <section id="edge-cases" title="Особые случаи и правила">
    <p p="15">`vibe outdated` читает реестры, объявленные в манифесте проекта, а ради самого быстрого ответа — их [индекс](../glossary/index.xml#index-registry); проект, созданный `vibe init`, не объявляет ни одного, так что перед вопросом добавьте реестр через `vibe registry add`. Без сети команда сообщает, до чего не смогла достучаться, а не гадает.</p>
    <p p="16">Зависимость, объявленная как git-ветка, при обновлении обходится заново, и её запись в локе переезжает на текущий коммит ветки; тег или коммит остаются на месте.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-registry/PROP-002#ROW-GS-BRANCH-MEANING" p="17"/>
    <p p="18">`--upstream` сравнивает ещё и выпуски исходной библиотеки, которые пакет объявляет описанными, — для пакетов, документирующих стороннюю библиотеку.</p>
  </section>
</spec>
