55 *
66 * 这是一个 Cursor 编辑器试用重置工具
77 * 该脚本通过重置 Cursor 配置文件中的设备 ID 来生成新的随机设备 ID,从而重置试用期。
8+ * 支持 Windows、macOS 和 Linux 系统。
9+ *
10+ * 主要功能:
11+ * - 自动检测并关闭运行中的 Cursor 进程
12+ * - 备份现有配置文件
13+ * - 生成新的随机设备 ID
14+ * - 统计重置历史记录
815 *
916 * 仓库地址: https://github.com/isboyjc/cursor-reset
1017 * 作者: @isboyjc
@@ -20,12 +27,10 @@ const readline = require('readline');
2027
2128/**
2229 * 等待用户按键
23- * Windows 系统专用功能
24- * 注意:process.platform 返回 'win32' 是 Node.js 的历史遗留问题
25- * 在 64 位 Windows 系统上也是返回 'win32'
26- * 这与系统实际位数无关,只是用来标识这是 Windows 系统
30+ * 在 Windows 系统下运行时,程序结束前等待用户按键
31+ * 这样可以防止在双击运行时窗口立即关闭
2732 *
28- * @returns {Promise<void> }
33+ * @returns {Promise<void> } 返回一个 Promise,在用户按键后解决
2934 */
3035function waitForKeypress ( ) {
3136 // 在 Windows 系统下(无论 32 位还是 64 位)且不是在终端中运行时等待
@@ -59,8 +64,10 @@ function waitForKeypress() {
5964
6065/**
6166 * 用户确认提示
62- * @param {string } question 提示问题
63- * @returns {Promise<boolean> } 用户选择结果
67+ * 显示一个 yes/no 提示,等待用户输入
68+ *
69+ * @param {string } question 要显示给用户的问题
70+ * @returns {Promise<boolean> } 如果用户输入 'y' 或 'Y' 返回 true,否则返回 false
6471 */
6572async function confirm ( question ) {
6673 const rl = readline . createInterface ( {
@@ -77,8 +84,10 @@ async function confirm(question) {
7784}
7885
7986/**
80- * 获取 Windows 下的 Cursor 进程名
81- * @returns {Promise<string|null> } 返回进程名,如果没找到返回 null
87+ * 获取 Windows 系统下运行的 Cursor 进程名
88+ * 使用 wmic 命令获取详细的进程信息,并过滤出 Cursor 相关进程
89+ *
90+ * @returns {Promise<string|null> } 返回找到的第一个 Cursor 进程名,如果没找到则返回 null
8291 */
8392async function getWindowsCursorProcessName ( ) {
8493 try {
@@ -119,6 +128,11 @@ async function getWindowsCursorProcessName() {
119128
120129/**
121130 * 检查 Cursor 是否正在运行
131+ * 根据不同操作系统使用不同的命令检查进程
132+ * - Windows: 使用 wmic 命令
133+ * - macOS: 使用 pgrep 命令
134+ * - Linux: 使用 pgrep 命令
135+ *
122136 * @returns {boolean } 如果 Cursor 正在运行返回 true,否则返回 false
123137 */
124138function isCursorRunning ( ) {
@@ -166,8 +180,13 @@ function isCursorRunning() {
166180}
167181
168182/**
169- * 关闭 Cursor 进程
170- * @returns {Promise<boolean> } 是否成功关闭
183+ * 强制关闭 Cursor 进程
184+ * 根据不同操作系统使用相应的命令关闭进程:
185+ * - Windows: taskkill 命令
186+ * - macOS: pkill 命令
187+ * - Linux: pkill 命令
188+ *
189+ * @returns {Promise<boolean> } 成功关闭返回 true,失败返回 false
171190 */
172191async function killCursorProcess ( ) {
173192 try {
@@ -214,8 +233,11 @@ async function killCursorProcess() {
214233
215234/**
216235 * 格式化时间戳
217- * @param {Date } date - 日期对象
218- * @returns {string } 格式化后的时间字符串 (yyyyMMddHHmmssSSS)
236+ * 将日期对象转换为格式化的时间字符串
237+ * 格式:yyyyMMddHHmmssSSS
238+ *
239+ * @param {Date } date 要格式化的日期对象
240+ * @returns {string } 格式化后的时间字符串
219241 */
220242function formatTimestamp ( date ) {
221243 const pad = ( num , len = 2 ) => String ( num ) . padStart ( len , '0' ) ;
@@ -232,9 +254,12 @@ function formatTimestamp(date) {
232254}
233255
234256/**
235- * 备份指定文件的时间戳备份
236- * @param {string } filePath - 需要备份的文件路径
237- * @returns {Promise<string> } 备份文件的路径
257+ * 备份配置文件
258+ * 创建配置文件的时间戳备份,文件名格式为:原文件名.时间戳.bak
259+ *
260+ * @param {string } filePath 需要备份的文件路径
261+ * @returns {Promise<string> } 备份文件的完整路径
262+ * @throws {Error } 备份失败时抛出错误
238263 */
239264async function backupFile ( filePath ) {
240265 try {
@@ -249,7 +274,10 @@ async function backupFile(filePath) {
249274
250275/**
251276 * 检查 Cursor 是否已安装
252- * @returns {Promise<boolean> } 如果 Cursor 已安装返回 true,否则返回 false
277+ * 根据不同操作系统检查 Cursor 的默认安装位置
278+ *
279+ * @returns {Promise<boolean> } Cursor 已安装返回 true,否则返回 false
280+ * @throws {Error } 不支持的操作系统时抛出错误
253281 */
254282async function isCursorInstalled ( ) {
255283 const platform = process . platform ;
@@ -290,9 +318,14 @@ async function isCursorInstalled() {
290318}
291319
292320/**
293- * 根据操作系统类型确定存储文件的位置
294- * @returns {string } 返回对应操作系统下 Cursor 存储文件的完整路径
295- * @throws {Error } 当操作系统不受支持时抛出异常
321+ * 获取 Cursor 存储文件路径
322+ * 根据不同操作系统返回配置文件的标准位置:
323+ * - Windows: %APPDATA%/Cursor/User/globalStorage/storage.json
324+ * - macOS: ~/Library/Application Support/Cursor/User/globalStorage/storage.json
325+ * - Linux: ~/.config/Cursor/User/globalStorage/storage.json
326+ *
327+ * @returns {string } 配置文件的完整路径
328+ * @throws {Error } 不支持的操作系统时抛出错误
296329 */
297330function getStorageFile ( ) {
298331 const platform = process . platform ;
@@ -311,8 +344,13 @@ function getStorageFile() {
311344}
312345
313346/**
314- * 生成随机设备ID
315- * @returns {object } 包含新生成的设备ID的对象
347+ * 生成新的随机设备标识
348+ * 生成三种不同的设备 ID:
349+ * - machineId: 32 字节的随机十六进制字符串
350+ * - macMachineId: 32 字节的随机十六进制字符串
351+ * - devDeviceId: UUID v4 格式的随机字符串
352+ *
353+ * @returns {object } 包含新生成的三个设备 ID 的对象
316354 */
317355function generateDeviceIds ( ) {
318356 return {
@@ -323,9 +361,12 @@ function generateDeviceIds() {
323361}
324362
325363/**
326- * 获取配置文件的所有备份
327- * @param {string } configPath - 配置文件路径
328- * @returns {Promise<Array<{name: string, time: Date}>> } 备份文件信息列表,按时间倒序排列
364+ * 获取配置文件的所有备份记录
365+ * 搜索指定目录下所有以 .bak 结尾的备份文件
366+ * 解析文件名中的时间戳并按时间倒序排列
367+ *
368+ * @param {string } configPath 配置文件路径
369+ * @returns {Promise<Array<{name: string, time: Date}>> } 备份文件信息数组
329370 */
330371async function getBackupFiles ( configPath ) {
331372 try {
@@ -372,14 +413,14 @@ async function getBackupFiles(configPath) {
372413
373414/**
374415 * 重置 Cursor 的设备标识
375- * 该函数会执行以下操作 :
376- * 1. 检查 Cursor 是否在运行
377- * 2. 获取存储文件路径
378- * 3. 创建必要的目录结构
379- * 4. 备份现有的存储文件
380- * 5. 生成新的随机设备标识
381- * 6. 更新存储文件
382- * 7. 打印新生成的设备标识信息
416+ * 执行完整的重置流程 :
417+ * 1. 检查 Cursor 安装状态
418+ * 2. 检查并关闭运行中的 Cursor
419+ * 3. 准备配置目录
420+ * 4. 备份现有配置
421+ * 5. 生成新的设备 ID
422+ * 6. 保存新配置
423+ * 7. 显示重置统计信息
383424 */
384425async function resetCursorId ( ) {
385426 try {
@@ -464,6 +505,8 @@ async function resetCursorId() {
464505
465506/**
466507 * 主程序入口
508+ * 执行重置流程并处理异常
509+ * 确保在程序结束前等待用户确认(Windows)
467510 */
468511async function main ( ) {
469512 let exitCode = 0 ;
0 commit comments