Spaces:
Paused
Paused
| import { describe, expect, it } from "vitest"; | |
| import fs from "node:fs/promises"; | |
| import os from "node:os"; | |
| import path from "node:path"; | |
| import { testEnvironment } from "@paperclipai/adapter-cursor-local/server"; | |
| async function writeFakeAgentCommand(binDir: string, argsCapturePath: string): Promise<string> { | |
| const commandPath = path.join(binDir, "agent"); | |
| const script = `#!/usr/bin/env node | |
| const fs = require("node:fs"); | |
| const outPath = process.env.PAPERCLIP_TEST_ARGS_PATH; | |
| if (outPath) { | |
| fs.writeFileSync(outPath, JSON.stringify(process.argv.slice(2)), "utf8"); | |
| } | |
| console.log(JSON.stringify({ | |
| type: "assistant", | |
| message: { content: [{ type: "output_text", text: "hello" }] }, | |
| })); | |
| console.log(JSON.stringify({ | |
| type: "result", | |
| subtype: "success", | |
| result: "hello", | |
| })); | |
| `; | |
| await fs.writeFile(commandPath, script, "utf8"); | |
| await fs.chmod(commandPath, 0o755); | |
| return commandPath; | |
| } | |
| describe("cursor environment diagnostics", () => { | |
| it("creates a missing working directory when cwd is absolute", async () => { | |
| const cwd = path.join( | |
| os.tmpdir(), | |
| `paperclip-cursor-local-cwd-${Date.now()}-${Math.random().toString(16).slice(2)}`, | |
| "workspace", | |
| ); | |
| await fs.rm(path.dirname(cwd), { recursive: true, force: true }); | |
| const result = await testEnvironment({ | |
| companyId: "company-1", | |
| adapterType: "cursor", | |
| config: { | |
| command: process.execPath, | |
| cwd, | |
| }, | |
| }); | |
| expect(result.checks.some((check) => check.code === "cursor_cwd_valid")).toBe(true); | |
| expect(result.checks.some((check) => check.level === "error")).toBe(false); | |
| const stats = await fs.stat(cwd); | |
| expect(stats.isDirectory()).toBe(true); | |
| await fs.rm(path.dirname(cwd), { recursive: true, force: true }); | |
| }); | |
| it("adds --yolo to hello probe args by default", async () => { | |
| const root = path.join( | |
| os.tmpdir(), | |
| `paperclip-cursor-local-probe-${Date.now()}-${Math.random().toString(16).slice(2)}`, | |
| ); | |
| const binDir = path.join(root, "bin"); | |
| const cwd = path.join(root, "workspace"); | |
| const argsCapturePath = path.join(root, "args.json"); | |
| await fs.mkdir(binDir, { recursive: true }); | |
| await writeFakeAgentCommand(binDir, argsCapturePath); | |
| const result = await testEnvironment({ | |
| companyId: "company-1", | |
| adapterType: "cursor", | |
| config: { | |
| command: "agent", | |
| cwd, | |
| env: { | |
| CURSOR_API_KEY: "test-key", | |
| PAPERCLIP_TEST_ARGS_PATH: argsCapturePath, | |
| PATH: `${binDir}${path.delimiter}${process.env.PATH ?? ""}`, | |
| }, | |
| }, | |
| }); | |
| expect(result.status).toBe("pass"); | |
| const args = JSON.parse(await fs.readFile(argsCapturePath, "utf8")) as string[]; | |
| expect(args).toContain("--yolo"); | |
| await fs.rm(root, { recursive: true, force: true }); | |
| }); | |
| it("does not auto-add --yolo when extraArgs already bypass trust", async () => { | |
| const root = path.join( | |
| os.tmpdir(), | |
| `paperclip-cursor-local-probe-extra-${Date.now()}-${Math.random().toString(16).slice(2)}`, | |
| ); | |
| const binDir = path.join(root, "bin"); | |
| const cwd = path.join(root, "workspace"); | |
| const argsCapturePath = path.join(root, "args.json"); | |
| await fs.mkdir(binDir, { recursive: true }); | |
| await writeFakeAgentCommand(binDir, argsCapturePath); | |
| const result = await testEnvironment({ | |
| companyId: "company-1", | |
| adapterType: "cursor", | |
| config: { | |
| command: "agent", | |
| cwd, | |
| extraArgs: ["--yolo"], | |
| env: { | |
| CURSOR_API_KEY: "test-key", | |
| PAPERCLIP_TEST_ARGS_PATH: argsCapturePath, | |
| PATH: `${binDir}${path.delimiter}${process.env.PATH ?? ""}`, | |
| }, | |
| }, | |
| }); | |
| expect(result.status).toBe("pass"); | |
| const args = JSON.parse(await fs.readFile(argsCapturePath, "utf8")) as string[]; | |
| expect(args).toContain("--yolo"); | |
| expect(args).not.toContain("--trust"); | |
| await fs.rm(root, { recursive: true, force: true }); | |
| }); | |
| }); | |