cursor-kit-cli 1.1.1 → 1.2.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/bin/cursor-new-instance +74 -0
- package/bin/cursor-remove-instance +69 -0
- package/dist/cli.cjs +268 -6
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +267 -5
- package/dist/cli.js.map +1 -1
- package/package.json +3 -2
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/cli.ts","../src/utils/branding.ts","../src/commands/init.ts","../src/utils/fs.ts","../src/utils/templates.ts","../src/utils/constants.ts","../src/commands/add.ts","../src/commands/pull.ts","../src/commands/list.ts","../src/commands/remove.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { defineCommand, runMain } from \"citty\";\nimport { createRequire } from \"node:module\";\nimport { printBanner, printVersion } from \"./utils/branding\";\nimport { initCommand } from \"./commands/init\";\nimport { addCommand } from \"./commands/add\";\nimport { pullCommand } from \"./commands/pull\";\nimport { listCommand } from \"./commands/list\";\nimport { removeCommand } from \"./commands/remove\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version: string };\n\nconst main = defineCommand({\n meta: {\n name: \"cursor-kit\",\n version: pkg.version,\n description: \"CLI toolkit to manage Cursor IDE rules and commands\",\n },\n setup() {\n printBanner();\n printVersion(pkg.version);\n },\n subCommands: {\n init: initCommand,\n add: addCommand,\n pull: pullCommand,\n list: listCommand,\n remove: removeCommand,\n },\n});\n\nrunMain(main);\n\n","import figlet from \"figlet\";\nimport gradient from \"gradient-string\";\nimport pc from \"picocolors\";\n\nconst cursorGradient = gradient([\"#00DC82\", \"#36E4DA\", \"#0047E1\"]);\n\nexport function printBanner(): void {\n const banner = figlet.textSync(\"Cursor Kit\", {\n font: \"ANSI Shadow\",\n horizontalLayout: \"fitted\",\n });\n\n console.log(cursorGradient.multiline(banner));\n console.log();\n console.log(\n pc.dim(\" \") +\n pc.bold(pc.cyan(\"✦\")) +\n pc.dim(\" Supercharge your Cursor IDE with rules & commands\")\n );\n console.log();\n}\n\nexport function printSuccess(message: string): void {\n console.log(pc.green(\"✓\") + pc.dim(\" \") + message);\n}\n\nexport function printError(message: string): void {\n console.log(pc.red(\"✗\") + pc.dim(\" \") + message);\n}\n\nexport function printInfo(message: string): void {\n console.log(pc.cyan(\"ℹ\") + pc.dim(\" \") + message);\n}\n\nexport function printWarning(message: string): void {\n console.log(pc.yellow(\"⚠\") + pc.dim(\" \") + message);\n}\n\nexport function printDivider(): void {\n console.log(pc.dim(\"─\".repeat(50)));\n}\n\nexport function printVersion(version: string): void {\n console.log(\n pc.dim(\" \") + cursorGradient(`v${version}`) + pc.dim(\" • Made with ♥\")\n );\n console.log();\n}\n\nexport function highlight(text: string): string {\n return pc.cyan(text);\n}\n\nexport function dim(text: string): string {\n return pc.dim(text);\n}\n\nexport function bold(text: string): string {\n return pc.bold(text);\n}\n\nexport function gradientText(text: string): string {\n return cursorGradient(text);\n}\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"node:path\";\nimport {\n ensureDir,\n getCursorDir,\n getCommandsDir,\n getRulesDir,\n getConflictingFiles,\n writeFile,\n} from \"../utils/fs\";\nimport { highlight, printDivider, printSuccess } from \"../utils/branding\";\nimport {\n fetchTemplateManifest,\n fetchMultipleTemplates,\n getTemplateLabel,\n type TemplateManifest,\n type TemplateType,\n} from \"../utils/templates\";\n\ntype ConflictStrategy = \"overwrite\" | \"merge\" | \"cancel\";\n\ninterface InitResult {\n added: string[];\n skipped: string[];\n}\n\nasync function selectTemplates(\n type: TemplateType,\n availableTemplates: string[]\n): Promise<string[] | symbol> {\n const selectionMode = await p.select({\n message: `How would you like to add ${type}?`,\n options: [\n {\n value: \"all\",\n label: `Add all ${availableTemplates.length} ${type}`,\n hint: \"Install everything\",\n },\n {\n value: \"select\",\n label: \"Select specific items\",\n hint: \"Choose which ones to install\",\n },\n ],\n });\n\n if (p.isCancel(selectionMode)) return selectionMode;\n\n if (selectionMode === \"all\") {\n return availableTemplates;\n }\n\n const selectedTemplates = await p.multiselect({\n message: `Select ${type} to add:`,\n options: availableTemplates.map((template) => ({\n value: template,\n label: getTemplateLabel(template),\n hint: template,\n })),\n required: true,\n });\n\n return selectedTemplates as string[] | symbol;\n}\n\nasync function handleConflicts(\n type: TemplateType,\n conflictingFiles: string[]\n): Promise<ConflictStrategy | symbol> {\n console.log();\n console.log(\n pc.yellow(`⚠ ${conflictingFiles.length} existing ${type} found:`)\n );\n for (const file of conflictingFiles) {\n console.log(pc.dim(` └─ ${file}`));\n }\n console.log();\n\n const strategy = await p.select({\n message: \"How would you like to handle conflicts?\",\n options: [\n {\n value: \"overwrite\" as ConflictStrategy,\n label: \"Overwrite existing files\",\n hint: \"Replace all conflicting files\",\n },\n {\n value: \"merge\" as ConflictStrategy,\n label: \"Merge (keep existing, add new only)\",\n hint: \"Skip files that already exist\",\n },\n {\n value: \"cancel\" as ConflictStrategy,\n label: \"Cancel\",\n hint: \"Abort the operation\",\n },\n ],\n });\n\n return strategy as ConflictStrategy | symbol;\n}\n\nasync function installTemplates(\n type: TemplateType,\n targetDir: string,\n selectedTemplates: string[],\n conflictStrategy: ConflictStrategy\n): Promise<InitResult> {\n const result: InitResult = { added: [], skipped: [] };\n const conflictingFiles = getConflictingFiles(targetDir, selectedTemplates);\n\n let templatesToInstall: string[];\n\n if (conflictStrategy === \"merge\") {\n templatesToInstall = selectedTemplates.filter(\n (t) => !conflictingFiles.includes(t)\n );\n result.skipped = conflictingFiles.filter((f) =>\n selectedTemplates.includes(f)\n );\n } else {\n templatesToInstall = selectedTemplates;\n }\n\n if (templatesToInstall.length === 0) {\n return result;\n }\n\n const templates = await fetchMultipleTemplates(type, templatesToInstall);\n\n ensureDir(targetDir);\n\n for (const [filename, content] of templates) {\n const filePath = join(targetDir, filename);\n writeFile(filePath, content);\n result.added.push(filename);\n }\n\n return result;\n}\n\nexport const initCommand = defineCommand({\n meta: {\n name: \"init\",\n description:\n \"Initialize .cursor/commands and .cursor/rules in your project\",\n },\n args: {\n force: {\n type: \"boolean\",\n alias: \"f\",\n description: \"Overwrite existing files without prompting\",\n default: false,\n },\n commands: {\n type: \"boolean\",\n alias: \"c\",\n description: \"Only initialize commands\",\n default: false,\n },\n rules: {\n type: \"boolean\",\n alias: \"r\",\n description: \"Only initialize rules\",\n default: false,\n },\n all: {\n type: \"boolean\",\n alias: \"a\",\n description: \"Install all templates without selection prompts\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const cursorDir = getCursorDir(cwd);\n const commandsDir = getCommandsDir(cwd);\n const rulesDir = getRulesDir(cwd);\n\n const initBoth = !args.commands && !args.rules;\n const shouldInitCommands = initBoth || args.commands;\n const shouldInitRules = initBoth || args.rules;\n\n p.intro(pc.bgCyan(pc.black(\" cursor-kit init \")));\n\n const s = p.spinner();\n\n let manifest: TemplateManifest;\n\n try {\n s.start(\"Fetching template manifest...\");\n manifest = await fetchTemplateManifest();\n s.stop(\"Template manifest loaded\");\n } catch (error) {\n s.stop(\"Failed to fetch manifest\");\n p.cancel(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n\n const results: {\n commands?: InitResult;\n rules?: InitResult;\n } = {};\n\n try {\n ensureDir(cursorDir);\n\n if (shouldInitCommands) {\n let selectedCommands: string[];\n\n if (args.all) {\n selectedCommands = manifest.commands;\n } else {\n const selection = await selectTemplates(\"commands\", manifest.commands);\n if (p.isCancel(selection)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n selectedCommands = selection;\n }\n\n const conflictingCommands = getConflictingFiles(\n commandsDir,\n selectedCommands\n );\n let commandStrategy: ConflictStrategy = \"overwrite\";\n\n if (conflictingCommands.length > 0 && !args.force) {\n const strategy = await handleConflicts(\"commands\", conflictingCommands);\n if (p.isCancel(strategy) || strategy === \"cancel\") {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n commandStrategy = strategy;\n }\n\n s.start(\"Installing commands...\");\n results.commands = await installTemplates(\n \"commands\",\n commandsDir,\n selectedCommands,\n commandStrategy\n );\n s.stop(\"Commands installed\");\n }\n\n if (shouldInitRules) {\n let selectedRules: string[];\n\n if (args.all) {\n selectedRules = manifest.rules;\n } else {\n const selection = await selectTemplates(\"rules\", manifest.rules);\n if (p.isCancel(selection)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n selectedRules = selection;\n }\n\n const conflictingRules = getConflictingFiles(rulesDir, selectedRules);\n let ruleStrategy: ConflictStrategy = \"overwrite\";\n\n if (conflictingRules.length > 0 && !args.force) {\n const strategy = await handleConflicts(\"rules\", conflictingRules);\n if (p.isCancel(strategy) || strategy === \"cancel\") {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n ruleStrategy = strategy;\n }\n\n s.start(\"Installing rules...\");\n results.rules = await installTemplates(\n \"rules\",\n rulesDir,\n selectedRules,\n ruleStrategy\n );\n s.stop(\"Rules installed\");\n }\n\n printDivider();\n console.log();\n\n if (results.commands) {\n const { added, skipped } = results.commands;\n if (added.length > 0 || skipped.length > 0) {\n printSuccess(\n `Commands: ${highlight(added.length.toString())} added${skipped.length > 0 ? `, ${pc.yellow(skipped.length.toString())} skipped` : \"\"}`\n );\n for (const f of added) {\n console.log(pc.dim(` └─ ${pc.green(\"+\")} ${f}`));\n }\n for (const f of skipped) {\n console.log(pc.dim(` └─ ${pc.yellow(\"○\")} ${f} (kept existing)`));\n }\n }\n }\n\n if (results.rules) {\n const { added, skipped } = results.rules;\n if (added.length > 0 || skipped.length > 0) {\n printSuccess(\n `Rules: ${highlight(added.length.toString())} added${skipped.length > 0 ? `, ${pc.yellow(skipped.length.toString())} skipped` : \"\"}`\n );\n for (const f of added) {\n console.log(pc.dim(` └─ ${pc.green(\"+\")} ${f}`));\n }\n for (const f of skipped) {\n console.log(pc.dim(` └─ ${pc.yellow(\"○\")} ${f} (kept existing)`));\n }\n }\n }\n\n const totalAdded =\n (results.commands?.added.length ?? 0) +\n (results.rules?.added.length ?? 0);\n const totalSkipped =\n (results.commands?.skipped.length ?? 0) +\n (results.rules?.skipped.length ?? 0);\n\n if (totalAdded === 0 && totalSkipped > 0) {\n console.log();\n p.outro(pc.yellow(\"No new templates added (all selected files already exist)\"));\n } else {\n console.log();\n p.outro(pc.green(\"✨ Cursor Kit initialized successfully!\"));\n }\n } catch (error) {\n s.stop(\"Failed\");\n p.cancel(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n },\n});\n","import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport function ensureDir(path: string): void {\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n}\n\nexport function fileExists(path: string): boolean {\n return existsSync(path);\n}\n\nexport function dirExists(path: string): boolean {\n return existsSync(path) && statSync(path).isDirectory();\n}\n\nexport function readFile(path: string): string {\n return readFileSync(path, \"utf-8\");\n}\n\nexport function writeFile(path: string, content: string): void {\n ensureDir(dirname(path));\n writeFileSync(path, content, \"utf-8\");\n}\n\nexport function removeFile(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { recursive: true });\n }\n}\n\nexport function listFiles(dir: string, extension?: string): string[] {\n if (!dirExists(dir)) return [];\n \n const files = readdirSync(dir);\n if (extension) {\n return files.filter((f) => f.endsWith(extension));\n }\n return files;\n}\n\nexport function getCursorDir(cwd: string = process.cwd()): string {\n return join(cwd, \".cursor\");\n}\n\nexport function getCommandsDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"commands\");\n}\n\nexport function getRulesDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"rules\");\n}\n\nexport function resolveFromCwd(...paths: string[]): string {\n return resolve(process.cwd(), ...paths);\n}\n\nexport function getPackageJson(cwd: string = process.cwd()): Record<string, unknown> | null {\n const pkgPath = join(cwd, \"package.json\");\n if (!fileExists(pkgPath)) return null;\n \n try {\n return JSON.parse(readFile(pkgPath));\n } catch {\n return null;\n }\n}\n\nexport function getConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return [];\n return files.filter((file) => fileExists(join(dir, file)));\n}\n\nexport function getNonConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return files;\n return files.filter((file) => !fileExists(join(dir, file)));\n}\n\n","import { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { REPO_RAW_URL, TEMPLATE_PATHS } from \"./constants\";\nimport { fileExists, readFile, dirExists, listFiles } from \"./fs\";\n\nexport interface TemplateManifest {\n commands: string[];\n rules: string[];\n}\n\nexport type TemplateType = \"commands\" | \"rules\";\n\nexport interface TemplateItem {\n name: string;\n type: TemplateType;\n}\n\nfunction getLocalTemplatesDir(): string {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n // From dist/ go up one level to package root, then into templates/\n return join(currentDir, \"..\", \"templates\");\n}\n\nfunction getLocalManifest(): TemplateManifest | null {\n const templatesDir = getLocalTemplatesDir();\n const manifestPath = join(templatesDir, \"manifest.json\");\n\n if (fileExists(manifestPath)) {\n try {\n return JSON.parse(readFile(manifestPath)) as TemplateManifest;\n } catch {\n return null;\n }\n }\n\n const commandsDir = join(templatesDir, \"commands\");\n const rulesDir = join(templatesDir, \"rules\");\n\n if (!dirExists(commandsDir) && !dirExists(rulesDir)) {\n return null;\n }\n\n return {\n commands: dirExists(commandsDir) ? listFiles(commandsDir, \".md\") : [],\n rules: dirExists(rulesDir) ? listFiles(rulesDir, \".mdc\") : [],\n };\n}\n\nfunction getLocalTemplateContent(type: TemplateType, filename: string): string | null {\n const templatesDir = getLocalTemplatesDir();\n const filePath = join(templatesDir, type, filename);\n\n if (fileExists(filePath)) {\n return readFile(filePath);\n }\n\n return null;\n}\n\nexport async function fetchTemplateManifest(): Promise<TemplateManifest> {\n const localManifest = getLocalManifest();\n if (localManifest) {\n return localManifest;\n }\n\n const url = `${REPO_RAW_URL}/templates/manifest.json`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch template manifest: ${response.statusText}`);\n }\n\n return response.json() as Promise<TemplateManifest>;\n}\n\nexport async function fetchTemplateContent(\n type: TemplateType,\n filename: string\n): Promise<string> {\n const localContent = getLocalTemplateContent(type, filename);\n if (localContent !== null) {\n return localContent;\n }\n\n const templatePath = TEMPLATE_PATHS[type];\n const url = `${REPO_RAW_URL}/${templatePath}/${filename}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch template ${filename}: ${response.statusText}`);\n }\n\n return response.text();\n}\n\nexport async function fetchMultipleTemplates(\n type: TemplateType,\n filenames: string[]\n): Promise<Map<string, string>> {\n const results = new Map<string, string>();\n\n const fetchPromises = filenames.map(async (filename) => {\n const content = await fetchTemplateContent(type, filename);\n return { filename, content };\n });\n\n const settled = await Promise.allSettled(fetchPromises);\n\n for (const result of settled) {\n if (result.status === \"fulfilled\") {\n results.set(result.value.filename, result.value.content);\n }\n }\n\n return results;\n}\n\nexport function getTemplateLabel(filename: string): string {\n const nameWithoutExt = filename.replace(/\\.(md|mdc)$/, \"\");\n return nameWithoutExt\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n","export const REPO_URL = \"github:duongductrong/cursor-kit\";\nexport const REPO_REF = \"master\";\nexport const REPO_RAW_URL = \"https://raw.githubusercontent.com/duongductrong/cursor-kit/master\";\n\nexport const CURSOR_DIR = \".cursor\";\nexport const COMMANDS_DIR = \"commands\";\nexport const RULES_DIR = \"rules\";\n\nexport const COMMAND_EXTENSION = \".md\";\nexport const RULE_EXTENSION = \".mdc\";\n\nexport const CONFIG_FILE = \".cursorkit\";\n\nexport const TEMPLATE_PATHS = {\n commands: \"templates/commands\",\n rules: \"templates/rules\",\n} as const;\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n ensureDir,\n getCommandsDir,\n getRulesDir,\n writeFile,\n fileExists,\n} from \"../utils/fs\";\nimport { highlight } from \"../utils/branding\";\nimport { join } from \"node:path\";\n\ntype ItemType = \"command\" | \"rule\";\n\nconst COMMAND_TEMPLATE = `You are a helpful assistant. Describe what this command does.\n\n## Instructions\n- Step 1: ...\n- Step 2: ...\n\n## Rules\n- Be concise\n- Focus on the task\n\nSTART: Wait for user input.\n`;\n\nconst RULE_TEMPLATE = `---\ndescription: Describe when this rule should apply\nglobs: \nalwaysApply: false\n---\n\n# Rule Title\n\nDescribe the rule behavior here.\n\n## Guidelines\n- Guideline 1\n- Guideline 2\n`;\n\nfunction generateSlug(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .trim();\n}\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a new command or rule\",\n },\n args: {\n type: {\n type: \"string\",\n alias: \"t\",\n description: \"Type: 'command' or 'rule'\",\n },\n name: {\n type: \"string\",\n alias: \"n\",\n description: \"Name of the command or rule\",\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(\" cursor-kit add \")));\n\n let itemType: ItemType;\n let itemName: string;\n\n if (args.type && [\"command\", \"rule\"].includes(args.type)) {\n itemType = args.type as ItemType;\n } else {\n const typeResult = await p.select({\n message: \"What do you want to add?\",\n options: [\n {\n value: \"command\",\n label: \"Command\",\n hint: \"A reusable prompt template\",\n },\n {\n value: \"rule\",\n label: \"Rule\",\n hint: \"Project-specific AI behavior rules\",\n },\n ],\n });\n\n if (p.isCancel(typeResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemType = typeResult as ItemType;\n }\n\n if (args.name) {\n itemName = args.name;\n } else {\n const nameResult = await p.text({\n message: `Enter ${itemType} name:`,\n placeholder: itemType === \"command\" ? \"my-command\" : \"my-rule\",\n validate: (value) => {\n if (!value.trim()) return \"Name is required\";\n if (value.length < 2) return \"Name must be at least 2 characters\";\n return undefined;\n },\n });\n\n if (p.isCancel(nameResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemName = nameResult;\n }\n\n const slug = generateSlug(itemName);\n const isCommand = itemType === \"command\";\n const targetDir = isCommand ? getCommandsDir() : getRulesDir();\n const extension = isCommand ? \".md\" : \".mdc\";\n const filePath = join(targetDir, `${slug}${extension}`);\n\n if (fileExists(filePath)) {\n const shouldOverwrite = await p.confirm({\n message: `${highlight(slug + extension)} already exists. Overwrite?`,\n initialValue: false,\n });\n\n if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n const s = p.spinner();\n s.start(`Creating ${itemType}...`);\n\n try {\n ensureDir(targetDir);\n const template = isCommand ? COMMAND_TEMPLATE : RULE_TEMPLATE;\n writeFile(filePath, template);\n\n s.stop(`${itemType.charAt(0).toUpperCase() + itemType.slice(1)} created`);\n\n console.log();\n console.log(pc.dim(\" File: \") + highlight(filePath));\n console.log();\n\n p.outro(\n pc.green(`✨ ${itemType.charAt(0).toUpperCase() + itemType.slice(1)} created! Edit the file to customize it.`)\n );\n } catch (error) {\n s.stop(\"Failed\");\n p.cancel(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n },\n});\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { downloadTemplate } from \"giget\";\nimport {\n ensureDir,\n getCommandsDir,\n getRulesDir,\n listFiles,\n getCursorDir,\n} from \"../utils/fs\";\nimport { REPO_URL, REPO_REF } from \"../utils/constants\";\nimport { highlight, printDivider, printSuccess, printInfo } from \"../utils/branding\";\n\nexport const pullCommand = defineCommand({\n meta: {\n name: \"pull\",\n description: \"Pull latest updates from cursor-kit repository\",\n },\n args: {\n commands: {\n type: \"boolean\",\n alias: \"c\",\n description: \"Only pull commands\",\n default: false,\n },\n rules: {\n type: \"boolean\",\n alias: \"r\",\n description: \"Only pull rules\",\n default: false,\n },\n force: {\n type: \"boolean\",\n alias: \"f\",\n description: \"Force overwrite without confirmation\",\n default: false,\n },\n },\n async run({ args }) {\n const pullBoth = !args.commands && !args.rules;\n const shouldPullCommands = pullBoth || args.commands;\n const shouldPullRules = pullBoth || args.rules;\n\n p.intro(pc.bgCyan(pc.black(\" cursor-kit pull \")));\n\n const commandsDir = getCommandsDir();\n const rulesDir = getRulesDir();\n\n const existingCommands = listFiles(commandsDir, \".md\");\n const existingRules = listFiles(rulesDir, \".mdc\");\n const hasExisting = existingCommands.length > 0 || existingRules.length > 0;\n\n if (hasExisting && !args.force) {\n printInfo(\"Current status:\");\n if (existingCommands.length > 0) {\n console.log(pc.dim(` Commands: ${existingCommands.length} files`));\n }\n if (existingRules.length > 0) {\n console.log(pc.dim(` Rules: ${existingRules.length} files`));\n }\n console.log();\n\n const shouldContinue = await p.confirm({\n message: \"This will merge with existing files. Continue?\",\n initialValue: true,\n });\n\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n const s = p.spinner();\n\n try {\n ensureDir(getCursorDir());\n\n if (shouldPullCommands) {\n s.start(\"Pulling commands...\");\n await downloadTemplate(`${REPO_URL}/templates/commands#${REPO_REF}`, {\n dir: commandsDir,\n force: true,\n });\n s.stop(\"Commands updated\");\n }\n\n if (shouldPullRules) {\n s.start(\"Pulling rules...\");\n await downloadTemplate(`${REPO_URL}/templates/rules#${REPO_REF}`, {\n dir: rulesDir,\n force: true,\n });\n s.stop(\"Rules updated\");\n }\n\n printDivider();\n console.log();\n\n const newCommands = listFiles(commandsDir, \".md\");\n const newRules = listFiles(rulesDir, \".mdc\");\n\n if (shouldPullCommands) {\n const added = newCommands.length - existingCommands.length;\n printSuccess(\n `Commands: ${highlight(newCommands.length.toString())} total` +\n (added > 0 ? pc.green(` (+${added} new)`) : \"\")\n );\n }\n\n if (shouldPullRules) {\n const added = newRules.length - existingRules.length;\n printSuccess(\n `Rules: ${highlight(newRules.length.toString())} total` +\n (added > 0 ? pc.green(` (+${added} new)`) : \"\")\n );\n }\n\n console.log();\n p.outro(pc.green(\"✨ Successfully pulled latest updates!\"));\n } catch (error) {\n s.stop(\"Failed\");\n p.cancel(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n },\n});\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n getCommandsDir,\n getRulesDir,\n listFiles,\n readFile,\n fileExists,\n} from \"../utils/fs\";\nimport { highlight, printDivider } from \"../utils/branding\";\nimport { join } from \"node:path\";\n\ninterface ItemInfo {\n name: string;\n path: string;\n description?: string;\n}\n\nfunction extractDescription(content: string, isCommand: boolean): string | undefined {\n if (isCommand) {\n const firstLine = content.trim().split(\"\\n\")[0];\n if (firstLine && !firstLine.startsWith(\"#\") && !firstLine.startsWith(\"---\")) {\n return firstLine.slice(0, 60) + (firstLine.length > 60 ? \"...\" : \"\");\n }\n } else {\n const match = content.match(/description:\\s*(.+)/);\n if (match) {\n return match[1].trim().slice(0, 60) + (match[1].length > 60 ? \"...\" : \"\");\n }\n }\n return undefined;\n}\n\nfunction getItems(dir: string, extension: string, isCommand: boolean): ItemInfo[] {\n const files = listFiles(dir, extension);\n return files.map((file) => {\n const filePath = join(dir, file);\n const content = fileExists(filePath) ? readFile(filePath) : \"\";\n return {\n name: file.replace(extension, \"\"),\n path: filePath,\n description: extractDescription(content, isCommand),\n };\n });\n}\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List all commands and rules\",\n },\n args: {\n commands: {\n type: \"boolean\",\n alias: \"c\",\n description: \"Only list commands\",\n default: false,\n },\n rules: {\n type: \"boolean\",\n alias: \"r\",\n description: \"Only list rules\",\n default: false,\n },\n verbose: {\n type: \"boolean\",\n alias: \"v\",\n description: \"Show full file paths\",\n default: false,\n },\n },\n async run({ args }) {\n const listBoth = !args.commands && !args.rules;\n const shouldListCommands = listBoth || args.commands;\n const shouldListRules = listBoth || args.rules;\n\n p.intro(pc.bgCyan(pc.black(\" cursor-kit list \")));\n\n const commandsDir = getCommandsDir();\n const rulesDir = getRulesDir();\n\n const commands = shouldListCommands ? getItems(commandsDir, \".md\", true) : [];\n const rules = shouldListRules ? getItems(rulesDir, \".mdc\", false) : [];\n\n if (commands.length === 0 && rules.length === 0) {\n console.log();\n console.log(pc.yellow(\" No commands or rules found.\"));\n console.log(pc.dim(\" Run \") + highlight(\"cursor-kit init\") + pc.dim(\" to get started.\"));\n console.log();\n p.outro(pc.dim(\"Nothing to show\"));\n return;\n }\n\n printDivider();\n\n if (shouldListCommands && commands.length > 0) {\n console.log();\n console.log(pc.bold(pc.cyan(\" 📜 Commands\")) + pc.dim(` (${commands.length})`));\n console.log();\n\n commands.forEach((cmd) => {\n console.log(` ${pc.green(\"●\")} ${highlight(cmd.name)}`);\n if (cmd.description) {\n console.log(pc.dim(` ${cmd.description}`));\n }\n if (args.verbose) {\n console.log(pc.dim(` ${cmd.path}`));\n }\n });\n }\n\n if (shouldListRules && rules.length > 0) {\n console.log();\n console.log(pc.bold(pc.cyan(\" 📋 Rules\")) + pc.dim(` (${rules.length})`));\n console.log();\n\n rules.forEach((rule) => {\n console.log(` ${pc.green(\"●\")} ${highlight(rule.name)}`);\n if (rule.description) {\n console.log(pc.dim(` ${rule.description}`));\n }\n if (args.verbose) {\n console.log(pc.dim(` ${rule.path}`));\n }\n });\n }\n\n console.log();\n printDivider();\n\n const total = commands.length + rules.length;\n p.outro(pc.dim(`Total: ${total} item${total !== 1 ? \"s\" : \"\"}`));\n },\n});\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n getCommandsDir,\n getRulesDir,\n listFiles,\n removeFile,\n fileExists,\n} from \"../utils/fs\";\nimport { highlight, printSuccess } from \"../utils/branding\";\nimport { join } from \"node:path\";\n\ntype ItemType = \"command\" | \"rule\";\n\ninterface SelectOption {\n value: string;\n label: string;\n hint?: string;\n}\n\nexport const removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: \"Remove a command or rule\",\n },\n args: {\n type: {\n type: \"string\",\n alias: \"t\",\n description: \"Type: 'command' or 'rule'\",\n },\n name: {\n type: \"string\",\n alias: \"n\",\n description: \"Name of the command or rule to remove\",\n },\n force: {\n type: \"boolean\",\n alias: \"f\",\n description: \"Skip confirmation\",\n default: false,\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(\" cursor-kit remove \")));\n\n const commandsDir = getCommandsDir();\n const rulesDir = getRulesDir();\n\n const commands = listFiles(commandsDir, \".md\").map((f) => f.replace(\".md\", \"\"));\n const rules = listFiles(rulesDir, \".mdc\").map((f) => f.replace(\".mdc\", \"\"));\n\n if (commands.length === 0 && rules.length === 0) {\n console.log();\n console.log(pc.yellow(\" No commands or rules to remove.\"));\n console.log();\n p.outro(pc.dim(\"Nothing to do\"));\n return;\n }\n\n let itemType: ItemType;\n let itemName: string;\n\n if (args.type && [\"command\", \"rule\"].includes(args.type)) {\n itemType = args.type as ItemType;\n } else {\n const typeOptions: SelectOption[] = [];\n\n if (commands.length > 0) {\n typeOptions.push({\n value: \"command\",\n label: \"Command\",\n hint: `${commands.length} available`,\n });\n }\n\n if (rules.length > 0) {\n typeOptions.push({\n value: \"rule\",\n label: \"Rule\",\n hint: `${rules.length} available`,\n });\n }\n\n const typeResult = await p.select({\n message: \"What do you want to remove?\",\n options: typeOptions,\n });\n\n if (p.isCancel(typeResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemType = typeResult as ItemType;\n }\n\n const isCommand = itemType === \"command\";\n const items = isCommand ? commands : rules;\n const dir = isCommand ? commandsDir : rulesDir;\n const extension = isCommand ? \".md\" : \".mdc\";\n\n if (items.length === 0) {\n p.cancel(`No ${itemType}s found`);\n process.exit(0);\n }\n\n if (args.name && items.includes(args.name)) {\n itemName = args.name;\n } else {\n const itemOptions: SelectOption[] = items.map((item) => ({\n value: item,\n label: item,\n }));\n\n const nameResult = await p.select({\n message: `Select ${itemType} to remove:`,\n options: itemOptions,\n });\n\n if (p.isCancel(nameResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemName = nameResult as string;\n }\n\n const filePath = join(dir, `${itemName}${extension}`);\n\n if (!fileExists(filePath)) {\n p.cancel(`${itemType} '${itemName}' not found`);\n process.exit(1);\n }\n\n if (!args.force) {\n const shouldDelete = await p.confirm({\n message: `Are you sure you want to delete ${highlight(itemName + extension)}?`,\n initialValue: false,\n });\n\n if (p.isCancel(shouldDelete) || !shouldDelete) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n try {\n removeFile(filePath);\n console.log();\n printSuccess(`Removed ${highlight(itemName + extension)}`);\n console.log();\n p.outro(pc.green(\"✨ Done!\"));\n } catch (error) {\n p.cancel(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n },\n});\n\n"],"mappings":"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","names":["import_citty","gradient","figlet","pc","pc","pc","text","import_picocolors","import_node_path","import_node_path","pc","import_citty","p","import_picocolors","import_node_path","pc","import_citty","p","import_picocolors","pc","import_citty","p","import_picocolors","import_node_path","pc","import_citty","p","import_picocolors","import_node_path","pc","require"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/cli.ts","../src/utils/branding.ts","../src/commands/init.ts","../src/utils/fs.ts","../src/utils/templates.ts","../src/utils/constants.ts","../src/commands/add.ts","../src/commands/pull.ts","../src/commands/list.ts","../src/commands/remove.ts","../src/commands/instance.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { defineCommand, runMain } from \"citty\";\nimport { createRequire } from \"node:module\";\nimport { printBanner, printVersion } from \"./utils/branding\";\nimport { initCommand } from \"./commands/init\";\nimport { addCommand } from \"./commands/add\";\nimport { pullCommand } from \"./commands/pull\";\nimport { listCommand } from \"./commands/list\";\nimport { removeCommand } from \"./commands/remove\";\nimport { instanceCommand } from \"./commands/instance\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version: string };\n\nconst main = defineCommand({\n meta: {\n name: \"cursor-kit\",\n version: pkg.version,\n description: \"CLI toolkit to manage Cursor IDE rules and commands\",\n },\n setup() {\n printBanner();\n printVersion(pkg.version);\n },\n subCommands: {\n init: initCommand,\n add: addCommand,\n pull: pullCommand,\n list: listCommand,\n remove: removeCommand,\n instance: instanceCommand,\n },\n});\n\nrunMain(main);\n\n","import figlet from \"figlet\";\nimport gradient from \"gradient-string\";\nimport pc from \"picocolors\";\n\nconst cursorGradient = gradient([\"#00DC82\", \"#36E4DA\", \"#0047E1\"]);\n\nexport function printBanner(): void {\n const banner = figlet.textSync(\"Cursor Kit\", {\n font: \"ANSI Shadow\",\n horizontalLayout: \"fitted\",\n });\n\n console.log(cursorGradient.multiline(banner));\n console.log();\n console.log(\n pc.dim(\" \") +\n pc.bold(pc.cyan(\"✦\")) +\n pc.dim(\" Supercharge your Cursor IDE with rules & commands\")\n );\n console.log();\n}\n\nexport function printSuccess(message: string): void {\n console.log(pc.green(\"✓\") + pc.dim(\" \") + message);\n}\n\nexport function printError(message: string): void {\n console.log(pc.red(\"✗\") + pc.dim(\" \") + message);\n}\n\nexport function printInfo(message: string): void {\n console.log(pc.cyan(\"ℹ\") + pc.dim(\" \") + message);\n}\n\nexport function printWarning(message: string): void {\n console.log(pc.yellow(\"⚠\") + pc.dim(\" \") + message);\n}\n\nexport function printDivider(): void {\n console.log(pc.dim(\"─\".repeat(50)));\n}\n\nexport function printVersion(version: string): void {\n console.log(\n pc.dim(\" \") + cursorGradient(`v${version}`) + pc.dim(\" • Made with ♥\")\n );\n console.log();\n}\n\nexport function highlight(text: string): string {\n return pc.cyan(text);\n}\n\nexport function dim(text: string): string {\n return pc.dim(text);\n}\n\nexport function bold(text: string): string {\n return pc.bold(text);\n}\n\nexport function gradientText(text: string): string {\n return cursorGradient(text);\n}\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"node:path\";\nimport {\n ensureDir,\n getCursorDir,\n getCommandsDir,\n getRulesDir,\n getConflictingFiles,\n writeFile,\n} from \"../utils/fs\";\nimport { highlight, printDivider, printSuccess } from \"../utils/branding\";\nimport {\n fetchTemplateManifest,\n fetchMultipleTemplates,\n getTemplateLabel,\n type TemplateManifest,\n type TemplateType,\n} from \"../utils/templates\";\n\ntype ConflictStrategy = \"overwrite\" | \"merge\" | \"cancel\";\n\ninterface InitResult {\n added: string[];\n skipped: string[];\n}\n\nasync function selectTemplates(\n type: TemplateType,\n availableTemplates: string[]\n): Promise<string[] | symbol> {\n const selectionMode = await p.select({\n message: `How would you like to add ${type}?`,\n options: [\n {\n value: \"all\",\n label: `Add all ${availableTemplates.length} ${type}`,\n hint: \"Install everything\",\n },\n {\n value: \"select\",\n label: \"Select specific items\",\n hint: \"Choose which ones to install\",\n },\n ],\n });\n\n if (p.isCancel(selectionMode)) return selectionMode;\n\n if (selectionMode === \"all\") {\n return availableTemplates;\n }\n\n const selectedTemplates = await p.multiselect({\n message: `Select ${type} to add:`,\n options: availableTemplates.map((template) => ({\n value: template,\n label: getTemplateLabel(template),\n hint: template,\n })),\n required: true,\n });\n\n return selectedTemplates as string[] | symbol;\n}\n\nasync function handleConflicts(\n type: TemplateType,\n conflictingFiles: string[]\n): Promise<ConflictStrategy | symbol> {\n console.log();\n console.log(\n pc.yellow(`⚠ ${conflictingFiles.length} existing ${type} found:`)\n );\n for (const file of conflictingFiles) {\n console.log(pc.dim(` └─ ${file}`));\n }\n console.log();\n\n const strategy = await p.select({\n message: \"How would you like to handle conflicts?\",\n options: [\n {\n value: \"overwrite\" as ConflictStrategy,\n label: \"Overwrite existing files\",\n hint: \"Replace all conflicting files\",\n },\n {\n value: \"merge\" as ConflictStrategy,\n label: \"Merge (keep existing, add new only)\",\n hint: \"Skip files that already exist\",\n },\n {\n value: \"cancel\" as ConflictStrategy,\n label: \"Cancel\",\n hint: \"Abort the operation\",\n },\n ],\n });\n\n return strategy as ConflictStrategy | symbol;\n}\n\nasync function installTemplates(\n type: TemplateType,\n targetDir: string,\n selectedTemplates: string[],\n conflictStrategy: ConflictStrategy\n): Promise<InitResult> {\n const result: InitResult = { added: [], skipped: [] };\n const conflictingFiles = getConflictingFiles(targetDir, selectedTemplates);\n\n let templatesToInstall: string[];\n\n if (conflictStrategy === \"merge\") {\n templatesToInstall = selectedTemplates.filter(\n (t) => !conflictingFiles.includes(t)\n );\n result.skipped = conflictingFiles.filter((f) =>\n selectedTemplates.includes(f)\n );\n } else {\n templatesToInstall = selectedTemplates;\n }\n\n if (templatesToInstall.length === 0) {\n return result;\n }\n\n const templates = await fetchMultipleTemplates(type, templatesToInstall);\n\n ensureDir(targetDir);\n\n for (const [filename, content] of templates) {\n const filePath = join(targetDir, filename);\n writeFile(filePath, content);\n result.added.push(filename);\n }\n\n return result;\n}\n\nexport const initCommand = defineCommand({\n meta: {\n name: \"init\",\n description:\n \"Initialize .cursor/commands and .cursor/rules in your project\",\n },\n args: {\n force: {\n type: \"boolean\",\n alias: \"f\",\n description: \"Overwrite existing files without prompting\",\n default: false,\n },\n commands: {\n type: \"boolean\",\n alias: \"c\",\n description: \"Only initialize commands\",\n default: false,\n },\n rules: {\n type: \"boolean\",\n alias: \"r\",\n description: \"Only initialize rules\",\n default: false,\n },\n all: {\n type: \"boolean\",\n alias: \"a\",\n description: \"Install all templates without selection prompts\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const cursorDir = getCursorDir(cwd);\n const commandsDir = getCommandsDir(cwd);\n const rulesDir = getRulesDir(cwd);\n\n const initBoth = !args.commands && !args.rules;\n const shouldInitCommands = initBoth || args.commands;\n const shouldInitRules = initBoth || args.rules;\n\n p.intro(pc.bgCyan(pc.black(\" cursor-kit init \")));\n\n const s = p.spinner();\n\n let manifest: TemplateManifest;\n\n try {\n s.start(\"Fetching template manifest...\");\n manifest = await fetchTemplateManifest();\n s.stop(\"Template manifest loaded\");\n } catch (error) {\n s.stop(\"Failed to fetch manifest\");\n p.cancel(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n\n const results: {\n commands?: InitResult;\n rules?: InitResult;\n } = {};\n\n try {\n ensureDir(cursorDir);\n\n if (shouldInitCommands) {\n let selectedCommands: string[];\n\n if (args.all) {\n selectedCommands = manifest.commands;\n } else {\n const selection = await selectTemplates(\"commands\", manifest.commands);\n if (p.isCancel(selection)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n selectedCommands = selection;\n }\n\n const conflictingCommands = getConflictingFiles(\n commandsDir,\n selectedCommands\n );\n let commandStrategy: ConflictStrategy = \"overwrite\";\n\n if (conflictingCommands.length > 0 && !args.force) {\n const strategy = await handleConflicts(\"commands\", conflictingCommands);\n if (p.isCancel(strategy) || strategy === \"cancel\") {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n commandStrategy = strategy;\n }\n\n s.start(\"Installing commands...\");\n results.commands = await installTemplates(\n \"commands\",\n commandsDir,\n selectedCommands,\n commandStrategy\n );\n s.stop(\"Commands installed\");\n }\n\n if (shouldInitRules) {\n let selectedRules: string[];\n\n if (args.all) {\n selectedRules = manifest.rules;\n } else {\n const selection = await selectTemplates(\"rules\", manifest.rules);\n if (p.isCancel(selection)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n selectedRules = selection;\n }\n\n const conflictingRules = getConflictingFiles(rulesDir, selectedRules);\n let ruleStrategy: ConflictStrategy = \"overwrite\";\n\n if (conflictingRules.length > 0 && !args.force) {\n const strategy = await handleConflicts(\"rules\", conflictingRules);\n if (p.isCancel(strategy) || strategy === \"cancel\") {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n ruleStrategy = strategy;\n }\n\n s.start(\"Installing rules...\");\n results.rules = await installTemplates(\n \"rules\",\n rulesDir,\n selectedRules,\n ruleStrategy\n );\n s.stop(\"Rules installed\");\n }\n\n printDivider();\n console.log();\n\n if (results.commands) {\n const { added, skipped } = results.commands;\n if (added.length > 0 || skipped.length > 0) {\n printSuccess(\n `Commands: ${highlight(added.length.toString())} added${skipped.length > 0 ? `, ${pc.yellow(skipped.length.toString())} skipped` : \"\"}`\n );\n for (const f of added) {\n console.log(pc.dim(` └─ ${pc.green(\"+\")} ${f}`));\n }\n for (const f of skipped) {\n console.log(pc.dim(` └─ ${pc.yellow(\"○\")} ${f} (kept existing)`));\n }\n }\n }\n\n if (results.rules) {\n const { added, skipped } = results.rules;\n if (added.length > 0 || skipped.length > 0) {\n printSuccess(\n `Rules: ${highlight(added.length.toString())} added${skipped.length > 0 ? `, ${pc.yellow(skipped.length.toString())} skipped` : \"\"}`\n );\n for (const f of added) {\n console.log(pc.dim(` └─ ${pc.green(\"+\")} ${f}`));\n }\n for (const f of skipped) {\n console.log(pc.dim(` └─ ${pc.yellow(\"○\")} ${f} (kept existing)`));\n }\n }\n }\n\n const totalAdded =\n (results.commands?.added.length ?? 0) +\n (results.rules?.added.length ?? 0);\n const totalSkipped =\n (results.commands?.skipped.length ?? 0) +\n (results.rules?.skipped.length ?? 0);\n\n if (totalAdded === 0 && totalSkipped > 0) {\n console.log();\n p.outro(pc.yellow(\"No new templates added (all selected files already exist)\"));\n } else {\n console.log();\n p.outro(pc.green(\"✨ Cursor Kit initialized successfully!\"));\n }\n } catch (error) {\n s.stop(\"Failed\");\n p.cancel(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n process.exit(1);\n }\n },\n});\n","import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport function ensureDir(path: string): void {\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n}\n\nexport function fileExists(path: string): boolean {\n return existsSync(path);\n}\n\nexport function dirExists(path: string): boolean {\n return existsSync(path) && statSync(path).isDirectory();\n}\n\nexport function readFile(path: string): string {\n return readFileSync(path, \"utf-8\");\n}\n\nexport function writeFile(path: string, content: string): void {\n ensureDir(dirname(path));\n writeFileSync(path, content, \"utf-8\");\n}\n\nexport function removeFile(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { recursive: true });\n }\n}\n\nexport function listFiles(dir: string, extension?: string): string[] {\n if (!dirExists(dir)) return [];\n \n const files = readdirSync(dir);\n if (extension) {\n return files.filter((f) => f.endsWith(extension));\n }\n return files;\n}\n\nexport function getCursorDir(cwd: string = process.cwd()): string {\n return join(cwd, \".cursor\");\n}\n\nexport function getCommandsDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"commands\");\n}\n\nexport function getRulesDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"rules\");\n}\n\nexport function resolveFromCwd(...paths: string[]): string {\n return resolve(process.cwd(), ...paths);\n}\n\nexport function getPackageJson(cwd: string = process.cwd()): Record<string, unknown> | null {\n const pkgPath = join(cwd, \"package.json\");\n if (!fileExists(pkgPath)) return null;\n \n try {\n return JSON.parse(readFile(pkgPath));\n } catch {\n return null;\n }\n}\n\nexport function getConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return [];\n return files.filter((file) => fileExists(join(dir, file)));\n}\n\nexport function getNonConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return files;\n return files.filter((file) => !fileExists(join(dir, file)));\n}\n\n","import { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { REPO_RAW_URL, TEMPLATE_PATHS } from \"./constants\";\nimport { fileExists, readFile, dirExists, listFiles } from \"./fs\";\n\nexport interface TemplateManifest {\n commands: string[];\n rules: string[];\n}\n\nexport type TemplateType = \"commands\" | \"rules\";\n\nexport interface TemplateItem {\n name: string;\n type: TemplateType;\n}\n\nfunction getLocalTemplatesDir(): string {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n // From dist/ go up one level to package root, then into templates/\n return join(currentDir, \"..\", \"templates\");\n}\n\nfunction getLocalManifest(): TemplateManifest | null {\n const templatesDir = getLocalTemplatesDir();\n const manifestPath = join(templatesDir, \"manifest.json\");\n\n if (fileExists(manifestPath)) {\n try {\n return JSON.parse(readFile(manifestPath)) as TemplateManifest;\n } catch {\n return null;\n }\n }\n\n const commandsDir = join(templatesDir, \"commands\");\n const rulesDir = join(templatesDir, \"rules\");\n\n if (!dirExists(commandsDir) && !dirExists(rulesDir)) {\n return null;\n }\n\n return {\n commands: dirExists(commandsDir) ? listFiles(commandsDir, \".md\") : [],\n rules: dirExists(rulesDir) ? listFiles(rulesDir, \".mdc\") : [],\n };\n}\n\nfunction getLocalTemplateContent(type: TemplateType, filename: string): string | null {\n const templatesDir = getLocalTemplatesDir();\n const filePath = join(templatesDir, type, filename);\n\n if (fileExists(filePath)) {\n return readFile(filePath);\n }\n\n return null;\n}\n\nexport async function fetchTemplateManifest(): Promise<TemplateManifest> {\n const localManifest = getLocalManifest();\n if (localManifest) {\n return localManifest;\n }\n\n const url = `${REPO_RAW_URL}/templates/manifest.json`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch template manifest: ${response.statusText}`);\n }\n\n return response.json() as Promise<TemplateManifest>;\n}\n\nexport async function fetchTemplateContent(\n type: TemplateType,\n filename: string\n): Promise<string> {\n const localContent = getLocalTemplateContent(type, filename);\n if (localContent !== null) {\n return localContent;\n }\n\n const templatePath = TEMPLATE_PATHS[type];\n const url = `${REPO_RAW_URL}/${templatePath}/${filename}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch template ${filename}: ${response.statusText}`);\n }\n\n return response.text();\n}\n\nexport async function fetchMultipleTemplates(\n type: TemplateType,\n filenames: string[]\n): Promise<Map<string, string>> {\n const results = new Map<string, string>();\n\n const fetchPromises = filenames.map(async (filename) => {\n const content = await fetchTemplateContent(type, filename);\n return { filename, content };\n });\n\n const settled = await Promise.allSettled(fetchPromises);\n\n for (const result of settled) {\n if (result.status === \"fulfilled\") {\n results.set(result.value.filename, result.value.content);\n }\n }\n\n return results;\n}\n\nexport function getTemplateLabel(filename: string): string {\n const nameWithoutExt = filename.replace(/\\.(md|mdc)$/, \"\");\n return nameWithoutExt\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n","export const REPO_URL = \"github:duongductrong/cursor-kit\";\nexport const REPO_REF = \"master\";\nexport const REPO_RAW_URL = \"https://raw.githubusercontent.com/duongductrong/cursor-kit/master\";\n\nexport const CURSOR_DIR = \".cursor\";\nexport const COMMANDS_DIR = \"commands\";\nexport const RULES_DIR = \"rules\";\n\nexport const COMMAND_EXTENSION = \".md\";\nexport const RULE_EXTENSION = \".mdc\";\n\nexport const CONFIG_FILE = \".cursorkit\";\n\nexport const TEMPLATE_PATHS = {\n commands: \"templates/commands\",\n rules: \"templates/rules\",\n} as const;\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n ensureDir,\n getCommandsDir,\n getRulesDir,\n writeFile,\n fileExists,\n} from \"../utils/fs\";\nimport { highlight } from \"../utils/branding\";\nimport { join } from \"node:path\";\n\ntype ItemType = \"command\" | \"rule\";\n\nconst COMMAND_TEMPLATE = `You are a helpful assistant. Describe what this command does.\n\n## Instructions\n- Step 1: ...\n- Step 2: ...\n\n## Rules\n- Be concise\n- Focus on the task\n\nSTART: Wait for user input.\n`;\n\nconst RULE_TEMPLATE = `---\ndescription: Describe when this rule should apply\nglobs: \nalwaysApply: false\n---\n\n# Rule Title\n\nDescribe the rule behavior here.\n\n## Guidelines\n- Guideline 1\n- Guideline 2\n`;\n\nfunction generateSlug(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .trim();\n}\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a new command or rule\",\n },\n args: {\n type: {\n type: \"string\",\n alias: \"t\",\n description: \"Type: 'command' or 'rule'\",\n },\n name: {\n type: \"string\",\n alias: \"n\",\n description: \"Name of the command or rule\",\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(\" cursor-kit add \")));\n\n let itemType: ItemType;\n let itemName: string;\n\n if (args.type && [\"command\", \"rule\"].includes(args.type)) {\n itemType = args.type as ItemType;\n } else {\n const typeResult = await p.select({\n message: \"What do you want to add?\",\n options: [\n {\n value: \"command\",\n label: \"Command\",\n hint: \"A reusable prompt template\",\n },\n {\n value: \"rule\",\n label: \"Rule\",\n hint: \"Project-specific AI behavior rules\",\n },\n ],\n });\n\n if (p.isCancel(typeResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemType = typeResult as ItemType;\n }\n\n if (args.name) {\n itemName = args.name;\n } else {\n const nameResult = await p.text({\n message: `Enter ${itemType} name:`,\n placeholder: itemType === \"command\" ? \"my-command\" : \"my-rule\",\n validate: (value) => {\n if (!value.trim()) return \"Name is required\";\n if (value.length < 2) return \"Name must be at least 2 characters\";\n return undefined;\n },\n });\n\n if (p.isCancel(nameResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemName = nameResult;\n }\n\n const slug = generateSlug(itemName);\n const isCommand = itemType === \"command\";\n const targetDir = isCommand ? getCommandsDir() : getRulesDir();\n const extension = isCommand ? \".md\" : \".mdc\";\n const filePath = join(targetDir, `${slug}${extension}`);\n\n if (fileExists(filePath)) {\n const shouldOverwrite = await p.confirm({\n message: `${highlight(slug + extension)} already exists. Overwrite?`,\n initialValue: false,\n });\n\n if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n const s = p.spinner();\n s.start(`Creating ${itemType}...`);\n\n try {\n ensureDir(targetDir);\n const template = isCommand ? COMMAND_TEMPLATE : RULE_TEMPLATE;\n writeFile(filePath, template);\n\n s.stop(`${itemType.charAt(0).toUpperCase() + itemType.slice(1)} created`);\n\n console.log();\n console.log(pc.dim(\" File: \") + highlight(filePath));\n console.log();\n\n p.outro(\n pc.green(`✨ ${itemType.charAt(0).toUpperCase() + itemType.slice(1)} created! Edit the file to customize it.`)\n );\n } catch (error) {\n s.stop(\"Failed\");\n p.cancel(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n },\n});\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { downloadTemplate } from \"giget\";\nimport {\n ensureDir,\n getCommandsDir,\n getRulesDir,\n listFiles,\n getCursorDir,\n} from \"../utils/fs\";\nimport { REPO_URL, REPO_REF } from \"../utils/constants\";\nimport { highlight, printDivider, printSuccess, printInfo } from \"../utils/branding\";\n\nexport const pullCommand = defineCommand({\n meta: {\n name: \"pull\",\n description: \"Pull latest updates from cursor-kit repository\",\n },\n args: {\n commands: {\n type: \"boolean\",\n alias: \"c\",\n description: \"Only pull commands\",\n default: false,\n },\n rules: {\n type: \"boolean\",\n alias: \"r\",\n description: \"Only pull rules\",\n default: false,\n },\n force: {\n type: \"boolean\",\n alias: \"f\",\n description: \"Force overwrite without confirmation\",\n default: false,\n },\n },\n async run({ args }) {\n const pullBoth = !args.commands && !args.rules;\n const shouldPullCommands = pullBoth || args.commands;\n const shouldPullRules = pullBoth || args.rules;\n\n p.intro(pc.bgCyan(pc.black(\" cursor-kit pull \")));\n\n const commandsDir = getCommandsDir();\n const rulesDir = getRulesDir();\n\n const existingCommands = listFiles(commandsDir, \".md\");\n const existingRules = listFiles(rulesDir, \".mdc\");\n const hasExisting = existingCommands.length > 0 || existingRules.length > 0;\n\n if (hasExisting && !args.force) {\n printInfo(\"Current status:\");\n if (existingCommands.length > 0) {\n console.log(pc.dim(` Commands: ${existingCommands.length} files`));\n }\n if (existingRules.length > 0) {\n console.log(pc.dim(` Rules: ${existingRules.length} files`));\n }\n console.log();\n\n const shouldContinue = await p.confirm({\n message: \"This will merge with existing files. Continue?\",\n initialValue: true,\n });\n\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n const s = p.spinner();\n\n try {\n ensureDir(getCursorDir());\n\n if (shouldPullCommands) {\n s.start(\"Pulling commands...\");\n await downloadTemplate(`${REPO_URL}/templates/commands#${REPO_REF}`, {\n dir: commandsDir,\n force: true,\n });\n s.stop(\"Commands updated\");\n }\n\n if (shouldPullRules) {\n s.start(\"Pulling rules...\");\n await downloadTemplate(`${REPO_URL}/templates/rules#${REPO_REF}`, {\n dir: rulesDir,\n force: true,\n });\n s.stop(\"Rules updated\");\n }\n\n printDivider();\n console.log();\n\n const newCommands = listFiles(commandsDir, \".md\");\n const newRules = listFiles(rulesDir, \".mdc\");\n\n if (shouldPullCommands) {\n const added = newCommands.length - existingCommands.length;\n printSuccess(\n `Commands: ${highlight(newCommands.length.toString())} total` +\n (added > 0 ? pc.green(` (+${added} new)`) : \"\")\n );\n }\n\n if (shouldPullRules) {\n const added = newRules.length - existingRules.length;\n printSuccess(\n `Rules: ${highlight(newRules.length.toString())} total` +\n (added > 0 ? pc.green(` (+${added} new)`) : \"\")\n );\n }\n\n console.log();\n p.outro(pc.green(\"✨ Successfully pulled latest updates!\"));\n } catch (error) {\n s.stop(\"Failed\");\n p.cancel(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n },\n});\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n getCommandsDir,\n getRulesDir,\n listFiles,\n readFile,\n fileExists,\n} from \"../utils/fs\";\nimport { highlight, printDivider } from \"../utils/branding\";\nimport { join } from \"node:path\";\n\ninterface ItemInfo {\n name: string;\n path: string;\n description?: string;\n}\n\nfunction extractDescription(content: string, isCommand: boolean): string | undefined {\n if (isCommand) {\n const firstLine = content.trim().split(\"\\n\")[0];\n if (firstLine && !firstLine.startsWith(\"#\") && !firstLine.startsWith(\"---\")) {\n return firstLine.slice(0, 60) + (firstLine.length > 60 ? \"...\" : \"\");\n }\n } else {\n const match = content.match(/description:\\s*(.+)/);\n if (match) {\n return match[1].trim().slice(0, 60) + (match[1].length > 60 ? \"...\" : \"\");\n }\n }\n return undefined;\n}\n\nfunction getItems(dir: string, extension: string, isCommand: boolean): ItemInfo[] {\n const files = listFiles(dir, extension);\n return files.map((file) => {\n const filePath = join(dir, file);\n const content = fileExists(filePath) ? readFile(filePath) : \"\";\n return {\n name: file.replace(extension, \"\"),\n path: filePath,\n description: extractDescription(content, isCommand),\n };\n });\n}\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List all commands and rules\",\n },\n args: {\n commands: {\n type: \"boolean\",\n alias: \"c\",\n description: \"Only list commands\",\n default: false,\n },\n rules: {\n type: \"boolean\",\n alias: \"r\",\n description: \"Only list rules\",\n default: false,\n },\n verbose: {\n type: \"boolean\",\n alias: \"v\",\n description: \"Show full file paths\",\n default: false,\n },\n },\n async run({ args }) {\n const listBoth = !args.commands && !args.rules;\n const shouldListCommands = listBoth || args.commands;\n const shouldListRules = listBoth || args.rules;\n\n p.intro(pc.bgCyan(pc.black(\" cursor-kit list \")));\n\n const commandsDir = getCommandsDir();\n const rulesDir = getRulesDir();\n\n const commands = shouldListCommands ? getItems(commandsDir, \".md\", true) : [];\n const rules = shouldListRules ? getItems(rulesDir, \".mdc\", false) : [];\n\n if (commands.length === 0 && rules.length === 0) {\n console.log();\n console.log(pc.yellow(\" No commands or rules found.\"));\n console.log(pc.dim(\" Run \") + highlight(\"cursor-kit init\") + pc.dim(\" to get started.\"));\n console.log();\n p.outro(pc.dim(\"Nothing to show\"));\n return;\n }\n\n printDivider();\n\n if (shouldListCommands && commands.length > 0) {\n console.log();\n console.log(pc.bold(pc.cyan(\" 📜 Commands\")) + pc.dim(` (${commands.length})`));\n console.log();\n\n commands.forEach((cmd) => {\n console.log(` ${pc.green(\"●\")} ${highlight(cmd.name)}`);\n if (cmd.description) {\n console.log(pc.dim(` ${cmd.description}`));\n }\n if (args.verbose) {\n console.log(pc.dim(` ${cmd.path}`));\n }\n });\n }\n\n if (shouldListRules && rules.length > 0) {\n console.log();\n console.log(pc.bold(pc.cyan(\" 📋 Rules\")) + pc.dim(` (${rules.length})`));\n console.log();\n\n rules.forEach((rule) => {\n console.log(` ${pc.green(\"●\")} ${highlight(rule.name)}`);\n if (rule.description) {\n console.log(pc.dim(` ${rule.description}`));\n }\n if (args.verbose) {\n console.log(pc.dim(` ${rule.path}`));\n }\n });\n }\n\n console.log();\n printDivider();\n\n const total = commands.length + rules.length;\n p.outro(pc.dim(`Total: ${total} item${total !== 1 ? \"s\" : \"\"}`));\n },\n});\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n getCommandsDir,\n getRulesDir,\n listFiles,\n removeFile,\n fileExists,\n} from \"../utils/fs\";\nimport { highlight, printSuccess } from \"../utils/branding\";\nimport { join } from \"node:path\";\n\ntype ItemType = \"command\" | \"rule\";\n\ninterface SelectOption {\n value: string;\n label: string;\n hint?: string;\n}\n\nexport const removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: \"Remove a command or rule\",\n },\n args: {\n type: {\n type: \"string\",\n alias: \"t\",\n description: \"Type: 'command' or 'rule'\",\n },\n name: {\n type: \"string\",\n alias: \"n\",\n description: \"Name of the command or rule to remove\",\n },\n force: {\n type: \"boolean\",\n alias: \"f\",\n description: \"Skip confirmation\",\n default: false,\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(\" cursor-kit remove \")));\n\n const commandsDir = getCommandsDir();\n const rulesDir = getRulesDir();\n\n const commands = listFiles(commandsDir, \".md\").map((f) => f.replace(\".md\", \"\"));\n const rules = listFiles(rulesDir, \".mdc\").map((f) => f.replace(\".mdc\", \"\"));\n\n if (commands.length === 0 && rules.length === 0) {\n console.log();\n console.log(pc.yellow(\" No commands or rules to remove.\"));\n console.log();\n p.outro(pc.dim(\"Nothing to do\"));\n return;\n }\n\n let itemType: ItemType;\n let itemName: string;\n\n if (args.type && [\"command\", \"rule\"].includes(args.type)) {\n itemType = args.type as ItemType;\n } else {\n const typeOptions: SelectOption[] = [];\n\n if (commands.length > 0) {\n typeOptions.push({\n value: \"command\",\n label: \"Command\",\n hint: `${commands.length} available`,\n });\n }\n\n if (rules.length > 0) {\n typeOptions.push({\n value: \"rule\",\n label: \"Rule\",\n hint: `${rules.length} available`,\n });\n }\n\n const typeResult = await p.select({\n message: \"What do you want to remove?\",\n options: typeOptions,\n });\n\n if (p.isCancel(typeResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemType = typeResult as ItemType;\n }\n\n const isCommand = itemType === \"command\";\n const items = isCommand ? commands : rules;\n const dir = isCommand ? commandsDir : rulesDir;\n const extension = isCommand ? \".md\" : \".mdc\";\n\n if (items.length === 0) {\n p.cancel(`No ${itemType}s found`);\n process.exit(0);\n }\n\n if (args.name && items.includes(args.name)) {\n itemName = args.name;\n } else {\n const itemOptions: SelectOption[] = items.map((item) => ({\n value: item,\n label: item,\n }));\n\n const nameResult = await p.select({\n message: `Select ${itemType} to remove:`,\n options: itemOptions,\n });\n\n if (p.isCancel(nameResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n itemName = nameResult as string;\n }\n\n const filePath = join(dir, `${itemName}${extension}`);\n\n if (!fileExists(filePath)) {\n p.cancel(`${itemType} '${itemName}' not found`);\n process.exit(1);\n }\n\n if (!args.force) {\n const shouldDelete = await p.confirm({\n message: `Are you sure you want to delete ${highlight(itemName + extension)}?`,\n initialValue: false,\n });\n\n if (p.isCancel(shouldDelete) || !shouldDelete) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n try {\n removeFile(filePath);\n console.log();\n printSuccess(`Removed ${highlight(itemName + extension)}`);\n console.log();\n p.outro(pc.green(\"✨ Done!\"));\n } catch (error) {\n p.cancel(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n },\n});\n\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { spawn } from \"node:child_process\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { existsSync, chmodSync, readdirSync } from \"node:fs\";\nimport { highlight, printDivider, printSuccess, printInfo, printWarning } from \"../utils/branding\";\n\ntype InstanceAction = \"create\" | \"remove\";\n\ninterface InstanceInfo {\n name: string;\n path: string;\n}\n\nfunction getBinPath(): string {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n const possiblePaths = [\n join(currentDir, \"..\", \"..\", \"bin\"),\n join(currentDir, \"..\", \"bin\"),\n ];\n\n for (const binPath of possiblePaths) {\n if (existsSync(binPath)) {\n return binPath;\n }\n }\n\n return possiblePaths[0];\n}\n\nfunction ensureExecutable(scriptPath: string): void {\n try {\n chmodSync(scriptPath, 0o755);\n } catch {\n // Ignore permission errors\n }\n}\n\nfunction getExistingInstances(): InstanceInfo[] {\n const userAppsDir = join(process.env.HOME ?? \"\", \"Applications\");\n if (!existsSync(userAppsDir)) return [];\n\n try {\n const apps = readdirSync(userAppsDir);\n return apps\n .filter((app) => app.startsWith(\"Cursor\") && app.endsWith(\".app\") && app !== \"Cursor.app\")\n .map((app) => ({\n name: app.replace(\".app\", \"\"),\n path: join(userAppsDir, app),\n }));\n } catch {\n return [];\n }\n}\n\nfunction runScript(scriptPath: string, args: string[]): Promise<number> {\n return new Promise((resolve) => {\n ensureExecutable(scriptPath);\n\n const child = spawn(scriptPath, args, {\n stdio: \"inherit\",\n });\n\n child.on(\"close\", (code) => {\n resolve(code ?? 1);\n });\n\n child.on(\"error\", () => {\n resolve(1);\n });\n });\n}\n\nexport const instanceCommand = defineCommand({\n meta: {\n name: \"instance\",\n description: \"Manage Cursor IDE instances for multi-account login (macOS only)\",\n },\n args: {\n action: {\n type: \"string\",\n alias: \"a\",\n description: \"Action: 'create' or 'remove'\",\n },\n name: {\n type: \"string\",\n alias: \"n\",\n description: \"Name of the instance (e.g. 'Cursor Enterprise')\",\n },\n list: {\n type: \"boolean\",\n alias: \"l\",\n description: \"List existing Cursor instances\",\n default: false,\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(\" cursor-kit instance \")));\n\n // OS check\n if (process.platform !== \"darwin\") {\n console.log();\n printWarning(\"This command only works on macOS.\");\n console.log(pc.dim(\" Cursor instance management requires macOS-specific features.\"));\n console.log();\n p.outro(pc.dim(\"Exiting\"));\n process.exit(1);\n }\n\n // List mode\n if (args.list) {\n const instances = getExistingInstances();\n printDivider();\n console.log();\n\n if (instances.length === 0) {\n printInfo(\"No custom Cursor instances found.\");\n console.log(pc.dim(\" Run \") + highlight(\"cursor-kit instance\") + pc.dim(\" to create one.\"));\n } else {\n console.log(pc.bold(pc.cyan(\" 🖥 Cursor Instances\")) + pc.dim(` (${instances.length})`));\n console.log();\n for (const instance of instances) {\n console.log(` ${pc.green(\"●\")} ${highlight(instance.name)}`);\n console.log(pc.dim(` └─ ${instance.path}`));\n }\n }\n\n console.log();\n printDivider();\n p.outro(pc.dim(`Total: ${instances.length} instance${instances.length !== 1 ? \"s\" : \"\"}`));\n return;\n }\n\n const s = p.spinner();\n\n // Check prerequisites\n s.start(\"Checking prerequisites...\");\n const binPath = getBinPath();\n const createScript = join(binPath, \"cursor-new-instance\");\n const removeScript = join(binPath, \"cursor-remove-instance\");\n\n const scriptsExist = existsSync(createScript) && existsSync(removeScript);\n if (!scriptsExist) {\n s.stop(\"Prerequisites check failed\");\n console.log();\n printWarning(\"Required scripts not found.\");\n console.log(pc.dim(` Expected at: ${binPath}`));\n console.log();\n p.outro(pc.red(\"Installation may be corrupted\"));\n process.exit(1);\n }\n\n const originalCursor = \"/Applications/Cursor.app\";\n if (!existsSync(originalCursor)) {\n s.stop(\"Prerequisites check failed\");\n console.log();\n printWarning(\"Cursor.app not found in /Applications\");\n console.log(pc.dim(\" Please install Cursor IDE first.\"));\n console.log();\n p.outro(pc.red(\"Cursor IDE required\"));\n process.exit(1);\n }\n\n s.stop(\"Prerequisites verified\");\n\n // Get existing instances for context\n const existingInstances = getExistingInstances();\n\n let action: InstanceAction;\n let instanceName: string;\n\n // Determine action\n if (args.action && [\"create\", \"remove\"].includes(args.action)) {\n action = args.action as InstanceAction;\n } else {\n const actionResult = await p.select({\n message: \"What would you like to do?\",\n options: [\n {\n value: \"create\",\n label: \"Create new instance\",\n hint: \"Clone Cursor with separate identity\",\n },\n {\n value: \"remove\",\n label: \"Remove instance\",\n hint: existingInstances.length > 0\n ? `${existingInstances.length} instance${existingInstances.length !== 1 ? \"s\" : \"\"} available`\n : \"No instances to remove\",\n },\n ],\n });\n\n if (p.isCancel(actionResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n action = actionResult as InstanceAction;\n }\n\n // Get instance name\n if (args.name) {\n instanceName = args.name;\n } else if (action === \"remove\" && existingInstances.length > 0) {\n // For remove action, show existing instances to select from\n const instanceResult = await p.select({\n message: \"Select instance to remove:\",\n options: existingInstances.map((inst) => ({\n value: inst.name,\n label: inst.name,\n hint: inst.path,\n })),\n });\n\n if (p.isCancel(instanceResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n instanceName = instanceResult as string;\n } else if (action === \"remove\" && existingInstances.length === 0) {\n console.log();\n printInfo(\"No custom Cursor instances found to remove.\");\n console.log();\n p.outro(pc.dim(\"Nothing to do\"));\n return;\n } else {\n // For create action, prompt for name\n const nameResult = await p.text({\n message: \"Enter a name for the new instance:\",\n placeholder: \"Cursor Enterprise\",\n validate: (value) => {\n if (!value.trim()) return \"Instance name is required\";\n if (value.length < 2) return \"Name must be at least 2 characters\";\n const existing = existingInstances.find(\n (i) => i.name.toLowerCase() === value.toLowerCase()\n );\n if (existing) return `Instance \"${value}\" already exists`;\n return undefined;\n },\n });\n\n if (p.isCancel(nameResult)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n instanceName = nameResult;\n }\n\n // Show summary\n printDivider();\n console.log();\n console.log(pc.bold(pc.cyan(\" 📋 Summary\")));\n console.log();\n console.log(` ${pc.dim(\"Action:\")} ${action === \"create\" ? pc.green(\"Create\") : pc.yellow(\"Remove\")}`);\n console.log(` ${pc.dim(\"Instance:\")} ${highlight(instanceName)}`);\n\n if (action === \"create\") {\n const slug = instanceName.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n console.log(` ${pc.dim(\"Bundle ID:\")} ${pc.dim(\"com.cursor.\")}${highlight(slug)}`);\n console.log(` ${pc.dim(\"Location:\")} ${pc.dim(\"~/Applications/\")}${highlight(instanceName + \".app\")}`);\n } else {\n const targetPath = join(process.env.HOME ?? \"\", \"Applications\", `${instanceName}.app`);\n console.log(` ${pc.dim(\"Path:\")} ${pc.dim(targetPath)}`);\n }\n\n console.log();\n printDivider();\n console.log();\n\n const shouldContinue = await p.confirm({\n message: action === \"create\"\n ? \"Create this Cursor instance?\"\n : \"Remove this Cursor instance? This cannot be undone.\",\n initialValue: action === \"create\",\n });\n\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n // Execute script\n console.log();\n printDivider();\n console.log();\n\n const scriptPath = action === \"create\" ? createScript : removeScript;\n // Pass --yes to remove script since we already confirmed in the CLI\n const scriptArgs = action === \"remove\" ? [\"--yes\", instanceName] : [instanceName];\n const exitCode = await runScript(scriptPath, scriptArgs);\n\n console.log();\n printDivider();\n console.log();\n\n if (exitCode === 0) {\n if (action === \"create\") {\n printSuccess(`Instance ${highlight(instanceName)} created successfully!`);\n console.log();\n console.log(pc.dim(\" Next steps:\"));\n console.log(pc.dim(\" • The new instance should launch automatically\"));\n console.log(pc.dim(\" • Sign in with a different Cursor account\"));\n console.log(pc.dim(\" • Find it in ~/Applications/\"));\n } else {\n printSuccess(`Instance ${highlight(instanceName)} removed successfully!`);\n }\n console.log();\n p.outro(pc.green(\"✨ Done!\"));\n } else {\n printWarning(`Operation completed with exit code ${exitCode}`);\n console.log();\n p.outro(pc.yellow(\"Check the output above for details\"));\n process.exit(exitCode);\n }\n },\n});\n"],"mappings":"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","names":["import_citty","gradient","figlet","pc","pc","text","import_picocolors","import_node_path","import_node_path","pc","import_citty","p","import_picocolors","import_node_path","pc","import_citty","p","import_picocolors","pc","import_citty","p","import_picocolors","import_node_path","pc","import_citty","p","import_picocolors","import_node_path","pc","import_citty","p","import_picocolors","import_node_path","import_node_url","import_node_fs","resolve","pc","require"]}
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
|
-
import { defineCommand as
|
|
4
|
+
import { defineCommand as defineCommand7, runMain } from "citty";
|
|
5
5
|
import { createRequire } from "module";
|
|
6
6
|
|
|
7
7
|
// src/utils/branding.ts
|
|
@@ -27,6 +27,9 @@ function printSuccess(message) {
|
|
|
27
27
|
function printInfo(message) {
|
|
28
28
|
console.log(pc.cyan("\u2139") + pc.dim(" ") + message);
|
|
29
29
|
}
|
|
30
|
+
function printWarning(message) {
|
|
31
|
+
console.log(pc.yellow("\u26A0") + pc.dim(" ") + message);
|
|
32
|
+
}
|
|
30
33
|
function printDivider() {
|
|
31
34
|
console.log(pc.dim("\u2500".repeat(50)));
|
|
32
35
|
}
|
|
@@ -36,8 +39,8 @@ function printVersion(version) {
|
|
|
36
39
|
);
|
|
37
40
|
console.log();
|
|
38
41
|
}
|
|
39
|
-
function highlight(
|
|
40
|
-
return pc.cyan(
|
|
42
|
+
function highlight(text3) {
|
|
43
|
+
return pc.cyan(text3);
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
// src/commands/init.ts
|
|
@@ -912,10 +915,268 @@ var removeCommand = defineCommand5({
|
|
|
912
915
|
}
|
|
913
916
|
});
|
|
914
917
|
|
|
918
|
+
// src/commands/instance.ts
|
|
919
|
+
import { defineCommand as defineCommand6 } from "citty";
|
|
920
|
+
import * as p6 from "@clack/prompts";
|
|
921
|
+
import pc7 from "picocolors";
|
|
922
|
+
import { spawn } from "child_process";
|
|
923
|
+
import { join as join7, dirname as dirname3 } from "path";
|
|
924
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
925
|
+
import { existsSync as existsSync2, chmodSync, readdirSync as readdirSync2 } from "fs";
|
|
926
|
+
function getBinPath() {
|
|
927
|
+
const currentDir = dirname3(fileURLToPath2(import.meta.url));
|
|
928
|
+
const possiblePaths = [
|
|
929
|
+
join7(currentDir, "..", "..", "bin"),
|
|
930
|
+
join7(currentDir, "..", "bin")
|
|
931
|
+
];
|
|
932
|
+
for (const binPath of possiblePaths) {
|
|
933
|
+
if (existsSync2(binPath)) {
|
|
934
|
+
return binPath;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
return possiblePaths[0];
|
|
938
|
+
}
|
|
939
|
+
function ensureExecutable(scriptPath) {
|
|
940
|
+
try {
|
|
941
|
+
chmodSync(scriptPath, 493);
|
|
942
|
+
} catch {
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
function getExistingInstances() {
|
|
946
|
+
const userAppsDir = join7(process.env.HOME ?? "", "Applications");
|
|
947
|
+
if (!existsSync2(userAppsDir)) return [];
|
|
948
|
+
try {
|
|
949
|
+
const apps = readdirSync2(userAppsDir);
|
|
950
|
+
return apps.filter((app) => app.startsWith("Cursor") && app.endsWith(".app") && app !== "Cursor.app").map((app) => ({
|
|
951
|
+
name: app.replace(".app", ""),
|
|
952
|
+
path: join7(userAppsDir, app)
|
|
953
|
+
}));
|
|
954
|
+
} catch {
|
|
955
|
+
return [];
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
function runScript(scriptPath, args) {
|
|
959
|
+
return new Promise((resolve2) => {
|
|
960
|
+
ensureExecutable(scriptPath);
|
|
961
|
+
const child = spawn(scriptPath, args, {
|
|
962
|
+
stdio: "inherit"
|
|
963
|
+
});
|
|
964
|
+
child.on("close", (code) => {
|
|
965
|
+
resolve2(code ?? 1);
|
|
966
|
+
});
|
|
967
|
+
child.on("error", () => {
|
|
968
|
+
resolve2(1);
|
|
969
|
+
});
|
|
970
|
+
});
|
|
971
|
+
}
|
|
972
|
+
var instanceCommand = defineCommand6({
|
|
973
|
+
meta: {
|
|
974
|
+
name: "instance",
|
|
975
|
+
description: "Manage Cursor IDE instances for multi-account login (macOS only)"
|
|
976
|
+
},
|
|
977
|
+
args: {
|
|
978
|
+
action: {
|
|
979
|
+
type: "string",
|
|
980
|
+
alias: "a",
|
|
981
|
+
description: "Action: 'create' or 'remove'"
|
|
982
|
+
},
|
|
983
|
+
name: {
|
|
984
|
+
type: "string",
|
|
985
|
+
alias: "n",
|
|
986
|
+
description: "Name of the instance (e.g. 'Cursor Enterprise')"
|
|
987
|
+
},
|
|
988
|
+
list: {
|
|
989
|
+
type: "boolean",
|
|
990
|
+
alias: "l",
|
|
991
|
+
description: "List existing Cursor instances",
|
|
992
|
+
default: false
|
|
993
|
+
}
|
|
994
|
+
},
|
|
995
|
+
async run({ args }) {
|
|
996
|
+
p6.intro(pc7.bgCyan(pc7.black(" cursor-kit instance ")));
|
|
997
|
+
if (process.platform !== "darwin") {
|
|
998
|
+
console.log();
|
|
999
|
+
printWarning("This command only works on macOS.");
|
|
1000
|
+
console.log(pc7.dim(" Cursor instance management requires macOS-specific features."));
|
|
1001
|
+
console.log();
|
|
1002
|
+
p6.outro(pc7.dim("Exiting"));
|
|
1003
|
+
process.exit(1);
|
|
1004
|
+
}
|
|
1005
|
+
if (args.list) {
|
|
1006
|
+
const instances = getExistingInstances();
|
|
1007
|
+
printDivider();
|
|
1008
|
+
console.log();
|
|
1009
|
+
if (instances.length === 0) {
|
|
1010
|
+
printInfo("No custom Cursor instances found.");
|
|
1011
|
+
console.log(pc7.dim(" Run ") + highlight("cursor-kit instance") + pc7.dim(" to create one."));
|
|
1012
|
+
} else {
|
|
1013
|
+
console.log(pc7.bold(pc7.cyan(" \u{1F5A5} Cursor Instances")) + pc7.dim(` (${instances.length})`));
|
|
1014
|
+
console.log();
|
|
1015
|
+
for (const instance of instances) {
|
|
1016
|
+
console.log(` ${pc7.green("\u25CF")} ${highlight(instance.name)}`);
|
|
1017
|
+
console.log(pc7.dim(` \u2514\u2500 ${instance.path}`));
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
console.log();
|
|
1021
|
+
printDivider();
|
|
1022
|
+
p6.outro(pc7.dim(`Total: ${instances.length} instance${instances.length !== 1 ? "s" : ""}`));
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
const s = p6.spinner();
|
|
1026
|
+
s.start("Checking prerequisites...");
|
|
1027
|
+
const binPath = getBinPath();
|
|
1028
|
+
const createScript = join7(binPath, "cursor-new-instance");
|
|
1029
|
+
const removeScript = join7(binPath, "cursor-remove-instance");
|
|
1030
|
+
const scriptsExist = existsSync2(createScript) && existsSync2(removeScript);
|
|
1031
|
+
if (!scriptsExist) {
|
|
1032
|
+
s.stop("Prerequisites check failed");
|
|
1033
|
+
console.log();
|
|
1034
|
+
printWarning("Required scripts not found.");
|
|
1035
|
+
console.log(pc7.dim(` Expected at: ${binPath}`));
|
|
1036
|
+
console.log();
|
|
1037
|
+
p6.outro(pc7.red("Installation may be corrupted"));
|
|
1038
|
+
process.exit(1);
|
|
1039
|
+
}
|
|
1040
|
+
const originalCursor = "/Applications/Cursor.app";
|
|
1041
|
+
if (!existsSync2(originalCursor)) {
|
|
1042
|
+
s.stop("Prerequisites check failed");
|
|
1043
|
+
console.log();
|
|
1044
|
+
printWarning("Cursor.app not found in /Applications");
|
|
1045
|
+
console.log(pc7.dim(" Please install Cursor IDE first."));
|
|
1046
|
+
console.log();
|
|
1047
|
+
p6.outro(pc7.red("Cursor IDE required"));
|
|
1048
|
+
process.exit(1);
|
|
1049
|
+
}
|
|
1050
|
+
s.stop("Prerequisites verified");
|
|
1051
|
+
const existingInstances = getExistingInstances();
|
|
1052
|
+
let action;
|
|
1053
|
+
let instanceName;
|
|
1054
|
+
if (args.action && ["create", "remove"].includes(args.action)) {
|
|
1055
|
+
action = args.action;
|
|
1056
|
+
} else {
|
|
1057
|
+
const actionResult = await p6.select({
|
|
1058
|
+
message: "What would you like to do?",
|
|
1059
|
+
options: [
|
|
1060
|
+
{
|
|
1061
|
+
value: "create",
|
|
1062
|
+
label: "Create new instance",
|
|
1063
|
+
hint: "Clone Cursor with separate identity"
|
|
1064
|
+
},
|
|
1065
|
+
{
|
|
1066
|
+
value: "remove",
|
|
1067
|
+
label: "Remove instance",
|
|
1068
|
+
hint: existingInstances.length > 0 ? `${existingInstances.length} instance${existingInstances.length !== 1 ? "s" : ""} available` : "No instances to remove"
|
|
1069
|
+
}
|
|
1070
|
+
]
|
|
1071
|
+
});
|
|
1072
|
+
if (p6.isCancel(actionResult)) {
|
|
1073
|
+
p6.cancel("Operation cancelled");
|
|
1074
|
+
process.exit(0);
|
|
1075
|
+
}
|
|
1076
|
+
action = actionResult;
|
|
1077
|
+
}
|
|
1078
|
+
if (args.name) {
|
|
1079
|
+
instanceName = args.name;
|
|
1080
|
+
} else if (action === "remove" && existingInstances.length > 0) {
|
|
1081
|
+
const instanceResult = await p6.select({
|
|
1082
|
+
message: "Select instance to remove:",
|
|
1083
|
+
options: existingInstances.map((inst) => ({
|
|
1084
|
+
value: inst.name,
|
|
1085
|
+
label: inst.name,
|
|
1086
|
+
hint: inst.path
|
|
1087
|
+
}))
|
|
1088
|
+
});
|
|
1089
|
+
if (p6.isCancel(instanceResult)) {
|
|
1090
|
+
p6.cancel("Operation cancelled");
|
|
1091
|
+
process.exit(0);
|
|
1092
|
+
}
|
|
1093
|
+
instanceName = instanceResult;
|
|
1094
|
+
} else if (action === "remove" && existingInstances.length === 0) {
|
|
1095
|
+
console.log();
|
|
1096
|
+
printInfo("No custom Cursor instances found to remove.");
|
|
1097
|
+
console.log();
|
|
1098
|
+
p6.outro(pc7.dim("Nothing to do"));
|
|
1099
|
+
return;
|
|
1100
|
+
} else {
|
|
1101
|
+
const nameResult = await p6.text({
|
|
1102
|
+
message: "Enter a name for the new instance:",
|
|
1103
|
+
placeholder: "Cursor Enterprise",
|
|
1104
|
+
validate: (value) => {
|
|
1105
|
+
if (!value.trim()) return "Instance name is required";
|
|
1106
|
+
if (value.length < 2) return "Name must be at least 2 characters";
|
|
1107
|
+
const existing = existingInstances.find(
|
|
1108
|
+
(i) => i.name.toLowerCase() === value.toLowerCase()
|
|
1109
|
+
);
|
|
1110
|
+
if (existing) return `Instance "${value}" already exists`;
|
|
1111
|
+
return void 0;
|
|
1112
|
+
}
|
|
1113
|
+
});
|
|
1114
|
+
if (p6.isCancel(nameResult)) {
|
|
1115
|
+
p6.cancel("Operation cancelled");
|
|
1116
|
+
process.exit(0);
|
|
1117
|
+
}
|
|
1118
|
+
instanceName = nameResult;
|
|
1119
|
+
}
|
|
1120
|
+
printDivider();
|
|
1121
|
+
console.log();
|
|
1122
|
+
console.log(pc7.bold(pc7.cyan(" \u{1F4CB} Summary")));
|
|
1123
|
+
console.log();
|
|
1124
|
+
console.log(` ${pc7.dim("Action:")} ${action === "create" ? pc7.green("Create") : pc7.yellow("Remove")}`);
|
|
1125
|
+
console.log(` ${pc7.dim("Instance:")} ${highlight(instanceName)}`);
|
|
1126
|
+
if (action === "create") {
|
|
1127
|
+
const slug = instanceName.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
1128
|
+
console.log(` ${pc7.dim("Bundle ID:")} ${pc7.dim("com.cursor.")}${highlight(slug)}`);
|
|
1129
|
+
console.log(` ${pc7.dim("Location:")} ${pc7.dim("~/Applications/")}${highlight(instanceName + ".app")}`);
|
|
1130
|
+
} else {
|
|
1131
|
+
const targetPath = join7(process.env.HOME ?? "", "Applications", `${instanceName}.app`);
|
|
1132
|
+
console.log(` ${pc7.dim("Path:")} ${pc7.dim(targetPath)}`);
|
|
1133
|
+
}
|
|
1134
|
+
console.log();
|
|
1135
|
+
printDivider();
|
|
1136
|
+
console.log();
|
|
1137
|
+
const shouldContinue = await p6.confirm({
|
|
1138
|
+
message: action === "create" ? "Create this Cursor instance?" : "Remove this Cursor instance? This cannot be undone.",
|
|
1139
|
+
initialValue: action === "create"
|
|
1140
|
+
});
|
|
1141
|
+
if (p6.isCancel(shouldContinue) || !shouldContinue) {
|
|
1142
|
+
p6.cancel("Operation cancelled");
|
|
1143
|
+
process.exit(0);
|
|
1144
|
+
}
|
|
1145
|
+
console.log();
|
|
1146
|
+
printDivider();
|
|
1147
|
+
console.log();
|
|
1148
|
+
const scriptPath = action === "create" ? createScript : removeScript;
|
|
1149
|
+
const scriptArgs = action === "remove" ? ["--yes", instanceName] : [instanceName];
|
|
1150
|
+
const exitCode = await runScript(scriptPath, scriptArgs);
|
|
1151
|
+
console.log();
|
|
1152
|
+
printDivider();
|
|
1153
|
+
console.log();
|
|
1154
|
+
if (exitCode === 0) {
|
|
1155
|
+
if (action === "create") {
|
|
1156
|
+
printSuccess(`Instance ${highlight(instanceName)} created successfully!`);
|
|
1157
|
+
console.log();
|
|
1158
|
+
console.log(pc7.dim(" Next steps:"));
|
|
1159
|
+
console.log(pc7.dim(" \u2022 The new instance should launch automatically"));
|
|
1160
|
+
console.log(pc7.dim(" \u2022 Sign in with a different Cursor account"));
|
|
1161
|
+
console.log(pc7.dim(" \u2022 Find it in ~/Applications/"));
|
|
1162
|
+
} else {
|
|
1163
|
+
printSuccess(`Instance ${highlight(instanceName)} removed successfully!`);
|
|
1164
|
+
}
|
|
1165
|
+
console.log();
|
|
1166
|
+
p6.outro(pc7.green("\u2728 Done!"));
|
|
1167
|
+
} else {
|
|
1168
|
+
printWarning(`Operation completed with exit code ${exitCode}`);
|
|
1169
|
+
console.log();
|
|
1170
|
+
p6.outro(pc7.yellow("Check the output above for details"));
|
|
1171
|
+
process.exit(exitCode);
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
});
|
|
1175
|
+
|
|
915
1176
|
// src/cli.ts
|
|
916
1177
|
var require2 = createRequire(import.meta.url);
|
|
917
1178
|
var pkg = require2("../package.json");
|
|
918
|
-
var main =
|
|
1179
|
+
var main = defineCommand7({
|
|
919
1180
|
meta: {
|
|
920
1181
|
name: "cursor-kit",
|
|
921
1182
|
version: pkg.version,
|
|
@@ -930,7 +1191,8 @@ var main = defineCommand6({
|
|
|
930
1191
|
add: addCommand,
|
|
931
1192
|
pull: pullCommand,
|
|
932
1193
|
list: listCommand,
|
|
933
|
-
remove: removeCommand
|
|
1194
|
+
remove: removeCommand,
|
|
1195
|
+
instance: instanceCommand
|
|
934
1196
|
}
|
|
935
1197
|
});
|
|
936
1198
|
runMain(main);
|