All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Tool loop guard coarse fingerprint was too aggressive, blocking legitimate multi-file exploration ("3 attempts limit 2"). Coarse limit now 3x higher (6 vs 2).
- Tool loop guard no longer speculatively inflates counts from stripped conversation history.
- Plugin loading crash caused by OpenCode loader calling class constructors without
new. Entry point now isolated to single default export inplugin-entry.ts.
- MCP tool pass-through: unknown tools (e.g. Playwright via cursor-agent) are tracked instead of dropped, with toast notifications summarizing activity at response end.
PassThroughTrackerfor tracking forwarded tool calls and errors.ToastServicefor OpenCode TUI toast integration with graceful degradation.extractOpenAiToolCallnow returns structured result withactionfield (intercept/passthrough/skip).
- Removed stale implementation docs (
docs/implementation/).
- Tool loop guard now detects repeated successful
edit/writeloops (including coarse path-based repeats) while reducing false positives. - Schema-validation loop-guard history is now seeded from tool-call shapes even when tool result messages are missing/truncated.
- SSE streaming conversion now emits assistant text deltas from both partial and non-partial assistant events.
- Proxy port selection now probes for an actually-bindable port, avoiding reliance on incomplete
ss/lsofoutput.
- Plugin directory initialization now respects
XDG_CONFIG_HOME(createsopencode/pluginunder the configured XDG config home).
- README now uses
npm exec -- @rama_nigg/open-cursor ...examples to avoid PATH issues with global npm bin. - Removed README references to
open-cursor sync-modelsandopen-cursor status(useinstallto resync models).
- Clarified npm install instructions and removed “check npm view first” from README.
- CLI help output now matches the invoked binary name (
open-cursor).
- Prefer OpenCode
worktree(andOPENCODE_CURSOR_PROJECT_DIR) when selecting the Cursor workspace directory, avoiding writes being scoped to~/.config/opencodeon macOS. - Tool hook path resolution now prefers
context.worktreeand ignores OpenCode config-dircontext.directorywhen resolving relative paths.
- OpenCode-owned tool loop adapter for OpenAI-style
tool_callsresponses (src/proxy/tool-loop.ts) - Focused integration coverage for request-1/request-2 tool loop continuity (
tests/integration/opencode-loop.integration.test.ts) - CI test split scripts:
test:ci:unitandtest:ci:integration - GitHub Actions job summaries for unit and integration suites
- Packaging CLI entrypoint
open-cursorfor npm/global installs (src/cli/opencode-cursor.ts) - Model discovery parser utility for CLI install/sync workflows (
src/cli/model-discovery.ts)
- CI workflow split into separate
unitandintegrationjobs - Integration CI defaults to OpenCode-owned loop mode (
CURSOR_ACP_TOOL_LOOP_MODE=opencode) - npm package metadata now targets publish/install as
open-cursor - Build now emits CLI artifacts for package bins (
dist/opencode-cursor.js,dist/discover.js)
- Node proxy fallback after
EADDRINUSEnow recreates the server before dynamic port bind - Streaming termination guards prevent duplicate flush/output after intercepted tool call
- Auth unit tests now clean all candidate auth paths to avoid environment-dependent flakes
- Provider config generator no longer hardcodes a local filesystem npm path
- Added auth home-path override (
CURSOR_ACP_HOME_DIR) for deterministic auth path resolution in tests/automation - Added proxy reuse toggle (
CURSOR_ACP_REUSE_EXISTING_PROXY) to avoid accidentally attaching to unrelated local proxy servers
- New streaming module (
src/streaming/) with proper NDJSON parsing LineBufferutility for handling TCP chunk boundaries in streaming responsesDeltaTrackerfor deduplicating accumulated assistant textStreamToSseConverterfor OpenAI-compatible SSE formattingStreamToAiSdkPartsfor ai-sdk stream part generation- Thinking event support with
subtype: "delta"andsubtype: "completed" - Tool call streaming with
started,completed, andfailedstates - Integration tests for streaming pipeline validation
- New exports:
LineBuffer,parseStreamJsonLine,DeltaTracker,StreamToSseConverter,formatSseChunk,formatSseDone,StreamToAiSdkParts
- Streaming responses now arrive incrementally instead of buffering until completion
- Switched from
--output-format textto--output-format stream-json --stream-partial-output - Provider now properly handles
tool_callandthinkingevents - Plugin SSE output now correctly formats parsed events instead of raw bytes
- Assistant text deduplication prevents re-sending full accumulated content
SimpleCursorClient.executePromptStream()now yieldsStreamJsonEventobjects- Plugin Bun and Node.js streaming paths use new line buffer and SSE converter
- Provider direct-mode streaming uses new ai-sdk parts converter
Initial release with stdin-based prompt passing to fix E2BIG errors.