Gateway
фиксация зависимостей npm
OpenClaw использует pnpm-lock.yaml в исходных рабочих копиях. Опубликованные npm-пакеты OpenClaw используют npm-shrinkwrap.json — предназначенный для публикации файл блокировки зависимостей npm, поэтому при установке пакетов применяется граф зависимостей, проверенный во время выпуска.
Почему это важно
Shrinkwrap — это ведомость дерева зависимостей, поставляемого с npm-пакетом: он указывает npm, какие именно транзитивные версии следует установить.
| Файл | Где он важен | Что он означает |
|---|---|---|
pnpm-lock.yaml |
Исходная рабочая копия OpenClaw | Граф зависимостей для сопровождающих |
npm-shrinkwrap.json |
Опубликованный npm-пакет | Граф установки npm для пользователей |
package-lock.json |
Локальные приложения npm | Не является контрактом публикации OpenClaw |
Для выпусков OpenClaw это означает:
- опубликованный пакет не заставляет npm создавать новый граф зависимостей во время установки;
- изменения зависимостей можно проверить, поскольку они отражаются в различиях файла блокировки;
- при проверке выпуска тестируется тот же граф, который установят пользователи;
- неожиданные изменения размера пакета или нативных зависимостей обнаруживаются до публикации.
Shrinkwrap не является песочницей. Сам по себе он не делает зависимость безопасной и не заменяет изоляцию хоста, openclaw security audit, проверку происхождения пакета или дымовые тесты установки.
OpenClaw — это Gateway, среда выполнения плагинов, маршрутизатор моделей и среда выполнения агентов, поэтому установка по умолчанию влияет на время запуска, использование диска, загрузку нативных пакетов и подверженность рискам цепочки поставок. Shrinkwrap предоставляет стабильную границу для проверки выпуска: проверяющие видят изменения транзитивных зависимостей, валидаторы отклоняют непредвиденные изменения файла блокировки, а пакеты плагинов содержат собственный зафиксированный граф зависимостей вместо зависимости от корневого пакета.
Создание и проверка
Корневой npm-пакет openclaw, принадлежащие OpenClaw npm-пакеты плагинов (например, @openclaw/discord) и публикуемые пакеты рабочего пространства, такие как @openclaw/ai, включают npm-shrinkwrap.json при публикации. Зависимости рабочего пространства исключаются из корневого shrinkwrap, поскольку публикуются вместе с корневым пакетом; вместо этого каждый публикуемый пакет рабочего пространства фиксирует собственное дерево транзитивных зависимостей. Подходящие пакеты плагинов также могут публиковаться с явными bundledDependencies, включая файлы зависимостей среды выполнения в tar-архив плагина вместо того, чтобы полагаться только на разрешение зависимостей во время установки.
# Все пакеты, управляемые shrinkwrap (корневой пакет + публикуемые плагины)pnpm deps:shrinkwrap:generatepnpm deps:shrinkwrap:check # Только корневой пакетpnpm deps:shrinkwrap:root:generatepnpm deps:shrinkwrap:root:check # Только пакеты, затронутые текущим набором измененийpnpm deps:shrinkwrap:changed:generatepnpm deps:shrinkwrap:changed:checkГенератор формирует публикуемый формат файла блокировки npm, но отклоняет сгенерированные версии пакетов, которых ещё нет в pnpm-lock.yaml. Это сохраняет установленные pnpm границы по давности зависимостей и проверке переопределений и исправлений.
Рассматривайте следующие элементы как значимые для безопасности:
pnpm-lock.yamlnpm-shrinkwrap.json- содержимое зависимостей встроенных плагинов
- любые различия
package-lock.json
Валидаторы пакетов OpenClaw требуют наличия shrinkwrap в новых tar-архивах корневого пакета и отклоняют package-lock.json для опубликованных пакетов. Путь публикации npm-пакета плагина проверяет локальный shrinkwrap плагина, устанавливает локально включённые в пакет зависимости, а затем упаковывает или публикует пакет.
Проверка опубликованного пакета
Корневой пакет:
npm pack openclaw@<version> --json --pack-destination /tmp/openclaw-packtar -tf /tmp/openclaw-pack/openclaw-<version>.tgz | grep '^package/npm-shrinkwrap.json$'Пакет плагина:
npm pack @openclaw/discord@<version> --json --pack-destination /tmp/openclaw-plugin-packtar -tf /tmp/openclaw-plugin-pack/openclaw-discord-<version>.tgz | grep '^package/npm-shrinkwrap.json$'tar -tf /tmp/openclaw-plugin-pack/openclaw-discord-<version>.tgz | grep '^package/node_modules/'Дополнительная информация: npm-shrinkwrap.json.