clawdex-mobile 5.1.3-internal.9 → 5.2.3
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 +28 -0
- package/README.md +6 -55
- package/bin/clawdex.js +2 -2
- package/docs/setup-and-operations.md +13 -100
- package/docs/troubleshooting.md +2 -71
- package/package.json +17 -6
- package/scripts/setup-secure-dev.sh +5 -79
- package/scripts/setup-wizard.sh +37 -87
- package/scripts/start-bridge-secure.js +9 -269
- package/services/cursor-app-server/README.md +39 -0
- package/services/cursor-app-server/dist/appServer.d.ts +52 -0
- package/services/cursor-app-server/dist/appServer.js +780 -0
- package/services/cursor-app-server/dist/appServer.js.map +1 -0
- package/services/cursor-app-server/dist/cursorWorkspace.d.ts +7 -0
- package/services/cursor-app-server/dist/cursorWorkspace.js +126 -0
- package/services/cursor-app-server/dist/cursorWorkspace.js.map +1 -0
- package/services/cursor-app-server/dist/index.d.ts +4 -0
- package/services/cursor-app-server/dist/index.js +4 -0
- package/services/cursor-app-server/dist/index.js.map +1 -0
- package/services/cursor-app-server/dist/input.d.ts +27 -0
- package/services/cursor-app-server/dist/input.js +143 -0
- package/services/cursor-app-server/dist/input.js.map +1 -0
- package/services/cursor-app-server/dist/jsonRpc.d.ts +15 -0
- package/services/cursor-app-server/dist/jsonRpc.js +93 -0
- package/services/cursor-app-server/dist/jsonRpc.js.map +1 -0
- package/services/cursor-app-server/dist/projection.d.ts +8 -0
- package/services/cursor-app-server/dist/projection.js +507 -0
- package/services/cursor-app-server/dist/projection.js.map +1 -0
- package/services/cursor-app-server/dist/sdkDriver.d.ts +50 -0
- package/services/cursor-app-server/dist/sdkDriver.js +166 -0
- package/services/cursor-app-server/dist/sdkDriver.js.map +1 -0
- package/services/cursor-app-server/dist/stdio.d.ts +2 -0
- package/services/cursor-app-server/dist/stdio.js +7 -0
- package/services/cursor-app-server/dist/stdio.js.map +1 -0
- package/services/cursor-app-server/dist/types.d.ts +218 -0
- package/services/cursor-app-server/dist/types.js +2 -0
- package/services/cursor-app-server/dist/types.js.map +1 -0
- package/services/cursor-app-server/package.json +43 -0
- package/services/rust-bridge/Cargo.lock +1 -1
- package/services/rust-bridge/Cargo.toml +1 -1
- package/services/rust-bridge/src/main.rs +1703 -353
- package/vendor/bridge-binaries/darwin-arm64/codex-rust-bridge +0 -0
- package/vendor/bridge-binaries/darwin-x64/codex-rust-bridge +0 -0
- package/vendor/bridge-binaries/linux-arm64/codex-rust-bridge +0 -0
- package/vendor/bridge-binaries/linux-armv7l/codex-rust-bridge +0 -0
- package/vendor/bridge-binaries/linux-x64/codex-rust-bridge +0 -0
- package/vendor/bridge-binaries/win32-x64/codex-rust-bridge.exe +0 -0
- package/scripts/codespaces-bootstrap.js +0 -297
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { Agent, Cursor, } from '@cursor/sdk';
|
|
2
|
+
export class CursorSdkDriver {
|
|
3
|
+
async createAgent(options) {
|
|
4
|
+
return wrapAgent(await Agent.create({
|
|
5
|
+
agentId: options.agentId,
|
|
6
|
+
apiKey: options.apiKey,
|
|
7
|
+
name: options.name,
|
|
8
|
+
model: options.model,
|
|
9
|
+
...buildLocalCursorAgentOptions({ cwd: options.cwd }),
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
async resumeAgent(agentId, options) {
|
|
13
|
+
return wrapAgent(await Agent.resume(agentId, {
|
|
14
|
+
apiKey: options.apiKey,
|
|
15
|
+
model: options.model,
|
|
16
|
+
...buildLocalCursorAgentOptions({
|
|
17
|
+
cwd: options.cwd,
|
|
18
|
+
...(options.storeCwd ? { storeCwd: options.storeCwd } : {}),
|
|
19
|
+
}),
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
async listAgents(options) {
|
|
23
|
+
const result = await Agent.list({
|
|
24
|
+
runtime: 'local',
|
|
25
|
+
cwd: options.cwd,
|
|
26
|
+
limit: options.limit,
|
|
27
|
+
cursor: options.cursor,
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
items: result.items.map(toAgentInfo),
|
|
31
|
+
nextCursor: result.nextCursor,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async getAgent(agentId, options) {
|
|
35
|
+
return toAgentInfo(await Agent.get(agentId, { cwd: options.cwd, apiKey: options.apiKey }));
|
|
36
|
+
}
|
|
37
|
+
async listMessages(agentId, options) {
|
|
38
|
+
return (await Agent.messages.list(agentId, {
|
|
39
|
+
runtime: 'local',
|
|
40
|
+
cwd: options.cwd,
|
|
41
|
+
limit: options.limit,
|
|
42
|
+
offset: options.offset,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
async listRuns(agentId, options) {
|
|
46
|
+
const result = await Agent.listRuns(agentId, {
|
|
47
|
+
runtime: 'local',
|
|
48
|
+
cwd: options.cwd,
|
|
49
|
+
limit: options.limit,
|
|
50
|
+
cursor: options.cursor,
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
items: result.items.map(toRunInfo),
|
|
54
|
+
nextCursor: result.nextCursor,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async listModels(options) {
|
|
58
|
+
return (await Cursor.models.list({ apiKey: options.apiKey })).map(toModelListItem);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function buildLocalCursorAgentOptions(options) {
|
|
62
|
+
return {
|
|
63
|
+
local: {
|
|
64
|
+
cwd: options.cwd,
|
|
65
|
+
},
|
|
66
|
+
platform: localCursorAgentPlatform(options.storeCwd ?? options.cwd),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function localCursorAgentPlatform(cwd) {
|
|
70
|
+
return {
|
|
71
|
+
workspaceRef: cwd,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function wrapAgent(agent) {
|
|
75
|
+
return {
|
|
76
|
+
agentId: agent.agentId,
|
|
77
|
+
get model() {
|
|
78
|
+
return agent.model;
|
|
79
|
+
},
|
|
80
|
+
send: async (message, options) => wrapRun(await agent.send(message, { model: options?.model })),
|
|
81
|
+
close: () => agent.close(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function wrapRun(run) {
|
|
85
|
+
return {
|
|
86
|
+
id: run.id,
|
|
87
|
+
agentId: run.agentId,
|
|
88
|
+
get status() {
|
|
89
|
+
return run.status;
|
|
90
|
+
},
|
|
91
|
+
stream: () => run.stream(),
|
|
92
|
+
wait: () => run.wait(),
|
|
93
|
+
conversation: () => run.conversation(),
|
|
94
|
+
cancel: () => run.cancel(),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function toAgentInfo(info) {
|
|
98
|
+
return {
|
|
99
|
+
agentId: info.agentId,
|
|
100
|
+
name: info.name,
|
|
101
|
+
summary: info.summary,
|
|
102
|
+
lastModified: info.lastModified,
|
|
103
|
+
createdAt: info.createdAt,
|
|
104
|
+
status: info.status,
|
|
105
|
+
runtime: info.runtime,
|
|
106
|
+
cwd: info.runtime === 'local' ? info.cwd : undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function toModelListItem(model) {
|
|
110
|
+
const contextWindow = modelDefaultContextWindow(model);
|
|
111
|
+
return {
|
|
112
|
+
id: model.id,
|
|
113
|
+
displayName: model.displayName,
|
|
114
|
+
description: model.description,
|
|
115
|
+
providerId: 'cursor',
|
|
116
|
+
providerName: 'Cursor',
|
|
117
|
+
contextWindow,
|
|
118
|
+
isDefault: model.variants?.some((variant) => variant.isDefault === true) ?? false,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function modelDefaultContextWindow(model) {
|
|
122
|
+
const defaultVariant = model.variants?.find((variant) => variant.isDefault === true) ??
|
|
123
|
+
(model.variants?.length === 1 ? model.variants[0] : undefined);
|
|
124
|
+
const variantContext = defaultVariant?.params.find((param) => param.id === 'context');
|
|
125
|
+
const parsedVariantContext = parseContextWindowValue(variantContext?.value);
|
|
126
|
+
if (parsedVariantContext) {
|
|
127
|
+
return parsedVariantContext;
|
|
128
|
+
}
|
|
129
|
+
const contextParameter = model.parameters?.find((parameter) => parameter.id === 'context');
|
|
130
|
+
const contextValues = new Set();
|
|
131
|
+
for (const value of contextParameter?.values ?? []) {
|
|
132
|
+
const parsed = parseContextWindowValue(value.value);
|
|
133
|
+
if (parsed) {
|
|
134
|
+
contextValues.add(parsed);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (contextValues.size === 1) {
|
|
138
|
+
return [...contextValues][0];
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
function parseContextWindowValue(value) {
|
|
143
|
+
const normalized = value?.trim().toLowerCase();
|
|
144
|
+
if (!normalized) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
const match = /^([0-9]+(?:\.[0-9]+)?)([km])?$/.exec(normalized);
|
|
148
|
+
if (!match) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
const numeric = Number(match[1]);
|
|
152
|
+
if (!Number.isFinite(numeric) || numeric <= 0) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
const multiplier = match[2] === 'm' ? 1_000_000 : match[2] === 'k' ? 1_000 : 1;
|
|
156
|
+
return Math.floor(numeric * multiplier);
|
|
157
|
+
}
|
|
158
|
+
function toRunInfo(run) {
|
|
159
|
+
return {
|
|
160
|
+
id: run.id,
|
|
161
|
+
status: run.status,
|
|
162
|
+
model: run.model,
|
|
163
|
+
createdAt: run.createdAt,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=sdkDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkDriver.js","sourceRoot":"","sources":["../src/sdkDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createCursorAppServerFromEnv } from './appServer.js';
|
|
3
|
+
import { JsonRpcStdioServer } from './jsonRpc.js';
|
|
4
|
+
const appServer = createCursorAppServerFromEnv();
|
|
5
|
+
const server = new JsonRpcStdioServer(appServer, process.stdin, process.stdout);
|
|
6
|
+
server.start();
|
|
7
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,SAAS,GAAG,4BAA4B,EAAE,CAAC;AACjD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhF,MAAM,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
export type CursorAppServerRuntime = 'local';
|
|
2
|
+
export type ThreadLifecycleStatus = 'idle' | 'running' | 'error' | 'complete';
|
|
3
|
+
export interface AppServerNotification {
|
|
4
|
+
method: string;
|
|
5
|
+
params: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface ModelSelection {
|
|
8
|
+
id: string;
|
|
9
|
+
params?: Array<{
|
|
10
|
+
id: string;
|
|
11
|
+
value: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export interface CursorModelListItem {
|
|
15
|
+
id: string;
|
|
16
|
+
displayName?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
providerId?: string;
|
|
19
|
+
providerName?: string;
|
|
20
|
+
contextWindow?: number;
|
|
21
|
+
isDefault?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface CursorAgentInfo {
|
|
24
|
+
agentId: string;
|
|
25
|
+
name: string;
|
|
26
|
+
summary: string;
|
|
27
|
+
lastModified: number;
|
|
28
|
+
createdAt?: number;
|
|
29
|
+
status?: 'running' | 'finished' | 'error';
|
|
30
|
+
runtime?: 'local' | 'cloud';
|
|
31
|
+
cwd?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CursorAgentMessage {
|
|
34
|
+
type: 'user' | 'assistant';
|
|
35
|
+
uuid: string;
|
|
36
|
+
agent_id: string;
|
|
37
|
+
message: unknown;
|
|
38
|
+
}
|
|
39
|
+
export type CursorRunStatus = 'running' | 'finished' | 'error' | 'cancelled';
|
|
40
|
+
export interface CursorRunResult {
|
|
41
|
+
id: string;
|
|
42
|
+
status: Exclude<CursorRunStatus, 'running'>;
|
|
43
|
+
result?: string;
|
|
44
|
+
durationMs?: number;
|
|
45
|
+
model?: ModelSelection;
|
|
46
|
+
git?: CursorRunGitInfo;
|
|
47
|
+
}
|
|
48
|
+
export interface CursorRunInfo {
|
|
49
|
+
id: string;
|
|
50
|
+
status: CursorRunStatus;
|
|
51
|
+
model?: ModelSelection;
|
|
52
|
+
createdAt?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface CursorRunGitBranchInfo {
|
|
55
|
+
repoUrl: string;
|
|
56
|
+
branch?: string;
|
|
57
|
+
prUrl?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface CursorRunGitInfo {
|
|
60
|
+
branches: CursorRunGitBranchInfo[];
|
|
61
|
+
}
|
|
62
|
+
export type CursorStreamMessage = {
|
|
63
|
+
type: 'assistant';
|
|
64
|
+
agent_id?: string;
|
|
65
|
+
run_id?: string;
|
|
66
|
+
message?: unknown;
|
|
67
|
+
} | {
|
|
68
|
+
type: 'thinking';
|
|
69
|
+
agent_id?: string;
|
|
70
|
+
run_id?: string;
|
|
71
|
+
text?: string;
|
|
72
|
+
} | {
|
|
73
|
+
type: 'tool_call';
|
|
74
|
+
agent_id?: string;
|
|
75
|
+
run_id?: string;
|
|
76
|
+
call_id?: string;
|
|
77
|
+
name?: string;
|
|
78
|
+
status?: string;
|
|
79
|
+
args?: unknown;
|
|
80
|
+
result?: unknown;
|
|
81
|
+
truncated?: {
|
|
82
|
+
args?: boolean;
|
|
83
|
+
result?: boolean;
|
|
84
|
+
};
|
|
85
|
+
} | {
|
|
86
|
+
type: 'status';
|
|
87
|
+
agent_id?: string;
|
|
88
|
+
run_id?: string;
|
|
89
|
+
status?: string;
|
|
90
|
+
} | {
|
|
91
|
+
type: 'task';
|
|
92
|
+
agent_id?: string;
|
|
93
|
+
run_id?: string;
|
|
94
|
+
text?: string;
|
|
95
|
+
status?: string;
|
|
96
|
+
};
|
|
97
|
+
export interface CursorRunHandle {
|
|
98
|
+
readonly id: string;
|
|
99
|
+
readonly agentId: string;
|
|
100
|
+
readonly status: CursorRunStatus;
|
|
101
|
+
stream(): AsyncGenerator<CursorStreamMessage, void>;
|
|
102
|
+
wait(): Promise<CursorRunResult>;
|
|
103
|
+
conversation(): Promise<unknown[]>;
|
|
104
|
+
cancel(): Promise<void>;
|
|
105
|
+
}
|
|
106
|
+
export interface CursorAgentHandle {
|
|
107
|
+
readonly agentId: string;
|
|
108
|
+
readonly model?: ModelSelection;
|
|
109
|
+
send(message: string | {
|
|
110
|
+
text: string;
|
|
111
|
+
images?: Array<{
|
|
112
|
+
data: string;
|
|
113
|
+
mimeType: string;
|
|
114
|
+
}>;
|
|
115
|
+
}, options?: {
|
|
116
|
+
model?: ModelSelection;
|
|
117
|
+
}): Promise<CursorRunHandle>;
|
|
118
|
+
close(): void;
|
|
119
|
+
}
|
|
120
|
+
export interface CursorDriver {
|
|
121
|
+
createAgent(options: {
|
|
122
|
+
agentId?: string;
|
|
123
|
+
cwd: string;
|
|
124
|
+
apiKey: string;
|
|
125
|
+
name?: string;
|
|
126
|
+
model?: ModelSelection;
|
|
127
|
+
}): Promise<CursorAgentHandle>;
|
|
128
|
+
resumeAgent(agentId: string, options: {
|
|
129
|
+
cwd: string;
|
|
130
|
+
storeCwd?: string;
|
|
131
|
+
apiKey: string;
|
|
132
|
+
model?: ModelSelection;
|
|
133
|
+
}): Promise<CursorAgentHandle>;
|
|
134
|
+
listAgents(options: {
|
|
135
|
+
cwd: string;
|
|
136
|
+
limit?: number;
|
|
137
|
+
cursor?: string;
|
|
138
|
+
}): Promise<{
|
|
139
|
+
items: CursorAgentInfo[];
|
|
140
|
+
nextCursor?: string;
|
|
141
|
+
}>;
|
|
142
|
+
getAgent(agentId: string, options: {
|
|
143
|
+
cwd: string;
|
|
144
|
+
apiKey?: string;
|
|
145
|
+
}): Promise<CursorAgentInfo>;
|
|
146
|
+
listMessages(agentId: string, options: {
|
|
147
|
+
cwd: string;
|
|
148
|
+
limit?: number;
|
|
149
|
+
offset?: number;
|
|
150
|
+
}): Promise<CursorAgentMessage[]>;
|
|
151
|
+
listRuns(agentId: string, options: {
|
|
152
|
+
cwd: string;
|
|
153
|
+
limit?: number;
|
|
154
|
+
cursor?: string;
|
|
155
|
+
}): Promise<{
|
|
156
|
+
items: CursorRunInfo[];
|
|
157
|
+
nextCursor?: string;
|
|
158
|
+
}>;
|
|
159
|
+
listModels(options: {
|
|
160
|
+
apiKey: string;
|
|
161
|
+
}): Promise<CursorModelListItem[]>;
|
|
162
|
+
}
|
|
163
|
+
export type ThreadContentEntry = {
|
|
164
|
+
type: 'text';
|
|
165
|
+
text: string;
|
|
166
|
+
} | {
|
|
167
|
+
type: 'localImage';
|
|
168
|
+
path: string;
|
|
169
|
+
} | {
|
|
170
|
+
type: 'image';
|
|
171
|
+
path?: string;
|
|
172
|
+
url?: string;
|
|
173
|
+
};
|
|
174
|
+
export interface ThreadItem {
|
|
175
|
+
type: 'userMessage' | 'agentMessage' | 'reasoning' | 'toolCall';
|
|
176
|
+
id: string;
|
|
177
|
+
content?: ThreadContentEntry[];
|
|
178
|
+
text?: string;
|
|
179
|
+
tool?: string;
|
|
180
|
+
status?: string;
|
|
181
|
+
args?: unknown;
|
|
182
|
+
result?: unknown;
|
|
183
|
+
truncated?: {
|
|
184
|
+
args?: boolean;
|
|
185
|
+
result?: boolean;
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export interface ThreadTurn {
|
|
189
|
+
id: string;
|
|
190
|
+
status: 'completed' | 'in_progress' | 'failed' | 'cancelled';
|
|
191
|
+
items: ThreadItem[];
|
|
192
|
+
error?: {
|
|
193
|
+
message: string;
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
export interface ThreadRecord {
|
|
197
|
+
id: string;
|
|
198
|
+
name: string | null;
|
|
199
|
+
title: string | null;
|
|
200
|
+
preview: string;
|
|
201
|
+
createdAt: number;
|
|
202
|
+
updatedAt: number;
|
|
203
|
+
status: {
|
|
204
|
+
type: ThreadLifecycleStatus;
|
|
205
|
+
};
|
|
206
|
+
cwd: string;
|
|
207
|
+
source: 'cursorSdk';
|
|
208
|
+
turns?: ThreadTurn[];
|
|
209
|
+
}
|
|
210
|
+
export interface CursorAppServerOptions {
|
|
211
|
+
runtime: CursorAppServerRuntime;
|
|
212
|
+
cwd?: string;
|
|
213
|
+
apiKey?: string;
|
|
214
|
+
defaultModel?: string;
|
|
215
|
+
driver?: CursorDriver;
|
|
216
|
+
cursorProjectsDir?: string;
|
|
217
|
+
now?: () => Date;
|
|
218
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@clawdex/cursor-app-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "App-server shaped JSON-RPC adapter for Cursor agents.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"cursor-app-server": "dist/stdio.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "tsx src/stdio.ts",
|
|
21
|
+
"start": "node dist/stdio.js",
|
|
22
|
+
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json && chmod +x dist/stdio.js",
|
|
23
|
+
"prepack": "npm run build",
|
|
24
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
25
|
+
"lint": "eslint src --ext .ts",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:watch": "vitest"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@cursor/sdk": "1.0.11",
|
|
31
|
+
"zod": "^3.25.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.19.15",
|
|
35
|
+
"@typescript-eslint/eslint-plugin": "^8.57.1",
|
|
36
|
+
"@typescript-eslint/parser": "^8.57.1",
|
|
37
|
+
"eslint": "^10.0.3",
|
|
38
|
+
"globals": "^16.5.0",
|
|
39
|
+
"tsx": "^4.20.6",
|
|
40
|
+
"typescript": "^5.9.2",
|
|
41
|
+
"vitest": "^4.1.0"
|
|
42
|
+
}
|
|
43
|
+
}
|