@burmese/cursor 3.1.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/LICENSE +21 -0
- package/dist/check-cursor.d.ts +2 -0
- package/dist/check-cursor.d.ts.map +1 -0
- package/dist/check-cursor.js +660 -0
- package/dist/check-cursor.js.map +1 -0
- package/dist/cursor-mcp.d.ts +29 -0
- package/dist/cursor-mcp.d.ts.map +1 -0
- package/dist/cursor-mcp.js +42 -0
- package/dist/cursor-mcp.js.map +1 -0
- package/dist/cursor-previews.d.ts +15 -0
- package/dist/cursor-previews.d.ts.map +1 -0
- package/dist/cursor-previews.js +133 -0
- package/dist/cursor-previews.js.map +1 -0
- package/dist/cursor-rules.d.ts +42 -0
- package/dist/cursor-rules.d.ts.map +1 -0
- package/dist/cursor-rules.js +294 -0
- package/dist/cursor-rules.js.map +1 -0
- package/dist/cursor-status.d.ts +37 -0
- package/dist/cursor-status.d.ts.map +1 -0
- package/dist/cursor-status.js +365 -0
- package/dist/cursor-status.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, closeSync, existsSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join, parse, resolve } from "node:path";
|
|
4
|
+
import { cursorMcpServerName, buildCursorMcpEntry, isValidPetId } from "./cursor-mcp.js";
|
|
5
|
+
export const maxCursorConfigBytes = 256 * 1024; // 256 KiB
|
|
6
|
+
export function classifyCursorMcpStatus(configResult, configPath, expected) {
|
|
7
|
+
if (!configResult.ok) {
|
|
8
|
+
const messages = {
|
|
9
|
+
parse: "Cursor MCP config is invalid JSON.",
|
|
10
|
+
size: "Cursor MCP config is too large.",
|
|
11
|
+
symlink: "Cursor MCP config path is a symlink.",
|
|
12
|
+
"not-regular": "Cursor MCP config is not a regular file.",
|
|
13
|
+
"unsafe-path": "Cursor MCP config path is unsafe.",
|
|
14
|
+
"invalid-schema": "Cursor MCP config has invalid schema.",
|
|
15
|
+
io: "Failed to read Cursor MCP config.",
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
status: configResult.reason === "io" ? "error" : "invalid",
|
|
19
|
+
message: messages[configResult.reason],
|
|
20
|
+
configPath,
|
|
21
|
+
canInstall: false,
|
|
22
|
+
canReplace: false,
|
|
23
|
+
canRemove: false,
|
|
24
|
+
redactedDetails: configResult.message,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const { config, exists } = configResult;
|
|
28
|
+
if (!exists) {
|
|
29
|
+
return {
|
|
30
|
+
status: "missing",
|
|
31
|
+
message: "Cursor MCP config does not exist.",
|
|
32
|
+
configPath,
|
|
33
|
+
canInstall: true,
|
|
34
|
+
canReplace: false,
|
|
35
|
+
canRemove: false,
|
|
36
|
+
previewEntry: buildCursorMcpEntry(expected),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const mcpServers = isRecord(config.mcpServers) ? config.mcpServers : undefined;
|
|
40
|
+
if (mcpServers === undefined || mcpServers[cursorMcpServerName] === undefined) {
|
|
41
|
+
return {
|
|
42
|
+
status: "missing",
|
|
43
|
+
message: "OpenPets MCP entry is not configured.",
|
|
44
|
+
configPath,
|
|
45
|
+
canInstall: true,
|
|
46
|
+
canReplace: false,
|
|
47
|
+
canRemove: false,
|
|
48
|
+
previewEntry: buildCursorMcpEntry(expected),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const openpetsEntry = mcpServers[cursorMcpServerName];
|
|
52
|
+
if (!isRecord(openpetsEntry)) {
|
|
53
|
+
return {
|
|
54
|
+
status: "conflict",
|
|
55
|
+
message: "Cursor MCP config has malformed openpets entry.",
|
|
56
|
+
configPath,
|
|
57
|
+
canInstall: false,
|
|
58
|
+
canReplace: true,
|
|
59
|
+
canRemove: false,
|
|
60
|
+
redactedDetails: "mcpServers.openpets is not an object",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const expectedEntry = buildCursorMcpEntry(expected);
|
|
64
|
+
if (isSameMcpEntry(openpetsEntry, expectedEntry)) {
|
|
65
|
+
return {
|
|
66
|
+
status: "installed",
|
|
67
|
+
message: "OpenPets MCP is installed and up to date.",
|
|
68
|
+
configPath,
|
|
69
|
+
canInstall: false,
|
|
70
|
+
canReplace: false,
|
|
71
|
+
canRemove: true,
|
|
72
|
+
previewEntry: expectedEntry,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (isManagedOpenPetsMcpEntry(openpetsEntry)) {
|
|
76
|
+
return {
|
|
77
|
+
status: "needs-update",
|
|
78
|
+
message: "OpenPets MCP needs update (version or pet differs).",
|
|
79
|
+
configPath,
|
|
80
|
+
canInstall: true,
|
|
81
|
+
canReplace: true,
|
|
82
|
+
canRemove: true,
|
|
83
|
+
previewEntry: expectedEntry,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
status: "conflict",
|
|
88
|
+
message: "Cursor MCP config has a non-OpenPets openpets entry.",
|
|
89
|
+
configPath,
|
|
90
|
+
canInstall: false,
|
|
91
|
+
canReplace: true,
|
|
92
|
+
canRemove: false,
|
|
93
|
+
redactedDetails: "Existing openpets entry is not managed by OpenPets",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function isManagedOpenPetsMcpEntry(value) {
|
|
97
|
+
if (!isRecord(value))
|
|
98
|
+
return false;
|
|
99
|
+
if (value.type !== "stdio")
|
|
100
|
+
return false;
|
|
101
|
+
if (typeof value.command !== "string")
|
|
102
|
+
return false;
|
|
103
|
+
if (!Array.isArray(value.args))
|
|
104
|
+
return false;
|
|
105
|
+
if (!value.args.every((arg) => typeof arg === "string"))
|
|
106
|
+
return false;
|
|
107
|
+
const args = value.args;
|
|
108
|
+
if (value.command === "npx") {
|
|
109
|
+
return isPublishedOpenPetsMcpArgs(args);
|
|
110
|
+
}
|
|
111
|
+
if (value.command === "node") {
|
|
112
|
+
return isNodeOpenPetsMcpArgs(args);
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
function isPublishedOpenPetsMcpArgs(args) {
|
|
117
|
+
if (args.length < 2)
|
|
118
|
+
return false;
|
|
119
|
+
if (args[0] !== "-y")
|
|
120
|
+
return false;
|
|
121
|
+
const packageArg = args[1];
|
|
122
|
+
if (typeof packageArg !== "string")
|
|
123
|
+
return false;
|
|
124
|
+
const match = packageArg.match(/^@(?:burmese|open-pets)\/mcp@(\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?(?:\+[A-Za-z0-9.-]+)?)$/);
|
|
125
|
+
if (!match)
|
|
126
|
+
return false;
|
|
127
|
+
const version = match[1];
|
|
128
|
+
if (!version)
|
|
129
|
+
return false;
|
|
130
|
+
return hasValidPetArgs(args.slice(2));
|
|
131
|
+
}
|
|
132
|
+
function isNodeOpenPetsMcpArgs(args) {
|
|
133
|
+
if (args.length < 1)
|
|
134
|
+
return false;
|
|
135
|
+
const scriptPath = args[0];
|
|
136
|
+
if (typeof scriptPath !== "string")
|
|
137
|
+
return false;
|
|
138
|
+
const isOpenPetsPath = /(?:^|[\\/])node_modules[\\/]@(?:burmese|open-pets)[\\/]mcp[\\/]dist[\\/]index\.js$/u.test(scriptPath) ||
|
|
139
|
+
/(?:^|[\\/])packages[\\/]mcp[\\/]dist[\\/]index\.js$/u.test(scriptPath);
|
|
140
|
+
if (!isOpenPetsPath)
|
|
141
|
+
return false;
|
|
142
|
+
return hasValidPetArgs(args.slice(1));
|
|
143
|
+
}
|
|
144
|
+
function hasValidPetArgs(args) {
|
|
145
|
+
if (args.length === 0)
|
|
146
|
+
return true;
|
|
147
|
+
if (args.length !== 2)
|
|
148
|
+
return false;
|
|
149
|
+
if (args[0] !== "--pet")
|
|
150
|
+
return false;
|
|
151
|
+
return isValidPetId(args[1] ?? "");
|
|
152
|
+
}
|
|
153
|
+
function isSameMcpEntry(value, expected) {
|
|
154
|
+
if (!isRecord(value))
|
|
155
|
+
return false;
|
|
156
|
+
if (value.type !== expected.type)
|
|
157
|
+
return false;
|
|
158
|
+
if (value.command !== expected.command)
|
|
159
|
+
return false;
|
|
160
|
+
if (!Array.isArray(value.args))
|
|
161
|
+
return false;
|
|
162
|
+
if (value.args.length !== expected.args.length)
|
|
163
|
+
return false;
|
|
164
|
+
return value.args.every((arg, index) => arg === expected.args[index]);
|
|
165
|
+
}
|
|
166
|
+
export function readCursorMcpConfig(configPath) {
|
|
167
|
+
try {
|
|
168
|
+
const parentSafety = assertSafeParentDirectory(dirname(configPath));
|
|
169
|
+
if (!parentSafety.ok)
|
|
170
|
+
return parentSafety;
|
|
171
|
+
const safety = assertSafeExistingConfigFile(configPath, true);
|
|
172
|
+
if (!safety.ok)
|
|
173
|
+
return safety;
|
|
174
|
+
if (!existsSync(configPath)) {
|
|
175
|
+
return { ok: true, config: {}, exists: false };
|
|
176
|
+
}
|
|
177
|
+
const content = readFileSync(configPath, "utf8");
|
|
178
|
+
const size = Buffer.byteLength(content, "utf8");
|
|
179
|
+
if (size > maxCursorConfigBytes) {
|
|
180
|
+
return { ok: false, message: "Config file exceeds 256 KiB limit.", reason: "size" };
|
|
181
|
+
}
|
|
182
|
+
if (content.trim() === "") {
|
|
183
|
+
return { ok: true, config: {}, exists: true };
|
|
184
|
+
}
|
|
185
|
+
const parsed = JSON.parse(content);
|
|
186
|
+
if (!isRecord(parsed)) {
|
|
187
|
+
return { ok: false, message: "Config must be a JSON object.", reason: "invalid-schema" };
|
|
188
|
+
}
|
|
189
|
+
if (parsed.mcpServers !== undefined && !isRecord(parsed.mcpServers)) {
|
|
190
|
+
return { ok: false, message: "mcpServers must be an object.", reason: "invalid-schema" };
|
|
191
|
+
}
|
|
192
|
+
return { ok: true, config: parsed, exists: true };
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (error instanceof SyntaxError) {
|
|
196
|
+
return { ok: false, message: `JSON parse error: ${error.message}`, reason: "parse" };
|
|
197
|
+
}
|
|
198
|
+
return { ok: false, message: `IO error: ${error instanceof Error ? error.message : String(error)}`, reason: "io" };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export function planCursorMcpInstall(configPath, options, allowReplace = false) {
|
|
202
|
+
const existing = readCursorMcpConfig(configPath);
|
|
203
|
+
if (!existing.ok)
|
|
204
|
+
return existing;
|
|
205
|
+
const status = classifyCursorMcpStatus(existing, configPath, options);
|
|
206
|
+
if (status.status === "invalid" || status.status === "error") {
|
|
207
|
+
return { ok: false, message: status.message, reason: "invalid-schema" };
|
|
208
|
+
}
|
|
209
|
+
if (status.status === "conflict" && !allowReplace) {
|
|
210
|
+
return { ok: false, message: "Cannot install: config has conflicting openpets entry. Use replace instead.", reason: "invalid-schema" };
|
|
211
|
+
}
|
|
212
|
+
if (status.status === "installed") {
|
|
213
|
+
return { ok: false, message: "Already installed.", reason: "invalid-schema" };
|
|
214
|
+
}
|
|
215
|
+
const newEntry = buildCursorMcpEntry(options);
|
|
216
|
+
const newConfig = { ...existing.config };
|
|
217
|
+
if (newConfig.mcpServers === undefined || !isRecord(newConfig.mcpServers)) {
|
|
218
|
+
newConfig.mcpServers = { [cursorMcpServerName]: newEntry };
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
newConfig.mcpServers = { ...newConfig.mcpServers, [cursorMcpServerName]: newEntry };
|
|
222
|
+
}
|
|
223
|
+
const content = JSON.stringify(newConfig, null, 2) + "\n";
|
|
224
|
+
return buildWritePlan(configPath, content);
|
|
225
|
+
}
|
|
226
|
+
export function planCursorMcpReplace(configPath, options) {
|
|
227
|
+
const existing = readCursorMcpConfig(configPath);
|
|
228
|
+
if (!existing.ok)
|
|
229
|
+
return existing;
|
|
230
|
+
const status = classifyCursorMcpStatus(existing, configPath, options);
|
|
231
|
+
if (status.status === "invalid" || status.status === "error") {
|
|
232
|
+
return { ok: false, message: status.message, reason: "invalid-schema" };
|
|
233
|
+
}
|
|
234
|
+
if (status.status === "missing") {
|
|
235
|
+
return { ok: false, message: "Cannot replace: no existing openpets entry. Use install instead.", reason: "invalid-schema" };
|
|
236
|
+
}
|
|
237
|
+
if (status.status === "installed") {
|
|
238
|
+
return { ok: false, message: "Cannot replace: OpenPets MCP entry is already installed.", reason: "invalid-schema" };
|
|
239
|
+
}
|
|
240
|
+
const newEntry = buildCursorMcpEntry(options);
|
|
241
|
+
const newConfig = { ...existing.config };
|
|
242
|
+
if (!isRecord(newConfig.mcpServers)) {
|
|
243
|
+
newConfig.mcpServers = { [cursorMcpServerName]: newEntry };
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
newConfig.mcpServers = { ...newConfig.mcpServers, [cursorMcpServerName]: newEntry };
|
|
247
|
+
}
|
|
248
|
+
const content = JSON.stringify(newConfig, null, 2) + "\n";
|
|
249
|
+
return buildWritePlan(configPath, content);
|
|
250
|
+
}
|
|
251
|
+
export function planCursorMcpRemove(configPath) {
|
|
252
|
+
const existing = readCursorMcpConfig(configPath);
|
|
253
|
+
if (!existing.ok)
|
|
254
|
+
return existing;
|
|
255
|
+
const mcpServers = isRecord(existing.config.mcpServers) ? existing.config.mcpServers : undefined;
|
|
256
|
+
if (mcpServers === undefined || mcpServers[cursorMcpServerName] === undefined) {
|
|
257
|
+
return { ok: false, message: "OpenPets MCP entry is not installed.", reason: "invalid-schema" };
|
|
258
|
+
}
|
|
259
|
+
if (!isManagedOpenPetsMcpEntry(mcpServers[cursorMcpServerName])) {
|
|
260
|
+
return { ok: false, message: "Cannot remove: existing openpets entry is not managed by OpenPets.", reason: "invalid-schema" };
|
|
261
|
+
}
|
|
262
|
+
const newConfig = { ...existing.config };
|
|
263
|
+
if (isRecord(newConfig.mcpServers)) {
|
|
264
|
+
const { [cursorMcpServerName]: _, ...remainingServers } = newConfig.mcpServers;
|
|
265
|
+
newConfig.mcpServers = remainingServers;
|
|
266
|
+
}
|
|
267
|
+
const content = JSON.stringify(newConfig, null, 2) + "\n";
|
|
268
|
+
return buildWritePlan(configPath, content);
|
|
269
|
+
}
|
|
270
|
+
function buildWritePlan(configPath, content) {
|
|
271
|
+
const parent = dirname(configPath);
|
|
272
|
+
const parentSafety = assertSafeParentDirectory(parent);
|
|
273
|
+
if (!parentSafety.ok)
|
|
274
|
+
return parentSafety;
|
|
275
|
+
const existing = assertSafeExistingConfigFile(configPath, true);
|
|
276
|
+
if (!existing.ok)
|
|
277
|
+
return existing;
|
|
278
|
+
const stamp = `${process.pid}-${Date.now()}-${randomUUID()}`;
|
|
279
|
+
const backupPath = existsSync(configPath) ? uniquePath(`${configPath}.openpets-backup-${stamp}.json`) : undefined;
|
|
280
|
+
const tempPath = uniquePath(join(parent, `.openpets-${stamp}.tmp`));
|
|
281
|
+
return { targetPath: configPath, backupPath, tempPath, content };
|
|
282
|
+
}
|
|
283
|
+
export function executeCursorMcpWrite(plan) {
|
|
284
|
+
const parent = dirname(plan.targetPath);
|
|
285
|
+
const parentSafety = assertSafeParentDirectory(parent);
|
|
286
|
+
if (!parentSafety.ok)
|
|
287
|
+
throw new Error(parentSafety.message);
|
|
288
|
+
const targetSafety = assertSafeExistingConfigFile(plan.targetPath, true);
|
|
289
|
+
if (!targetSafety.ok)
|
|
290
|
+
throw new Error(targetSafety.message);
|
|
291
|
+
try {
|
|
292
|
+
JSON.parse(plan.content);
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
throw new Error(`Invalid JSON content: ${error instanceof Error ? error.message : String(error)}`);
|
|
296
|
+
}
|
|
297
|
+
mkdirSync(parent, { recursive: true, mode: 0o700 });
|
|
298
|
+
if (plan.backupPath && existsSync(plan.targetPath)) {
|
|
299
|
+
const backupFd = openSync(plan.backupPath, "wx", 0o600);
|
|
300
|
+
try {
|
|
301
|
+
writeFileSync(backupFd, readFileSync(plan.targetPath));
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
closeSync(backupFd);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const fd = openSync(plan.tempPath, "wx", 0o600);
|
|
308
|
+
try {
|
|
309
|
+
writeFileSync(fd, plan.content, "utf8");
|
|
310
|
+
}
|
|
311
|
+
finally {
|
|
312
|
+
closeSync(fd);
|
|
313
|
+
}
|
|
314
|
+
renameSync(plan.tempPath, plan.targetPath);
|
|
315
|
+
try {
|
|
316
|
+
chmodSync(plan.targetPath, 0o600);
|
|
317
|
+
}
|
|
318
|
+
catch { /* best effort */ }
|
|
319
|
+
}
|
|
320
|
+
function assertSafeExistingConfigFile(path, allowMissing = false) {
|
|
321
|
+
const stat = lstatSync(path, { throwIfNoEntry: false });
|
|
322
|
+
if (!stat)
|
|
323
|
+
return allowMissing ? { ok: true } : { ok: false, message: "Config file does not exist.", reason: "io" };
|
|
324
|
+
if (stat.isSymbolicLink())
|
|
325
|
+
return { ok: false, message: "Config file is a symlink.", reason: "symlink" };
|
|
326
|
+
if (!stat.isFile())
|
|
327
|
+
return { ok: false, message: "Config file is not a regular file.", reason: "not-regular" };
|
|
328
|
+
if (stat.size > maxCursorConfigBytes)
|
|
329
|
+
return { ok: false, message: "Config file exceeds 256 KiB limit.", reason: "size" };
|
|
330
|
+
return { ok: true };
|
|
331
|
+
}
|
|
332
|
+
function assertSafeParentDirectory(path) {
|
|
333
|
+
if (path.split(/[\\/]+/u).includes("..")) {
|
|
334
|
+
return { ok: false, message: "Config parent path must not contain parent traversal segments.", reason: "unsafe-path" };
|
|
335
|
+
}
|
|
336
|
+
const absolutePath = resolve(path);
|
|
337
|
+
const root = parse(absolutePath).root;
|
|
338
|
+
const parts = absolutePath.slice(root.length).split(/[\\/]+/u).filter(Boolean);
|
|
339
|
+
let current = root;
|
|
340
|
+
for (const part of parts) {
|
|
341
|
+
current = join(current, part);
|
|
342
|
+
const stat = lstatSync(current, { throwIfNoEntry: false });
|
|
343
|
+
if (!stat)
|
|
344
|
+
break;
|
|
345
|
+
if (stat.isSymbolicLink())
|
|
346
|
+
return { ok: false, message: "Config parent must not contain symlink segments.", reason: "symlink" };
|
|
347
|
+
if (!stat.isDirectory())
|
|
348
|
+
return { ok: false, message: "Config parent path segment must be a directory.", reason: "unsafe-path" };
|
|
349
|
+
}
|
|
350
|
+
return { ok: true };
|
|
351
|
+
}
|
|
352
|
+
function uniquePath(path) {
|
|
353
|
+
if (!existsSync(path))
|
|
354
|
+
return path;
|
|
355
|
+
for (let index = 1; index < 1000; index += 1) {
|
|
356
|
+
const candidate = `${path}.${index}`;
|
|
357
|
+
if (!existsSync(candidate))
|
|
358
|
+
return candidate;
|
|
359
|
+
}
|
|
360
|
+
throw new Error("Unable to allocate unique temp path.");
|
|
361
|
+
}
|
|
362
|
+
function isRecord(value) {
|
|
363
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=cursor-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-status.js","sourceRoot":"","sources":["../src/cursor-status.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@burmese/cursor",
|
|
3
|
+
"version": "3.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/wannabeepolymath/pet-assistant.git",
|
|
8
|
+
"directory": "packages/cursor"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^25.6.2",
|
|
27
|
+
"typescript": "^6.0.3"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"test": "node dist/check-cursor.js",
|
|
31
|
+
"check": "pnpm typecheck && pnpm build && pnpm test",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"build": "tsc"
|
|
34
|
+
}
|
|
35
|
+
}
|