@usrrname/cursorrules
Version:
A wicked npx-able lib of cursorrules with Otaku AI agents, optional lean workflow
132 lines (110 loc) • 3.19 kB
JavaScript
import * as fs from 'node:fs/promises';
import * as path from 'node:path';
import * as url from 'node:url';
import { parseArgs } from 'node:util';
const baseFolder = '.cursor/';
const packageJson = JSON.parse(
await fs.readFile(
url.fileURLToPath(url.resolve(import.meta.url, 'package.json')),
'utf-8',
)
);
/**
* CLI options @type {import('node:util').ParseArgsConfig}
*/
const config = {
args: process.argv.slice(2),
tokens: true,
options: {
flat: {
type: 'boolean',
short: 'f',
},
help: {
type: 'boolean',
short: 'h',
default: false,
},
output: {
type: 'string',
short: 'o',
},
version: {
type: 'boolean',
short: 'v',
},
},
}
const help = () => {
const repository = packageJson.repository.url.replace('git+', '').replace('.git', '');
const version = packageJson.version;
return console.info(`
╔══════════════════════════════════════╗
║ @usrrname/cursorrules v${version} ║
╚══════════════════════════════════════╝
A standard library of Cursor Rules
...with otaku vibes (✿ᴗ͈ˬᴗ͈)⁾⁾
Usage:
=======================================
npx @usrrname/cursorrules [options]
Options:
-f, --flat: Install without parent directory
-h, --help: Help instructions <----- You are here
-o, --output: Set output directory (Default: ./output)
-v, --version: Show package version
${repository}
`);
}
const version = () => console.log(`${packageJson.name} v${packageJson.version}`);
/**
* @param {string} dirname - output folder relative path
*/
const downloadFiles = async (dirname) => {
if (!dirname) throw new Error('Output directory is required');
console.info('📥 Downloading rules...');
if (dirname.startsWith('=')) dirname = dirname.split('=')[1];
const outputDir = url.fileURLToPath(url.resolve(import.meta.url, dirname.trim()))
try {
// copy whole folder
await fs.cp(
url.fileURLToPath(url.resolve(import.meta.url, baseFolder)),
outputDir,
{ recursive: true },
)
console.log(`✅ Success! .cursorrules saved to ${outputDir}`);
} catch (err) {
console.error(`❌ Error: ${err.message}`);
process.exit(1);
}
}
async function main() {
console.log("🚀 Loading @usrrname/cursorrules ...");
const { values } = parseArgs(config);
const allowedKeys = ['flat', 'output']
for (let key in values) {
if (!allowedKeys.includes(key) && !values[key]) continue;
switch (key) {
case 'version':
await version();
break;
case 'help':
await help();
break;
case 'output':
downloadFiles(values[key]?.toString() ??
`${process.cwd()}/output/.cursor`);
break;
default:
console.log(`~~~~ 📂 Flattening rules ~~~~`);
downloadFiles(path.join(process.cwd(), '.cursor'))
break;
}
}
}
try {
await main();
} catch (err) {
process.stderr.write('❌ Error: ' + err.message + '\n');
process.exit(1);
}