@rewind-ai/cli 0.6.2 → 0.6.4
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/dist/src/cli.js +2 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/clients/mcp-json.d.ts +59 -0
- package/dist/src/clients/mcp-json.js +162 -0
- package/dist/src/clients/mcp-json.js.map +1 -0
- package/dist/src/clients/project-registry.d.ts +36 -0
- package/dist/src/clients/project-registry.js +136 -0
- package/dist/src/clients/project-registry.js.map +1 -0
- package/dist/src/clients/types.d.ts +40 -19
- package/dist/src/clients/types.js +300 -72
- package/dist/src/clients/types.js.map +1 -1
- package/dist/src/mcp/server.js +35 -27
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/paths.d.ts +18 -1
- package/dist/src/paths.js +55 -9
- package/dist/src/paths.js.map +1 -1
- package/dist/src/product/setup.d.ts +2 -2
- package/dist/src/product/setup.js +151 -38
- package/dist/src/product/setup.js.map +1 -1
- package/docs/MCP.md +13 -9
- package/docs/PACKAGING.md +11 -7
- package/package.json +1 -1
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent client integration layer.
|
|
3
3
|
* Cursor is the first proven integration. Do not advertise untested clients.
|
|
4
|
+
*
|
|
5
|
+
* Strategy (observed Cursor behaviour):
|
|
6
|
+
* Project-level `.cursor/mcp.json` may be discovered but remain disconnected.
|
|
7
|
+
* User-level `~/.cursor/mcp.json` connects reliably.
|
|
8
|
+
* Therefore: one user-level MCP server entry per REWIND project
|
|
9
|
+
* (`rewind-<slug>`) with absolute REWIND_PROJECT_ROOT — never overwrite
|
|
10
|
+
* a single global entry when setting up another project.
|
|
4
11
|
*/
|
|
5
|
-
|
|
12
|
+
import { type CursorIntegrationState } from "./project-registry.js";
|
|
13
|
+
import { isLegacySourceMcpEntry, type McpServerEntry } from "./mcp-json.js";
|
|
14
|
+
export type ClientConnectionStatus = "not_detected" | "detected" | "configured" | "connected" | "needs_reload" | "invalid";
|
|
6
15
|
export interface ClientStatus {
|
|
7
16
|
id: string;
|
|
8
17
|
displayName: string;
|
|
@@ -11,6 +20,9 @@ export interface ClientStatus {
|
|
|
11
20
|
configPath: string | null;
|
|
12
21
|
message: string;
|
|
13
22
|
supported: boolean;
|
|
23
|
+
/** Honest integration state for setup/doctor */
|
|
24
|
+
integrationState?: CursorIntegrationState | "not_configured";
|
|
25
|
+
serverName?: string | null;
|
|
14
26
|
}
|
|
15
27
|
export interface AgentClientIntegration {
|
|
16
28
|
readonly id: string;
|
|
@@ -19,10 +31,7 @@ export interface AgentClientIntegration {
|
|
|
19
31
|
detect(): Promise<boolean>;
|
|
20
32
|
getConfigPath(): Promise<string | null>;
|
|
21
33
|
readConfig(): Promise<unknown | null>;
|
|
22
|
-
install(projectRoot: string): Promise<
|
|
23
|
-
path: string;
|
|
24
|
-
changed: boolean;
|
|
25
|
-
}>;
|
|
34
|
+
install(projectRoot: string): Promise<CursorInstallResult>;
|
|
26
35
|
validate(projectRoot: string): Promise<{
|
|
27
36
|
ok: boolean;
|
|
28
37
|
message: string;
|
|
@@ -33,32 +42,47 @@ export interface AgentClientIntegration {
|
|
|
33
42
|
}>;
|
|
34
43
|
status(projectRoot: string): Promise<ClientStatus>;
|
|
35
44
|
}
|
|
45
|
+
export interface CursorInstallResult {
|
|
46
|
+
path: string;
|
|
47
|
+
changed: boolean;
|
|
48
|
+
serverName: string;
|
|
49
|
+
backupPath: string | null;
|
|
50
|
+
removedKeys: string[];
|
|
51
|
+
legacyCleaned: string[];
|
|
52
|
+
projectMcpCleaned: boolean;
|
|
53
|
+
state: CursorIntegrationState;
|
|
54
|
+
notes: string[];
|
|
55
|
+
}
|
|
36
56
|
/** Portable MCP entry — installed CLI only (never tsx + src/cli.ts). */
|
|
37
|
-
export declare function rewindMcpEntry(projectRoot: string):
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
57
|
+
export declare function rewindMcpEntry(projectRoot: string): McpServerEntry;
|
|
58
|
+
export { isLegacySourceMcpEntry };
|
|
59
|
+
/**
|
|
60
|
+
* Evidence that Cursor has actually loaded/used REWIND MCP for this project.
|
|
61
|
+
* Config presence alone is NOT connection.
|
|
62
|
+
*/
|
|
63
|
+
export declare function observeCursorMcpConnection(projectRoot: string): Promise<{
|
|
64
|
+
connected: boolean;
|
|
65
|
+
detail: string;
|
|
66
|
+
}>;
|
|
43
67
|
export declare class CursorIntegration implements AgentClientIntegration {
|
|
44
68
|
readonly id = "cursor";
|
|
45
69
|
readonly displayName = "Cursor";
|
|
46
70
|
readonly supported = true;
|
|
47
71
|
detect(): Promise<boolean>;
|
|
48
72
|
getConfigPath(): Promise<string | null>;
|
|
73
|
+
/** @deprecated Prefer user-level config; kept for cleanup of old installs */
|
|
49
74
|
projectMcpPath(projectRoot: string): string;
|
|
50
75
|
readConfig(): Promise<unknown | null>;
|
|
51
|
-
install(projectRoot: string): Promise<
|
|
52
|
-
path: string;
|
|
53
|
-
changed: boolean;
|
|
54
|
-
}>;
|
|
76
|
+
install(projectRoot: string): Promise<CursorInstallResult>;
|
|
55
77
|
validate(projectRoot: string): Promise<{
|
|
56
78
|
ok: boolean;
|
|
57
79
|
message: string;
|
|
58
80
|
}>;
|
|
81
|
+
private findServerNameForProject;
|
|
59
82
|
remove(projectRoot: string): Promise<{
|
|
60
83
|
removed: boolean;
|
|
61
84
|
path: string | null;
|
|
85
|
+
serverName?: string;
|
|
62
86
|
}>;
|
|
63
87
|
status(projectRoot: string): Promise<ClientStatus>;
|
|
64
88
|
}
|
|
@@ -71,10 +95,7 @@ export declare class UnsupportedClientStub implements AgentClientIntegration {
|
|
|
71
95
|
detect(): Promise<boolean>;
|
|
72
96
|
getConfigPath(): Promise<string | null>;
|
|
73
97
|
readConfig(): Promise<unknown | null>;
|
|
74
|
-
install(): Promise<
|
|
75
|
-
path: string;
|
|
76
|
-
changed: boolean;
|
|
77
|
-
}>;
|
|
98
|
+
install(): Promise<CursorInstallResult>;
|
|
78
99
|
validate(): Promise<{
|
|
79
100
|
ok: boolean;
|
|
80
101
|
message: string;
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent client integration layer.
|
|
3
3
|
* Cursor is the first proven integration. Do not advertise untested clients.
|
|
4
|
+
*
|
|
5
|
+
* Strategy (observed Cursor behaviour):
|
|
6
|
+
* Project-level `.cursor/mcp.json` may be discovered but remain disconnected.
|
|
7
|
+
* User-level `~/.cursor/mcp.json` connects reliably.
|
|
8
|
+
* Therefore: one user-level MCP server entry per REWIND project
|
|
9
|
+
* (`rewind-<slug>`) with absolute REWIND_PROJECT_ROOT — never overwrite
|
|
10
|
+
* a single global entry when setting up another project.
|
|
4
11
|
*/
|
|
5
12
|
import path from "node:path";
|
|
6
13
|
import os from "node:os";
|
|
7
|
-
import { access
|
|
14
|
+
import { access } from "node:fs/promises";
|
|
8
15
|
import { constants as fsConstants } from "node:fs";
|
|
9
|
-
import { resolveRewindCliInvocation } from "../paths.js";
|
|
16
|
+
import { resolveRewindCliInvocation, getPackageRoot } from "../paths.js";
|
|
17
|
+
import { allocateServerName, findRegisteredProject, loadProjectRegistry, markProjectIntegration, removeRegisteredProject, upsertRegisteredProject, } from "./project-registry.js";
|
|
18
|
+
import { entryProjectRoot, getUserMcpConfigPath, isLegacySourceMcpEntry, isRewindServerKey, looksLikeRewindEntry, McpConfigError, mutateMcpConfig, projectMcpConfigPath, readMcpConfig, } from "./mcp-json.js";
|
|
19
|
+
import { listTransactions } from "../ledger/query.js";
|
|
10
20
|
async function exists(p) {
|
|
11
21
|
try {
|
|
12
22
|
await access(p, fsConstants.F_OK);
|
|
@@ -16,34 +26,65 @@ async function exists(p) {
|
|
|
16
26
|
return false;
|
|
17
27
|
}
|
|
18
28
|
}
|
|
19
|
-
async function writeJsonAtomic(file, data) {
|
|
20
|
-
await mkdir(path.dirname(file), { recursive: true });
|
|
21
|
-
const tmp = `${file}.tmp-${process.pid}`;
|
|
22
|
-
await writeFile(tmp, JSON.stringify(data, null, 2) + "\n", "utf8");
|
|
23
|
-
await rename(tmp, file);
|
|
24
|
-
}
|
|
25
29
|
/** Portable MCP entry — installed CLI only (never tsx + src/cli.ts). */
|
|
26
30
|
export function rewindMcpEntry(projectRoot) {
|
|
27
31
|
const { command, args } = resolveRewindCliInvocation(["mcp"]);
|
|
32
|
+
const absoluteRoot = path.resolve(projectRoot);
|
|
28
33
|
return {
|
|
29
34
|
command,
|
|
30
35
|
args,
|
|
31
|
-
env: { REWIND_PROJECT_ROOT:
|
|
36
|
+
env: { REWIND_PROJECT_ROOT: absoluteRoot },
|
|
32
37
|
};
|
|
33
38
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
export { isLegacySourceMcpEntry };
|
|
40
|
+
function sameProjectRoot(a, b) {
|
|
41
|
+
return path.resolve(a) === path.resolve(b);
|
|
42
|
+
}
|
|
43
|
+
function isStaleSourceRepoEntry(entry, packageRoot = getPackageRoot()) {
|
|
44
|
+
if (isLegacySourceMcpEntry(entry))
|
|
39
45
|
return true;
|
|
40
|
-
|
|
46
|
+
const root = entryProjectRoot(entry);
|
|
47
|
+
if (root && sameProjectRoot(root, packageRoot)) {
|
|
48
|
+
// Pinned to the REWIND package/source tree — unsafe for consumers
|
|
41
49
|
return true;
|
|
42
|
-
|
|
50
|
+
}
|
|
51
|
+
const joined = [entry.command ?? "", ...(entry.args ?? [])].join(" ");
|
|
52
|
+
if (joined.includes(packageRoot) && /src[/\\]cli\.ts/i.test(joined)) {
|
|
43
53
|
return true;
|
|
44
54
|
}
|
|
45
55
|
return false;
|
|
46
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Evidence that Cursor has actually loaded/used REWIND MCP for this project.
|
|
59
|
+
* Config presence alone is NOT connection.
|
|
60
|
+
*/
|
|
61
|
+
export async function observeCursorMcpConnection(projectRoot) {
|
|
62
|
+
try {
|
|
63
|
+
const txns = await listTransactions(projectRoot);
|
|
64
|
+
const recent = txns
|
|
65
|
+
.filter((t) => {
|
|
66
|
+
const client = String(t.actor?.client ?? "");
|
|
67
|
+
const source = String(t.source ?? "");
|
|
68
|
+
return (source === "MCP" &&
|
|
69
|
+
(/cursor/i.test(client) || /cursor-vscode/i.test(client)));
|
|
70
|
+
})
|
|
71
|
+
.sort((a, b) => String(b.createdAt).localeCompare(String(a.createdAt)));
|
|
72
|
+
if (recent.length > 0) {
|
|
73
|
+
const latest = recent[0];
|
|
74
|
+
return {
|
|
75
|
+
connected: true,
|
|
76
|
+
detail: `Observed MCP transaction ${latest?.id ?? "?"} via ${latest?.actor?.client ?? "cursor"}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
/* ledger may be empty / missing */
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
connected: false,
|
|
85
|
+
detail: "No Cursor MCP session evidence yet — restart/reload Cursor, then use a REWIND tool",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
47
88
|
export class CursorIntegration {
|
|
48
89
|
id = "cursor";
|
|
49
90
|
displayName = "Cursor";
|
|
@@ -54,6 +95,10 @@ export class CursorIntegration {
|
|
|
54
95
|
path.join(os.homedir(), "Library", "Application Support", "Cursor"),
|
|
55
96
|
"/Applications/Cursor.app",
|
|
56
97
|
];
|
|
98
|
+
// Honour test override
|
|
99
|
+
if (process.env.REWIND_CURSOR_DIR) {
|
|
100
|
+
return exists(process.env.REWIND_CURSOR_DIR);
|
|
101
|
+
}
|
|
57
102
|
for (const c of candidates) {
|
|
58
103
|
if (await exists(c))
|
|
59
104
|
return true;
|
|
@@ -61,53 +106,161 @@ export class CursorIntegration {
|
|
|
61
106
|
return false;
|
|
62
107
|
}
|
|
63
108
|
async getConfigPath() {
|
|
64
|
-
return
|
|
109
|
+
return getUserMcpConfigPath();
|
|
65
110
|
}
|
|
111
|
+
/** @deprecated Prefer user-level config; kept for cleanup of old installs */
|
|
66
112
|
projectMcpPath(projectRoot) {
|
|
67
|
-
return
|
|
113
|
+
return projectMcpConfigPath(projectRoot);
|
|
68
114
|
}
|
|
69
115
|
async readConfig() {
|
|
70
|
-
|
|
116
|
+
try {
|
|
117
|
+
const { config } = await readMcpConfig(getUserMcpConfigPath());
|
|
118
|
+
return config;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
71
123
|
}
|
|
72
124
|
async install(projectRoot) {
|
|
73
|
-
const
|
|
74
|
-
|
|
125
|
+
const abs = path.resolve(projectRoot);
|
|
126
|
+
const notes = [];
|
|
127
|
+
const legacyCleaned = [];
|
|
128
|
+
const userPath = getUserMcpConfigPath();
|
|
129
|
+
const registry = await loadProjectRegistry();
|
|
130
|
+
const serverName = allocateServerName(abs, registry.projects);
|
|
131
|
+
const entry = rewindMcpEntry(abs);
|
|
132
|
+
let backupPath = null;
|
|
133
|
+
let removedKeys = [];
|
|
134
|
+
let changed = false;
|
|
75
135
|
try {
|
|
76
|
-
|
|
136
|
+
const result = await mutateMcpConfig(userPath, (servers) => {
|
|
137
|
+
const removed = [];
|
|
138
|
+
const upserted = [];
|
|
139
|
+
// Clean legacy / colliding REWIND entries for this install
|
|
140
|
+
for (const [key, value] of Object.entries(servers)) {
|
|
141
|
+
if (!looksLikeRewindEntry(key, value))
|
|
142
|
+
continue;
|
|
143
|
+
const entryRoot = entryProjectRoot(value);
|
|
144
|
+
const stale = isStaleSourceRepoEntry(value);
|
|
145
|
+
const forThisProject = entryRoot
|
|
146
|
+
? sameProjectRoot(entryRoot, abs)
|
|
147
|
+
: key === "rewind" || key === serverName;
|
|
148
|
+
const duplicateName = key === "rewind" ||
|
|
149
|
+
(isRewindServerKey(key) && key !== serverName && forThisProject);
|
|
150
|
+
if (stale) {
|
|
151
|
+
delete servers[key];
|
|
152
|
+
removed.push(key);
|
|
153
|
+
legacyCleaned.push(`${key} (legacy/source-repo entry → ${entryRoot ?? "unknown root"})`);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (forThisProject && key !== serverName) {
|
|
157
|
+
// Migrate bare "rewind" or old name for this project
|
|
158
|
+
delete servers[key];
|
|
159
|
+
removed.push(key);
|
|
160
|
+
legacyCleaned.push(`${key} (migrated to ${serverName} for this project)`);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (key === serverName &&
|
|
164
|
+
entryRoot &&
|
|
165
|
+
!sameProjectRoot(entryRoot, abs)) {
|
|
166
|
+
// Should not happen with allocateServerName — treat as conflict
|
|
167
|
+
throw new McpConfigError(`MCP server name ${serverName} is already pinned to ${entryRoot}`);
|
|
168
|
+
}
|
|
169
|
+
void duplicateName;
|
|
170
|
+
}
|
|
171
|
+
const prev = JSON.stringify(servers[serverName] ?? null);
|
|
172
|
+
const next = JSON.stringify(entry);
|
|
173
|
+
if (prev !== next) {
|
|
174
|
+
servers[serverName] = entry;
|
|
175
|
+
upserted.push(serverName);
|
|
176
|
+
}
|
|
177
|
+
const didChange = removed.length > 0 || upserted.length > 0;
|
|
178
|
+
return { changed: didChange, removedKeys: removed, upsertedKeys: upserted };
|
|
179
|
+
});
|
|
180
|
+
changed = result.changed;
|
|
181
|
+
backupPath = result.backupPath;
|
|
182
|
+
removedKeys = result.removedKeys;
|
|
77
183
|
}
|
|
78
|
-
catch {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
184
|
+
catch (err) {
|
|
185
|
+
if (err instanceof McpConfigError)
|
|
186
|
+
throw err;
|
|
187
|
+
throw err;
|
|
188
|
+
}
|
|
189
|
+
if (legacyCleaned.length > 0) {
|
|
190
|
+
notes.push(`Cleaned legacy REWIND MCP entries: ${legacyCleaned.join("; ")}`);
|
|
191
|
+
}
|
|
192
|
+
if (backupPath) {
|
|
193
|
+
notes.push(`Backup written: ${backupPath}`);
|
|
194
|
+
}
|
|
195
|
+
// Clean project-level mcp.json rewind entries (discovered-but-disconnected trap)
|
|
196
|
+
let projectMcpCleaned = false;
|
|
197
|
+
const projectPath = projectMcpConfigPath(abs);
|
|
198
|
+
try {
|
|
199
|
+
const projectResult = await mutateMcpConfig(projectPath, (servers) => {
|
|
200
|
+
const removed = [];
|
|
201
|
+
for (const [key, value] of Object.entries(servers)) {
|
|
202
|
+
if (!looksLikeRewindEntry(key, value))
|
|
203
|
+
continue;
|
|
204
|
+
delete servers[key];
|
|
205
|
+
removed.push(key);
|
|
206
|
+
}
|
|
207
|
+
return { changed: removed.length > 0, removedKeys: removed };
|
|
208
|
+
});
|
|
209
|
+
if (projectResult.changed) {
|
|
210
|
+
projectMcpCleaned = true;
|
|
211
|
+
notes.push(`Removed project-level REWIND MCP entries from ${projectPath} ` +
|
|
212
|
+
`(user-level config is authoritative on this Cursor build)`);
|
|
213
|
+
if (projectResult.backupPath) {
|
|
214
|
+
notes.push(`Project MCP backup: ${projectResult.backupPath}`);
|
|
215
|
+
}
|
|
92
216
|
}
|
|
93
|
-
|
|
94
|
-
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
if (err instanceof McpConfigError) {
|
|
220
|
+
notes.push(`Project MCP config malformed — left untouched: ${err.message}`);
|
|
95
221
|
}
|
|
96
|
-
|
|
222
|
+
// Missing project mcp is fine
|
|
97
223
|
}
|
|
98
|
-
|
|
224
|
+
await upsertRegisteredProject(abs, {
|
|
225
|
+
serverName,
|
|
226
|
+
cursorIntegration: "needs_reload",
|
|
227
|
+
displayName: path.basename(abs),
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
path: userPath,
|
|
231
|
+
changed,
|
|
232
|
+
serverName,
|
|
233
|
+
backupPath,
|
|
234
|
+
removedKeys,
|
|
235
|
+
legacyCleaned,
|
|
236
|
+
projectMcpCleaned,
|
|
237
|
+
state: "needs_reload",
|
|
238
|
+
notes,
|
|
239
|
+
};
|
|
99
240
|
}
|
|
100
241
|
async validate(projectRoot) {
|
|
101
|
-
const
|
|
242
|
+
const abs = path.resolve(projectRoot);
|
|
243
|
+
const userPath = getUserMcpConfigPath();
|
|
102
244
|
try {
|
|
103
|
-
const
|
|
104
|
-
const
|
|
105
|
-
const
|
|
245
|
+
const { config } = await readMcpConfig(userPath);
|
|
246
|
+
const registered = await findRegisteredProject(abs);
|
|
247
|
+
const serverName = registered?.serverName ??
|
|
248
|
+
(await this.findServerNameForProject(abs, config.mcpServers ?? {}));
|
|
249
|
+
if (!serverName) {
|
|
250
|
+
return {
|
|
251
|
+
ok: false,
|
|
252
|
+
message: `No REWIND MCP entry for this project in ${userPath}`,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const rewind = config.mcpServers?.[serverName];
|
|
106
256
|
if (!rewind) {
|
|
107
|
-
return {
|
|
257
|
+
return {
|
|
258
|
+
ok: false,
|
|
259
|
+
message: `mcp.json missing server "${serverName}"`,
|
|
260
|
+
};
|
|
108
261
|
}
|
|
109
262
|
if (!rewind.command) {
|
|
110
|
-
return { ok: false, message: "
|
|
263
|
+
return { ok: false, message: "REWIND MCP entry missing command" };
|
|
111
264
|
}
|
|
112
265
|
if (isLegacySourceMcpEntry(rewind)) {
|
|
113
266
|
return {
|
|
@@ -117,65 +270,140 @@ export class CursorIntegration {
|
|
|
117
270
|
}
|
|
118
271
|
const args = rewind.args ?? [];
|
|
119
272
|
if (!args.includes("mcp")) {
|
|
120
|
-
return { ok: false, message: "
|
|
273
|
+
return { ok: false, message: "REWIND MCP entry missing mcp args" };
|
|
274
|
+
}
|
|
275
|
+
const root = entryProjectRoot(rewind);
|
|
276
|
+
if (!root || !sameProjectRoot(root, abs)) {
|
|
277
|
+
return {
|
|
278
|
+
ok: false,
|
|
279
|
+
message: `REWIND MCP entry root mismatch (expected ${abs}, got ${root ?? "none"})`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
// Guard against package-root leakage in command
|
|
283
|
+
const joined = [rewind.command, ...args].join(" ");
|
|
284
|
+
if (/tsx/i.test(joined) && /src[/\\]cli\.ts/i.test(joined)) {
|
|
285
|
+
return { ok: false, message: "Source-repo MCP command detected" };
|
|
121
286
|
}
|
|
122
287
|
return {
|
|
123
288
|
ok: true,
|
|
124
|
-
message: `Cursor MCP config valid
|
|
289
|
+
message: `Cursor MCP config valid: ${serverName} @ ${userPath}`,
|
|
125
290
|
};
|
|
126
291
|
}
|
|
127
292
|
catch (err) {
|
|
128
293
|
return {
|
|
129
294
|
ok: false,
|
|
130
|
-
message:
|
|
295
|
+
message: err instanceof Error ? err.message : `Cannot read MCP config: ${String(err)}`,
|
|
131
296
|
};
|
|
132
297
|
}
|
|
133
298
|
}
|
|
299
|
+
async findServerNameForProject(projectRoot, servers) {
|
|
300
|
+
const abs = path.resolve(projectRoot);
|
|
301
|
+
for (const [key, value] of Object.entries(servers)) {
|
|
302
|
+
if (!looksLikeRewindEntry(key, value))
|
|
303
|
+
continue;
|
|
304
|
+
const root = entryProjectRoot(value);
|
|
305
|
+
if (root && sameProjectRoot(root, abs))
|
|
306
|
+
return key;
|
|
307
|
+
}
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
134
310
|
async remove(projectRoot) {
|
|
135
|
-
const
|
|
311
|
+
const abs = path.resolve(projectRoot);
|
|
312
|
+
const userPath = getUserMcpConfigPath();
|
|
313
|
+
const registered = await findRegisteredProject(abs);
|
|
314
|
+
let removed = false;
|
|
315
|
+
let serverName = registered?.serverName;
|
|
136
316
|
try {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
317
|
+
const result = await mutateMcpConfig(userPath, (servers) => {
|
|
318
|
+
const removedKeys = [];
|
|
319
|
+
for (const [key, value] of Object.entries(servers)) {
|
|
320
|
+
if (!looksLikeRewindEntry(key, value))
|
|
321
|
+
continue;
|
|
322
|
+
const root = entryProjectRoot(value);
|
|
323
|
+
const match = (root && sameProjectRoot(root, abs)) ||
|
|
324
|
+
(registered && key === registered.serverName);
|
|
325
|
+
if (match) {
|
|
326
|
+
delete servers[key];
|
|
327
|
+
removedKeys.push(key);
|
|
328
|
+
serverName = key;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return { changed: removedKeys.length > 0, removedKeys };
|
|
332
|
+
});
|
|
333
|
+
removed = result.changed;
|
|
334
|
+
}
|
|
335
|
+
catch (err) {
|
|
336
|
+
if (err instanceof McpConfigError)
|
|
337
|
+
throw err;
|
|
338
|
+
// No user mcp file
|
|
339
|
+
}
|
|
340
|
+
// Also strip project-level if present
|
|
341
|
+
try {
|
|
342
|
+
await mutateMcpConfig(projectMcpConfigPath(abs), (servers) => {
|
|
343
|
+
const removedKeys = [];
|
|
344
|
+
for (const [key, value] of Object.entries(servers)) {
|
|
345
|
+
if (!looksLikeRewindEntry(key, value))
|
|
346
|
+
continue;
|
|
347
|
+
delete servers[key];
|
|
348
|
+
removedKeys.push(key);
|
|
349
|
+
}
|
|
350
|
+
return { changed: removedKeys.length > 0, removedKeys };
|
|
351
|
+
});
|
|
145
352
|
}
|
|
146
353
|
catch {
|
|
147
|
-
|
|
354
|
+
/* ignore */
|
|
355
|
+
}
|
|
356
|
+
await removeRegisteredProject(abs);
|
|
357
|
+
if (serverName) {
|
|
358
|
+
return { removed, path: userPath, serverName };
|
|
148
359
|
}
|
|
360
|
+
return { removed, path: userPath };
|
|
149
361
|
}
|
|
150
362
|
async status(projectRoot) {
|
|
363
|
+
const abs = path.resolve(projectRoot);
|
|
151
364
|
const detected = await this.detect();
|
|
152
|
-
const configPath =
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const v = await this.validate(projectRoot);
|
|
157
|
-
configured = v.ok;
|
|
158
|
-
}
|
|
365
|
+
const configPath = getUserMcpConfigPath();
|
|
366
|
+
const registered = await findRegisteredProject(abs);
|
|
367
|
+
const v = await this.validate(abs);
|
|
368
|
+
const configured = v.ok;
|
|
159
369
|
let status = "not_detected";
|
|
160
370
|
let message = "Cursor not detected on this machine";
|
|
371
|
+
let integrationState = "not_configured";
|
|
161
372
|
if (detected && !configured) {
|
|
162
373
|
status = "detected";
|
|
163
|
-
message =
|
|
374
|
+
message =
|
|
375
|
+
"Cursor detected — REWIND MCP not configured for this project (run: rewind setup)";
|
|
376
|
+
integrationState = "not_configured";
|
|
164
377
|
}
|
|
165
378
|
else if (detected && configured) {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
379
|
+
const obs = await observeCursorMcpConnection(abs);
|
|
380
|
+
if (obs.connected) {
|
|
381
|
+
status = "connected";
|
|
382
|
+
integrationState = "connected";
|
|
383
|
+
message =
|
|
384
|
+
`CURSOR — CONNECTED (${registered?.serverName ?? "rewind"}). ` +
|
|
385
|
+
`${obs.detail}. Native Cursor writes outside MCP are NOT mediated.`;
|
|
386
|
+
await markProjectIntegration(abs, "connected").catch(() => undefined);
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
status = "needs_reload";
|
|
390
|
+
integrationState = "needs_reload";
|
|
391
|
+
message =
|
|
392
|
+
`CURSOR — CONFIGURED (${registered?.serverName ?? "rewind"} @ ${configPath}). ` +
|
|
393
|
+
`NEEDS RELOAD: ${obs.detail}. ` +
|
|
394
|
+
`Native Cursor writes outside MCP are NOT mediated.`;
|
|
395
|
+
}
|
|
170
396
|
}
|
|
171
397
|
return {
|
|
172
398
|
id: this.id,
|
|
173
399
|
displayName: this.displayName,
|
|
174
400
|
detected,
|
|
175
401
|
status,
|
|
176
|
-
configPath:
|
|
402
|
+
configPath: configured || (await exists(configPath)) ? configPath : null,
|
|
177
403
|
message,
|
|
178
404
|
supported: true,
|
|
405
|
+
integrationState,
|
|
406
|
+
serverName: registered?.serverName ?? null,
|
|
179
407
|
};
|
|
180
408
|
}
|
|
181
409
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/clients/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/clients/types.ts"],"names":[],"mappings":"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"}
|