cursor-feedback 2.6.0 → 2.7.0
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/CHANGELOG.md +7 -0
- package/README.md +1 -0
- package/README_CN.md +1 -0
- package/dist/daemon-install.js +52 -0
- package/dist/mcp-server.js +11 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [2.7.0](https://github.com/jianger666/cursor-feedback-extension/compare/v2.6.0...v2.7.0) (2026-07-06)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **daemon:** 守护自动升级——IDE 新版 server 启动时发现守护版本落后即静默重装(带并发锁/残锁自清) ([738c270](https://github.com/jianger666/cursor-feedback-extension/commit/738c270f4bb6b4b6115f30b5c811fca26d10b43a))
|
|
11
|
+
|
|
5
12
|
## [2.6.0](https://github.com/jianger666/cursor-feedback-extension/compare/v2.5.0...v2.6.0) (2026-07-06)
|
|
6
13
|
|
|
7
14
|
|
package/README.md
CHANGED
|
@@ -289,6 +289,7 @@ Normally the server process is spawned by Cursor, so closing Cursor drops the Fe
|
|
|
289
289
|
|
|
290
290
|
- **Enable**: the "Background service" toggle in the extension's notification settings, or `npx cursor-feedback@latest install-daemon` (`uninstall-daemon` / `daemon-status` likewise).
|
|
291
291
|
- **How**: the current package is copied to `~/.cursor-feedback/daemon/app` (self-contained, immune to npx cache cleanup); registered as a launchd agent on macOS (auto-restart on crash) or a logon scheduled task on Windows.
|
|
292
|
+
- **Auto-upgrade**: the daemon copy never goes stale — whenever a newer server starts inside the IDE and sees the installed daemon is outdated, it silently reinstalls and restarts it.
|
|
292
293
|
- **Keep-awake**: while on AC power the daemon prevents system sleep (macOS `caffeinate -s`; Windows power assertion). On battery it does nothing. Lock screen never affects background processes.
|
|
293
294
|
- **Typical use**: leave the machine plugged in and locked after work; `/new` from your phone anytime.
|
|
294
295
|
|
package/README_CN.md
CHANGED
|
@@ -293,6 +293,7 @@ npm install -g cursor-feedback
|
|
|
293
293
|
|
|
294
294
|
- **开启方式**:插件面板「通知设置」里打开「常驻服务」开关;或命令行 `npx cursor-feedback@latest install-daemon`(卸载对应 `uninstall-daemon`,状态 `daemon-status`)。
|
|
295
295
|
- **实现**:把当前包完整拷贝到 `~/.cursor-feedback/daemon/app`(自包含,不怕 npx 缓存被清),macOS 注册 launchd(崩溃自动拉起),Windows 注册登录计划任务。
|
|
296
|
+
- **自动升级**:守护拷贝不会「静默落后」——IDE 里的新版 server 启动时发现守护版本旧了,会静默重装并重启守护,无需手动操作。
|
|
296
297
|
- **防睡眠**:守护进程在接电源时自动阻止系统睡眠(macOS `caffeinate -s`;Windows 电源断言),电池供电不生效、不偷耗电。锁屏本来就不影响后台进程。
|
|
297
298
|
- **典型用法**:下班插着电源锁屏走人,手机飞书随时 `/new`。
|
|
298
299
|
|
package/dist/daemon-install.js
CHANGED
|
@@ -37,6 +37,7 @@ exports.daemonSupported = daemonSupported;
|
|
|
37
37
|
exports.installDaemon = installDaemon;
|
|
38
38
|
exports.uninstallDaemon = uninstallDaemon;
|
|
39
39
|
exports.daemonStatus = daemonStatus;
|
|
40
|
+
exports.upgradeDaemonIfOutdated = upgradeDaemonIfOutdated;
|
|
40
41
|
/**
|
|
41
42
|
* 常驻守护进程的安装 / 卸载 / 状态查询。
|
|
42
43
|
*
|
|
@@ -55,10 +56,12 @@ const child_process_1 = require("child_process");
|
|
|
55
56
|
const fs = __importStar(require("fs"));
|
|
56
57
|
const os = __importStar(require("os"));
|
|
57
58
|
const path = __importStar(require("path"));
|
|
59
|
+
const logger_js_1 = require("./logger.js");
|
|
58
60
|
const LABEL = 'com.jianger666.cursor-feedback.daemon';
|
|
59
61
|
const WIN_TASK_NAME = 'CursorFeedbackDaemon';
|
|
60
62
|
function dlog(message) {
|
|
61
63
|
console.error(`[${new Date().toISOString()}] [daemon-install] ${message}`);
|
|
64
|
+
(0, logger_js_1.fileLog)('daemon-install', message);
|
|
62
65
|
}
|
|
63
66
|
function daemonRoot() {
|
|
64
67
|
return path.join(os.homedir(), '.cursor-feedback', 'daemon');
|
|
@@ -289,4 +292,53 @@ function winTaskExists() {
|
|
|
289
292
|
return false;
|
|
290
293
|
}
|
|
291
294
|
}
|
|
295
|
+
/**
|
|
296
|
+
* 守护自动升级:已安装的守护是安装时的快照,不会随 npx @latest 走。
|
|
297
|
+
* IDE 里的新版 server 启动时调用这里——发现守护版本与自己不一致就静默重装
|
|
298
|
+
* (重装会 bootout 旧守护、拷贝新包、重新拉起),用户零操作。
|
|
299
|
+
*
|
|
300
|
+
* 并发防护:多窗口 = 多个 server 同时启动,重装涉及删目录 + 整树拷贝,撞上会互相
|
|
301
|
+
* 写坏。用 wx 独占锁串行化,抢不到的直接跳过(反正有人在装);残锁超 10 分钟视为
|
|
302
|
+
* 上次进程死在半路,清掉重来。
|
|
303
|
+
*
|
|
304
|
+
* @returns 是否真的执行了重装
|
|
305
|
+
*/
|
|
306
|
+
function upgradeDaemonIfOutdated(currentVersion) {
|
|
307
|
+
try {
|
|
308
|
+
const st = daemonStatus();
|
|
309
|
+
if (!st.installed || !st.installedVersion || st.installedVersion === currentVersion) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
const lock = path.join(daemonRoot(), 'upgrade.lock');
|
|
313
|
+
try {
|
|
314
|
+
const age = Date.now() - fs.statSync(lock).mtimeMs;
|
|
315
|
+
if (age > 10 * 60 * 1000)
|
|
316
|
+
fs.rmSync(lock, { force: true });
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// 无残锁
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
fs.mkdirSync(daemonRoot(), { recursive: true });
|
|
323
|
+
fs.writeFileSync(lock, String(process.pid), { flag: 'wx' });
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
return false; // 另一个窗口的 server 正在升级
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
dlog(`守护版本 ${st.installedVersion} 落后于当前 ${currentVersion},自动重装升级`);
|
|
330
|
+
installDaemon();
|
|
331
|
+
dlog('守护自动升级完成');
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
finally {
|
|
335
|
+
fs.rmSync(lock, { force: true });
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (e) {
|
|
339
|
+
// 升级失败不影响 server 正常启动,旧守护继续工作
|
|
340
|
+
dlog(`守护自动升级失败(不影响本进程):${e}`);
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
292
344
|
//# sourceMappingURL=daemon-install.js.map
|
package/dist/mcp-server.js
CHANGED
|
@@ -2151,6 +2151,17 @@ class McpFeedbackServer {
|
|
|
2151
2151
|
this.startWatchdog();
|
|
2152
2152
|
debugLog('MCP Server started successfully');
|
|
2153
2153
|
debugLog('Waiting for tool calls from AI agent...');
|
|
2154
|
+
// 守护自动升级:本进程经 npx @latest 拉起、必然是最新版;发现已装守护版本落后
|
|
2155
|
+
// 就静默重装(拷贝新包 + 重启守护),用户零操作。延后跑:整树拷贝要几秒,
|
|
2156
|
+
// 不能挡 MCP 握手;失败也只记日志,旧守护继续工作。
|
|
2157
|
+
setTimeout(() => {
|
|
2158
|
+
try {
|
|
2159
|
+
(0, daemon_install_js_1.upgradeDaemonIfOutdated)(PKG_VERSION);
|
|
2160
|
+
}
|
|
2161
|
+
catch {
|
|
2162
|
+
// upgradeDaemonIfOutdated 内部已兜错,这里纯保险
|
|
2163
|
+
}
|
|
2164
|
+
}, 5000);
|
|
2154
2165
|
}
|
|
2155
2166
|
catch (error) {
|
|
2156
2167
|
debugLog(`Failed to start server: ${error}`);
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "cursor-feedback",
|
|
3
3
|
"displayName": "Cursor Feedback",
|
|
4
4
|
"description": "One Cursor conversation, unlimited AI interactions - Save your monthly request quota! Interactive feedback loop for AI chat via MCP",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.7.0",
|
|
6
6
|
"icon": "icon.png",
|
|
7
7
|
"author": "jianger666",
|
|
8
8
|
"license": "MIT",
|