Перейти к содержимому

Хранилище CLI и перенос состояния

Kodik CLI хранит изменяемое состояние под одним CLI persistence identity. Идентификатор объединяет вариант сборки и непрозрачный digest физического корня CLI, поэтому symlink или другое написание того же пути не создаёт второго владельца.

Production обычно использует ~/.kodik/cli. Явный --cli-data-dir <path> (или VSCODE_CLI_DATA_DIR) выбирает этот корень точно и отключает автоматический импорт из другого глобального дома. Development- и portable-корни имеют отдельные identities для credentials и сервисов.

Когда стандартный production CLI впервые заменяет прежнего владельца ~/.vscode-cli, он импортирует записи по смыслу, а не переименовывает и не копирует каталог рекурсивно:

Запись источника Результат
versions.json Файл разбирается заново; импортируются только совместимые пути установок, которые всё ещё существуют на этой машине. При конфликте побеждает destination.
servers/, вложенный cli/, serve-web/, staging загрузок и индексы cache Создаются или загружаются заново.
Логи и stale lock-файлы Остаются неактивными у источника. Live lock блокирует перенос, пока связанный CLI или сервис не остановлен.
license_consent.json Не переносится; при необходимости текущую лицензию нужно принять снова.
token.json Никогда не копируется. Для file-backed credential источника нужен новый вход.
Прежний credential в OS keyring Production-destination без credentials может один раз принять его только через secret-store API.
serve-web-token и serve-web-key-half Генерируются заново под destination identity.
Tunnel-записи и регистрация OS service Никогда не клонируются автоматически; используйте явную передачу единственного владельца ниже.
Неизвестные записи Остаются нетронутыми и неактивными у источника; перенос блокируется, пока новая версия Kodik или явное восстановление не классифицирует их.

CLI записывает манифест без секретов в <cli-root>/.migration/global-home/. Ошибки permissions, повреждённые или неизвестные записи, активные locks, aliases, concurrent или прерванный перенос и отказ keyring явно останавливают затронутую команду. Kodik не продолжает работу с внешне пустым identity.

Если автоматический перенос намеренно отключён, укажите точные source и destination:

Окно терминала
kodik --cli-data-dir /path/to/destination state import --from /path/to/source

Команда импортирует только повторно проверенные несекретные durable records. Source сохраняется неактивным; более поздние изменения из старого CLI не синхронизируются автоматически.

Credentials остаются изолированными, пока вы явно не разрешите их повторное использование на том же устройстве. Если вариант сборки источника отличается от запущенного CLI, укажите его:

Окно терминала
kodik --cli-data-dir /path/to/dev-cli state import \
--from /path/to/production-cli \
--reuse-credentials \
--source-build-variant production

Повторное использование читает credential источника через host keyring и записывает его через API keyring назначения. token.json не копируется. Если portable-носитель подключён к другой машине, исходной записи host keyring там нет, и Kodik сообщает, что на новом host нужно войти снова.

Tunnel record и systemd-, launchd- или Windows-service являются ресурсом с одним владельцем. Передавайте их явно:

Окно терминала
kodik --cli-data-dir /path/to/destination state import \
--from /path/to/source \
--reuse-credentials \
--source-build-variant production \
--transfer-tunnel-service \
--accept-server-license-terms

Kodik останавливает source tunnel, удаляет регистрацию его сервиса, проверяет authentication назначения, перемещает типизированные tunnel records, заново создаёт команду сервиса с точным destination root, регистрирует её и проверяет нового владельца. Если регистрация или проверка завершается ошибкой, Kodik восстанавливает записи и service registration источника и сообщает о неудачном переносе. Не копируйте tunnel JSON вручную и не запускайте два identity для одного сервиса.

Сохранённый нетуннельный source полезен для downgrade recovery, но старый и новый корни намеренно расходятся. Автоматической очистки нет: храните неизвестные файлы и диагностические логи, пока destination не проверен независимо и старой сборке или сервису больше не нужен источник.