cursor adapter: do not default to read-only ask mode
This commit is contained in:
@@ -65,7 +65,7 @@ Core fields:
|
|||||||
- instructionsFilePath (string, optional): absolute path to a markdown instructions file prepended to the run prompt
|
- instructionsFilePath (string, optional): absolute path to a markdown instructions file prepended to the run prompt
|
||||||
- promptTemplate (string, optional): run prompt template
|
- promptTemplate (string, optional): run prompt template
|
||||||
- model (string, optional): Cursor model id (for example auto or gpt-5.3-codex)
|
- model (string, optional): Cursor model id (for example auto or gpt-5.3-codex)
|
||||||
- mode (string, optional): Cursor execution mode passed as --mode (plan|ask). Defaults to ask when omitted.
|
- mode (string, optional): Cursor execution mode passed as --mode (plan|ask). Leave unset for normal autonomous runs.
|
||||||
- command (string, optional): defaults to "agent"
|
- command (string, optional): defaults to "agent"
|
||||||
- extraArgs (string[], optional): additional CLI args
|
- extraArgs (string[], optional): additional CLI args
|
||||||
- env (object, optional): KEY=VALUE environment variables
|
- env (object, optional): KEY=VALUE environment variables
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ export async function execute(ctx: AdapterExecutionContext): Promise<AdapterExec
|
|||||||
);
|
);
|
||||||
const command = asString(config.command, "agent");
|
const command = asString(config.command, "agent");
|
||||||
const model = asString(config.model, DEFAULT_CURSOR_LOCAL_MODEL).trim();
|
const model = asString(config.model, DEFAULT_CURSOR_LOCAL_MODEL).trim();
|
||||||
const mode = normalizeMode(asString(config.mode, "ask"));
|
const mode = normalizeMode(asString(config.mode, ""));
|
||||||
|
|
||||||
const workspaceContext = parseObject(context.paperclipWorkspace);
|
const workspaceContext = parseObject(context.paperclipWorkspace);
|
||||||
const workspaceCwd = asString(workspaceContext.cwd, "");
|
const workspaceCwd = asString(workspaceContext.cwd, "");
|
||||||
|
|||||||
@@ -96,8 +96,8 @@ describe("cursor execute", () => {
|
|||||||
expect(result.errorMessage).toBeNull();
|
expect(result.errorMessage).toBeNull();
|
||||||
|
|
||||||
const capture = JSON.parse(await fs.readFile(capturePath, "utf8")) as CapturePayload;
|
const capture = JSON.parse(await fs.readFile(capturePath, "utf8")) as CapturePayload;
|
||||||
expect(capture.argv).toContain("--mode");
|
expect(capture.argv).not.toContain("--mode");
|
||||||
expect(capture.argv).toContain("ask");
|
expect(capture.argv).not.toContain("ask");
|
||||||
expect(capture.paperclipEnvKeys).toEqual(
|
expect(capture.paperclipEnvKeys).toEqual(
|
||||||
expect.arrayContaining([
|
expect.arrayContaining([
|
||||||
"PAPERCLIP_AGENT_ID",
|
"PAPERCLIP_AGENT_ID",
|
||||||
@@ -120,4 +120,62 @@ describe("cursor execute", () => {
|
|||||||
await fs.rm(root, { recursive: true, force: true });
|
await fs.rm(root, { recursive: true, force: true });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("passes --mode when explicitly configured", async () => {
|
||||||
|
const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-cursor-execute-mode-"));
|
||||||
|
const workspace = path.join(root, "workspace");
|
||||||
|
const commandPath = path.join(root, "agent");
|
||||||
|
const capturePath = path.join(root, "capture.json");
|
||||||
|
await fs.mkdir(workspace, { recursive: true });
|
||||||
|
await writeFakeCursorCommand(commandPath);
|
||||||
|
|
||||||
|
const previousHome = process.env.HOME;
|
||||||
|
process.env.HOME = root;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await execute({
|
||||||
|
runId: "run-2",
|
||||||
|
agent: {
|
||||||
|
id: "agent-1",
|
||||||
|
companyId: "company-1",
|
||||||
|
name: "Cursor Coder",
|
||||||
|
adapterType: "cursor",
|
||||||
|
adapterConfig: {},
|
||||||
|
},
|
||||||
|
runtime: {
|
||||||
|
sessionId: null,
|
||||||
|
sessionParams: null,
|
||||||
|
sessionDisplayId: null,
|
||||||
|
taskKey: null,
|
||||||
|
},
|
||||||
|
config: {
|
||||||
|
command: commandPath,
|
||||||
|
cwd: workspace,
|
||||||
|
model: "auto",
|
||||||
|
mode: "ask",
|
||||||
|
env: {
|
||||||
|
PAPERCLIP_TEST_CAPTURE_PATH: capturePath,
|
||||||
|
},
|
||||||
|
promptTemplate: "Follow the paperclip heartbeat.",
|
||||||
|
},
|
||||||
|
context: {},
|
||||||
|
authToken: "run-jwt-token",
|
||||||
|
onLog: async () => {},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.exitCode).toBe(0);
|
||||||
|
expect(result.errorMessage).toBeNull();
|
||||||
|
|
||||||
|
const capture = JSON.parse(await fs.readFile(capturePath, "utf8")) as CapturePayload;
|
||||||
|
expect(capture.argv).toContain("--mode");
|
||||||
|
expect(capture.argv).toContain("ask");
|
||||||
|
} finally {
|
||||||
|
if (previousHome === undefined) {
|
||||||
|
delete process.env.HOME;
|
||||||
|
} else {
|
||||||
|
process.env.HOME = previousHome;
|
||||||
|
}
|
||||||
|
await fs.rm(root, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user