-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcli.mjs
executable file
·131 lines (110 loc) · 3.42 KB
/
cli.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env node
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',
default: `${process.cwd()}/output/.cursor`,
},
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() ?? '')
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);
}