const expectedNodeMajor = 24 const expectedPnpmVersion = '10.33.0' const actualNodeVersion = process.versions.node const actualNodeMajor = Number.parseInt( actualNodeVersion.split('.')[0] ?? '', 10, ) const packageManager = process.env.npm_config_user_agent ?? '' const requirePackageManager = process.argv.includes('--require-package-manager') const pnpmMatch = /(?:^|\s)pnpm\/([^\s]+)/u.exec(packageManager) const failures = [] if (actualNodeMajor !== expectedNodeMajor) { failures.push( `Node.js ${expectedNodeMajor}.x is required; current runtime is ${actualNodeVersion}.`, ) } if (requirePackageManager && !pnpmMatch) { failures.push( `pnpm ${expectedPnpmVersion} is required; no pnpm user agent was detected.`, ) } else if ( pnpmMatch?.[1] !== undefined && pnpmMatch[1] !== expectedPnpmVersion ) { failures.push( `pnpm ${expectedPnpmVersion} is required; current package manager is pnpm ${pnpmMatch[1]}.`, ) } if (failures.length > 0) { console.error('DevRunbook runtime preflight failed:') for (const failure of failures) console.error(`- ${failure}`) console.error( 'Use the versions declared in .nvmrc, .node-version and package.json before installing or verifying.', ) process.exit(1) } console.log( `DevRunbook runtime preflight passed: Node.js ${actualNodeVersion}${pnpmMatch ? `, pnpm ${pnpmMatch[1]}` : ''}.`, )