mirror of
https://github.com/sweetwisdom/everything-claude-code-zh.git
synced 2026-03-21 22:10:09 +00:00
feat: cross-platform support with Node.js scripts
- Rewrite all bash hooks to Node.js for Windows/macOS/Linux compatibility - Add package manager auto-detection (npm, pnpm, yarn, bun) - Add scripts/lib/ with cross-platform utilities - Add /setup-pm command for package manager configuration - Add comprehensive test suite (62 tests) Co-authored-by: zerx-lab
This commit is contained in:
206
scripts/setup-package-manager.js
Normal file
206
scripts/setup-package-manager.js
Normal file
@@ -0,0 +1,206 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Package Manager Setup Script
|
||||
*
|
||||
* Interactive script to configure preferred package manager.
|
||||
* Can be run directly or via the /setup-pm command.
|
||||
*
|
||||
* Usage:
|
||||
* node scripts/setup-package-manager.js [pm-name]
|
||||
* node scripts/setup-package-manager.js --detect
|
||||
* node scripts/setup-package-manager.js --global pnpm
|
||||
* node scripts/setup-package-manager.js --project bun
|
||||
*/
|
||||
|
||||
const {
|
||||
PACKAGE_MANAGERS,
|
||||
getPackageManager,
|
||||
setPreferredPackageManager,
|
||||
setProjectPackageManager,
|
||||
getAvailablePackageManagers,
|
||||
detectFromLockFile,
|
||||
detectFromPackageJson,
|
||||
getSelectionPrompt
|
||||
} = require('./lib/package-manager');
|
||||
const { log } = require('./lib/utils');
|
||||
|
||||
function showHelp() {
|
||||
console.log(`
|
||||
Package Manager Setup for Claude Code
|
||||
|
||||
Usage:
|
||||
node scripts/setup-package-manager.js [options] [package-manager]
|
||||
|
||||
Options:
|
||||
--detect Detect and show current package manager
|
||||
--global <pm> Set global preference (saves to ~/.claude/package-manager.json)
|
||||
--project <pm> Set project preference (saves to .claude/package-manager.json)
|
||||
--list List available package managers
|
||||
--help Show this help message
|
||||
|
||||
Package Managers:
|
||||
npm Node Package Manager (default with Node.js)
|
||||
pnpm Fast, disk space efficient package manager
|
||||
yarn Classic Yarn package manager
|
||||
bun All-in-one JavaScript runtime & toolkit
|
||||
|
||||
Examples:
|
||||
# Detect current package manager
|
||||
node scripts/setup-package-manager.js --detect
|
||||
|
||||
# Set pnpm as global preference
|
||||
node scripts/setup-package-manager.js --global pnpm
|
||||
|
||||
# Set bun for current project
|
||||
node scripts/setup-package-manager.js --project bun
|
||||
|
||||
# List available package managers
|
||||
node scripts/setup-package-manager.js --list
|
||||
`);
|
||||
}
|
||||
|
||||
function detectAndShow() {
|
||||
const pm = getPackageManager();
|
||||
const available = getAvailablePackageManagers();
|
||||
const fromLock = detectFromLockFile();
|
||||
const fromPkg = detectFromPackageJson();
|
||||
|
||||
console.log('\n=== Package Manager Detection ===\n');
|
||||
|
||||
console.log('Current selection:');
|
||||
console.log(` Package Manager: ${pm.name}`);
|
||||
console.log(` Source: ${pm.source}`);
|
||||
console.log('');
|
||||
|
||||
console.log('Detection results:');
|
||||
console.log(` From package.json: ${fromPkg || 'not specified'}`);
|
||||
console.log(` From lock file: ${fromLock || 'not found'}`);
|
||||
console.log(` Environment var: ${process.env.CLAUDE_PACKAGE_MANAGER || 'not set'}`);
|
||||
console.log('');
|
||||
|
||||
console.log('Available package managers:');
|
||||
for (const pmName of Object.keys(PACKAGE_MANAGERS)) {
|
||||
const installed = available.includes(pmName);
|
||||
const indicator = installed ? '✓' : '✗';
|
||||
const current = pmName === pm.name ? ' (current)' : '';
|
||||
console.log(` ${indicator} ${pmName}${current}`);
|
||||
}
|
||||
|
||||
console.log('');
|
||||
console.log('Commands:');
|
||||
console.log(` Install: ${pm.config.installCmd}`);
|
||||
console.log(` Run script: ${pm.config.runCmd} <script>`);
|
||||
console.log(` Execute binary: ${pm.config.execCmd} <binary>`);
|
||||
console.log('');
|
||||
}
|
||||
|
||||
function listAvailable() {
|
||||
const available = getAvailablePackageManagers();
|
||||
const pm = getPackageManager();
|
||||
|
||||
console.log('\nAvailable Package Managers:\n');
|
||||
|
||||
for (const pmName of Object.keys(PACKAGE_MANAGERS)) {
|
||||
const config = PACKAGE_MANAGERS[pmName];
|
||||
const installed = available.includes(pmName);
|
||||
const current = pmName === pm.name ? ' (current)' : '';
|
||||
|
||||
console.log(`${pmName}${current}`);
|
||||
console.log(` Installed: ${installed ? 'Yes' : 'No'}`);
|
||||
console.log(` Lock file: ${config.lockFile}`);
|
||||
console.log(` Install: ${config.installCmd}`);
|
||||
console.log(` Run: ${config.runCmd}`);
|
||||
console.log('');
|
||||
}
|
||||
}
|
||||
|
||||
function setGlobal(pmName) {
|
||||
if (!PACKAGE_MANAGERS[pmName]) {
|
||||
console.error(`Error: Unknown package manager "${pmName}"`);
|
||||
console.error(`Available: ${Object.keys(PACKAGE_MANAGERS).join(', ')}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const available = getAvailablePackageManagers();
|
||||
if (!available.includes(pmName)) {
|
||||
console.warn(`Warning: ${pmName} is not installed on your system`);
|
||||
}
|
||||
|
||||
try {
|
||||
setPreferredPackageManager(pmName);
|
||||
console.log(`\n✓ Global preference set to: ${pmName}`);
|
||||
console.log(' Saved to: ~/.claude/package-manager.json');
|
||||
console.log('');
|
||||
} catch (err) {
|
||||
console.error(`Error: ${err.message}`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
function setProject(pmName) {
|
||||
if (!PACKAGE_MANAGERS[pmName]) {
|
||||
console.error(`Error: Unknown package manager "${pmName}"`);
|
||||
console.error(`Available: ${Object.keys(PACKAGE_MANAGERS).join(', ')}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
setProjectPackageManager(pmName);
|
||||
console.log(`\n✓ Project preference set to: ${pmName}`);
|
||||
console.log(' Saved to: .claude/package-manager.json');
|
||||
console.log('');
|
||||
} catch (err) {
|
||||
console.error(`Error: ${err.message}`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Main
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
||||
showHelp();
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
if (args.includes('--detect')) {
|
||||
detectAndShow();
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
if (args.includes('--list')) {
|
||||
listAvailable();
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const globalIdx = args.indexOf('--global');
|
||||
if (globalIdx !== -1) {
|
||||
const pmName = args[globalIdx + 1];
|
||||
if (!pmName) {
|
||||
console.error('Error: --global requires a package manager name');
|
||||
process.exit(1);
|
||||
}
|
||||
setGlobal(pmName);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const projectIdx = args.indexOf('--project');
|
||||
if (projectIdx !== -1) {
|
||||
const pmName = args[projectIdx + 1];
|
||||
if (!pmName) {
|
||||
console.error('Error: --project requires a package manager name');
|
||||
process.exit(1);
|
||||
}
|
||||
setProject(pmName);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// If just a package manager name is provided, set it globally
|
||||
const pmName = args[0];
|
||||
if (PACKAGE_MANAGERS[pmName]) {
|
||||
setGlobal(pmName);
|
||||
} else {
|
||||
console.error(`Error: Unknown option or package manager "${pmName}"`);
|
||||
showHelp();
|
||||
process.exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user