Repository navigation
From the 2026-10-01 comparison with Cursor's own CLI, SDK and Cloud Agents API (docs/COMPETITION-2026-10-01.md).
Changed
- The truth about headless edits. Cursor's headless docs: without
--force, changes are only proposed, not
applied. The README, the tool description and SECURITY.md say so; theagentmode row no longer promises "file edit"
by default.CURSOR_SANDBOX=enabled|disabled(operator environment) passes--sandbox <mode>so an auto-approved
agent can be confined; any other value ends the server at startup, by name. - Streaming. Both agent tools run
--output-format stream-json. Every event is parsed as it arrives
(src/stream.ts): the terminalresultis the run's result as before; a client that sent a progress token gets one
notifications/progressper event (the model at start, each completed tool call with its target, each assistant
message). A non-JSON line is kept as noise, never dropped silently. - A structured result.
cursor_agentandcursor_replypublish anoutputSchemaand return
structuredContent:result,status,is_error,session_id,request_id,model(what cursor-agent reported at
start),duration_ms,tool_calls,files_changed(file-tool write/edit/delete calls that reported success, each
once — a shell command's writes are not inspected),files_proposed(such calls without success: proposed without
--force, refused, failed),noise_lines(stdout lines that were not events) andstderr; the text keeps the answer
first, then a metadata line, the files changed and the files proposed (src/run-report.ts, shared by both tools).
Without aresultevent the last assistant message is the answer, the status isno-result-eventand the run is
an error — the raw transcript is never the answer. A result withnullfields, a multi-byte character split across
chunks, an observer that throws or a client that stopped listening never fail the run or the server. - The
cloudparameter is gone: it passed-c, which Cursor's parameter reference does not list and whose interactive
meaning (the composer picker) cannot run headless. A caller still sending it is not an error; the flag is simply not
passed. Cloud agents are a separate API (see the comparison).
Tests
test/stream.test.mjs: a fake cursor-agent emits the documented stream-json events; the report, the files changed,
the progress notifications and the parser's handling of a non-JSON line and of a result without a trailing newline.