- Introduced coding standards for TypeScript and React in SKILL.md. - Added continuous learning skill with configuration and evaluation scripts. - Created detail layout guidelines for read-only pages. - Established form layout rules for data-entry forms. - Documented project guidelines for the frontend monorepo. - Implemented security review checklist for frontend/Electron applications. - Developed a verification loop skill for comprehensive session checks. This commit enhances the skill set available for developers, ensuring adherence to best practices and improving code quality.
207 lines
5.9 KiB
JavaScript
207 lines
5.9 KiB
JavaScript
#!/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 Cursor
|
|
|
|
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 ~/.cursor/package-manager.json)
|
|
--project <pm> Set project preference (saves to .cursor/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.CURSOR_PACKAGE_MANAGER || 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: ~/.cursor/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: .cursor/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);
|
|
}
|