stackpin
v0.1.0
Published
Prevent Node and package-manager config drift before CI breaks.
Maintainers
Readme
stackpin
Prevent Node and package-manager config drift before CI breaks.
Русская документация: перейти к разделу
stackpin checks the contract around a Node project and keeps the same runtime and package-manager intent aligned across package metadata, local version files, container images, and CI setup.
What It Checks
Node runtime sources:
package.json#engines.nodepackage.json#devEngines.runtimepackage.json#volta.node.nvmrc.node-versiondevDependencies["@types/node"]Dockerfile*docker-compose*.ymlanddocker-compose*.yaml.github/workflows/*.ymland.github/workflows/*.yamlwithactions/setup-node
Package manager sources:
package.json#devEngines.packageManagerpackage.json#packageManagerpackage.json#volta.<npm|pnpm|yarn|bun>
With --monorepo, the tool also walks workspace package.json files and checks their engines.node, devEngines, volta, and @types/node entries when present.
Commands
npx stackpin check
npx stackpin fix --source devEngines
npx stackpin doctor --monorepo
npx stackpin check --format jsoncheckreports drift, conflicts, and missing contract pieces.fixrewrites secondary files to match the selected source of truth.doctorexplains why each issue matters.
Source Selection
Use --source to pin the source of truth explicitly.
Supported selectors:
devEnginespackage.json#devEngines.runtimepackage.json#devEngines.packageManagerpackage.json#engines.nodepackage.json#packageManagerpackage.json#volta.node.nvmrc.node-version@types/node
If --source is omitted, stackpin infers a root source by priority:
package.json#devEngines.runtime.nvmrc.node-versionpackage.json#volta.nodepackage.json#engines.node
For package managers, the priority is:
package.json#devEngines.packageManagerpackage.json#packageManagerpackage.json#volta.<manager>
Fix Rules
fix is intentionally conservative.
- It will create or update root
engines.node,devEngines,.nvmrc, and.node-versionwhen it can derive a concrete value. - It updates existing Docker, docker-compose, and GitHub Actions files in place.
- In monorepos it updates workspace
engines.node, and workspacedevEngines.packageManagerwhen that field already exists. - It updates
@types/nodeonly when the dependency already exists. - It skips exact-pin targets such as
volta.nodeorpackage.json#packageManagerwhen the chosen source is too ambiguous, and reports that asskippedinstead of guessing.
Output
Text output is designed for local use.
--format json returns machine-readable results for CI. The report includes:
- inferred or explicit source of truth per domain
- every finding with
status,selector,actual, andexpected - notes when only one domain was selected explicitly
Документация на русском
Не допускает drift в конфигурации Node.js и package manager до того, как CI начнет падать.
stackpin проверяет контракт вокруг Node.js-проекта и удерживает в синхроне одно и то же намерение по runtime и package manager между метаданными пакета, локальными version-файлами, контейнерными образами и настройкой CI.
Что проверяет
Источники версии Node.js:
package.json#engines.nodepackage.json#devEngines.runtimepackage.json#volta.node.nvmrc.node-versiondevDependencies["@types/node"]Dockerfile*docker-compose*.ymlиdocker-compose*.yaml.github/workflows/*.ymlи.github/workflows/*.yamlсactions/setup-node
Источники package manager:
package.json#devEngines.packageManagerpackage.json#packageManagerpackage.json#volta.<npm|pnpm|yarn|bun>
С флагом --monorepo инструмент также проходит по workspace package.json и проверяет их engines.node, devEngines, volta и @types/node, если эти поля присутствуют.
Команды
npx stackpin check
npx stackpin fix --source devEngines
npx stackpin doctor --monorepo
npx stackpin check --format jsoncheckпоказывает drift, конфликты и отсутствующие части контракта.fixпереписывает вторичные файлы так, чтобы они совпадали с выбранным source of truth.doctorобъясняет, что именно не так и почему это важно.
Выбор источника
Используй --source, чтобы явно указать source of truth.
Поддерживаемые селекторы:
devEnginespackage.json#devEngines.runtimepackage.json#devEngines.packageManagerpackage.json#engines.nodepackage.json#packageManagerpackage.json#volta.node.nvmrc.node-version@types/node
Если --source не указан, stackpin выбирает корневой источник по приоритету:
package.json#devEngines.runtime.nvmrc.node-versionpackage.json#volta.nodepackage.json#engines.node
Для package manager приоритет такой:
package.json#devEngines.packageManagerpackage.json#packageManagerpackage.json#volta.<manager>
Правила fix
fix намеренно сделан консервативным.
- Он создает или обновляет корневые
engines.node,devEngines,.nvmrcи.node-version, когда может вывести конкретное значение. - Он обновляет существующие Docker-, docker-compose- и GitHub Actions-файлы на месте.
- В монорепах он обновляет workspace
engines.node, а также workspacedevEngines.packageManager, если это поле уже существует. - Он обновляет
@types/nodeтолько в том случае, если зависимость уже есть. - Он пропускает exact-pin цели, такие как
volta.nodeилиpackage.json#packageManager, когда выбранный источник слишком неоднозначен, и помечает это какskipped, а не угадывает.
Вывод
Текстовый вывод предназначен для локального использования.
--format json возвращает машинно-читаемый результат для CI. Отчет включает:
- выбранный явно или выведенный автоматически source of truth для каждого домена
- каждую проблему с
status,selector,actualиexpected - заметки в случаях, когда явно был выбран только один домен
